渗透测试步骤

(1)轮流在每个参数中提交一个恶意XML结束标签,如</foo>。如果没有发生错误,那么输入可能没有插入到SOAP消息中,或者以某种方式被净化了。

(2)如果出现错误,提交一对有效的起始与结束标签,如<foo></foo>。如果这对标签使错误消失,那么应用程序很可能易于受到攻击。

(3)有些时候,插入到XML格式消息中的数据随后以XML格式被读取并返回给用户。如果修改的数据项在应用程序的响应中返回,看看提交任意XML内容是否会以相同的形式返回,或者已通过某种方式被规范化。轮流提交下面两个值:

img307a

如果发现其中一个值的返回结果为另一个值,或者只返回test,那么可以确信输入被插入到了XML消息中。

(4)如果HTTP请求中包含几个可放入SOAP消息的参数,尝试在一个参数中插入起始注释字符<!--,在另一个参数中插入结束注释字符!-->。然后,轮换在参数中插入这两个字符(因为无法知道参数出现的顺序)。这样做可能会把服务器SOAP消息的某个部分作为注释处理,从而改变应用程序的逻辑,或者形成一个可能造成信息泄露的不同错误条件。

如果SOAP注入很难发现,就更难对其加以利用。许多时候,需要知道数据周围的XML的结构,以提交专门设计的输入,修改消息内容而不致破坏它的结构。在前面描述的所有测试中寻找任何揭示SOAP消息处理细节的错误消息。幸运的话,一条详细的错误消息将透露SOAP消息的完整内容,允许构建专门设计的值查找相关漏洞。如果不够幸运,就只能纯粹猜测,这样攻击成功的几率就非常低。

10.3.4 防止SOAP注入

我们可以在用户提交的数据被插入SOAP消息中的任何位置实施边界确认过滤,以防止SOAP注入。需要进行过滤的数据包括用户在当前请求中直接提交的数据,以及在前面的请求中已经存在或由以用户数据为输入的其他处理过程生成的数据。

为防止上述攻击,应用程序应对出现在用户输入中的任何XML元字符进行HTML编码。HTML编码包含用对应的HTML实体替代字面量字符。这样做可确保XML解释器在进行处理时,把它们当做相关元素的数据值,而不是消息结构的一部分。一些经常造成问题的字符的HTML编码如下:

img307b