XML验证递归和超大有效负载

时间:2013-08-30 22:07:17

标签: xml validation ddos payload

OWASP网站发布了一系列有关如何保护RESTful服务的步骤。一点是XML DoS保护。现在我不确定以下两个。

  1. 针对递归有效负载的验证
  2. 验证超大有效载荷
  3. 根据第一点,如果我在我的XSD架构中应用xs:sequence,它是否有效:

    <xs:complexType name="addressType">
        <xs:sequence>
            <xs:element name="city" type="addressCity" />
            <xs:element name="number" type="addressNumber" />
            <xs:element name="street" type="addressStreet" />
            <xs:element name="zipCode" type="zipCodeMoreThan4Digits" />
        </xs:sequence>
        <xs:attribute name="id" type="unsignedInteger" use="required">
        </xs:attribute>
    </xs:complexType>
    

    现在第二点。如果我应用这样的RegEx就足够了:

    <xs:simpleType name="addressCity">
        <xs:restriction base="xs:string">
            <xs:pattern value="[a-zA-ZöäüÖÄÜß -]{2,32}" />
        </xs:restriction>
    </xs:simpleType>
    

1 个答案:

答案 0 :(得分:1)

针对递归有效负载的验证:

XML可以嵌套,无限次。具有深层嵌套标记的XML仍然可以很好地形成,因此解析器将接受它。如果您的解析器是DOM解析器(很可能),它将尝试在内存中构建整个树。如果您的Web服务收到的XML是深度嵌套的,那么您的服务器将耗尽其所有内存并崩溃,然后才能意识到xml消息无效 - &gt; DoS是成功的。 这里的解决方案是尝试在将MXL消息传输到Web服务服务器之前对其进行验证。您可以使用应用程序层网关实现此目的,该网关将XML消息验证为XSD架构。该模式应该只允许所需的嵌套深度。您需要在不构建DOM树的情况下进行此验证,否则最终会遇到相同的问题。

验证超大有效负载:

这里我们有类似的攻击类型。 XML的大小会影响DOM解析器的内存消耗。如果在序列中放入许多元素,或者只是将一个元素的文本设置得太长,则可以使XML更大。

<?xml version=”1.0” encoding=”UTF-8”?> xmlsoap.org/soap/envelope/”> 
<soap:Envelope xmlns:soap=”http://schemas. xmlsoap.org/soap/envelope/”> 
  <soap:Body> 
    <oversize> 
      <item1>x</item1>
      <item1>x</item1>
      <item1>x</item1>
      <!-- The element <item1> may continue on, until the SOAP message reaches a size of megabytes or even gigabytes --> 
    </oversize> 
  </soap:Body> 
</soap:Envelope>

OR

<?xml version=”1.0” encoding=”UTF-8”?> xmlsoap.org/soap/envelope/”> 
<soap:Envelope xmlns:soap=”http://schemas. xmlsoap.org/soap/envelope/”> 
   <soap:Header> 
    <!-- Arbitrary function call -->
  </soap:Header>

  <soap:oversize> 
    <item1>x</item1>
    <item1>x</item1>
    <item1>x</item1>
    <!-- The element <item1> may continue on, until the SOAP message reaches a size of megabytes or even gigabytes --> 
  </soap:oversize> 

  <soap:Body> 
     <!-- Arbitrary function call -->
  </soap:Body> 
</soap:Envelope>

这里的解决方案是使用例如。 maxOccurs的=&#34; 1000&#34;而不是maxOccurs =&#34;无界&#34;在序列元素和限制标签内的文本长度。看看这个:http://clawslab.nds.rub.de/wiki/index.php/Oversize_payload_attack

希望这有帮助!