目录
一、注入SOAP
1.1、简述:
1、SOAP (简单对象访问协议)是一种使用XML格式封装数据、基于消息的通信技术。各种在不同操作系统和架构上运行的系统也使用它来共享信息和传递消息。它主要用在Web服务中,通过浏览器访问的Web应用程序常常使用SOAP在后端应用程序组件之间进行通信
由不同计算机执行单项任务以提高性能的大型企业应用程序经常使用SOAP。采用Web应用程序作为现有应用程序前端的情况也经常可以见到SOAP。应用程序通常使用SOAP在不同的组件之间通信,以确保模块性和互用性
2、由于XML是一种解释型语言, 因此SOAP也易于受到代码注入攻击。XML元素通过元字符< 、>、/以语法形式表示。如果用户提交的数据中包含这些字符,并被直接插入SOAP消息中, 攻击者就能够破坏消息的结构,进而破坏应用程序的逻辑或遭成其他不利影响
1.2、示例:
转账操作
1、POST提交HTTP请求进行转账(假设没有足够的转账金额)
2、处理请求的过程中,应用程序在两个后端组件之间传送SOAP消息
关键值:
<ClearedFunds>False</ClearedFunds>
将元素(ClearedFunds)的值设为False,因此收到SOAP消息的组件将拒绝转账。
3、通过各种方法注入SOAP消息. 从而破坏应用程序的逻耜
如:
A、在POST提交HTTP请求最初的元素之前插入一个CleacedFunds元素(同时保待SQL语法的有
效性)。如果应用程序处理它遇到的第一个CleacedFunds元素, 那么即使账户中没有资金, 也
可以成功进行转账B、使用XML注释完全删除原始SOAP消息中的一个元素, 并用攻击者自己设计的元素代替被删除的元素
C、尝试在一个注入的参数内完成整个SOAP消息并将消息的剩余部分注释掉。但由于没有结束注释与起始注释相匹配,这种攻击会生成完全错误的XML语法,从而被许多XML解析器拒绝。这种攻击并不能在所有XML解析库中起作用,它只对定制或自主研发的XML解析器奏效
二、查找并利用SOAP注入
2.1、过程:
1、轮流在每个参数中提交一个恶意XML结束标签, 如</foo>。如果没有发生错误, 那么输入可能没有插人到SOAP消息中, 或者以某种方式被过滤了
2、如果出现错误,提交一对有效的起始与结束标签, 如<foo></foo>。如果这对标签使错误消失, 那么应用程序很可能易于受到攻击
3、插入到XML格式消息中的数据随后以XML格式被读取并返回给用户。如果修改的数据项在应用程序的响应中返回, 看看提交任意XML内容是否会以相同的形式返回,或已通过某种方式被规范化。
测试:test</foo>和test<foo></foo>
如果发现其中一个值的返回结果为另一个值, 或只返回test, 那么可以确认输入被插入到了XML消息中
4、如果HTTP请求中包含几个可放入SOAP消息的参数,尝试在参数中插入起始注释字符<!--, 在另一个参数中插入结束注释字符!-->。然后,轮换在参数中插入这两个字符(因无法知道参数出现的顺序)。这样做可能会把服务器SOAP消息的某个部分作为注释处理, 从而改变应用程序的逻辑, 或形成一个可能造成信息泄露的不同错误条件
三、防止SOAP注入
3.1、简介:
可以在用户提交的数据被插入SOAP消息中的任何位置实施边界确认过滤,以防止SOAP注入。需要进行过滤的数据包括用户在当前请求中直接提交的数据,以及在前面的请求中已经存在或由以用户数据为输入的其他处理过程生成的数据。
为防止上述攻击, 应用程序应对出现在用户输入中的任何XML元字符进行HTML编码。HTML编码包含用对应的HTML实体替代字面量字符。这样做可确保XML解释器在进行处理时,把它们当做相关元素的数据值, 而不是消息结构的一部分。经常造成问题的字符的HTML编码:<(&1t)、>(>)、/(/)