1

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

  1. 针对递归有效负载进行验证
  2. 针对超大有效负载进行验证

根据第一点,如果我xs:sequence在我的 XSD 架构中应用 a 是否经过验证,例如:

<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>

现在是第二点。如果我应用这样的正则表达式就足够了:

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

1 回答 1

2

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

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

针对超大有效载荷的验证:

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

<?xml version=”1.0” encoding=”UTF-8”?> xmlsoap.org/soap/envelope/”&gt; 
<soap:Envelope xmlns:soap=”http://schemas. xmlsoap.org/soap/envelope/”&gt; 
  <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>

或者

<?xml version=”1.0” encoding=”UTF-8”?> xmlsoap.org/soap/envelope/”&gt; 
<soap:Envelope xmlns:soap=”http://schemas. xmlsoap.org/soap/envelope/”&gt; 
   <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="1000" 而不是序列元素中的 maxOccurs="unbounded" 并限制标签内文本的长度。看看这个:http ://clawslab.nds.rub.de/wiki/index.php/Oversize_payload_attack

希望这可以帮助!

于 2014-06-20T07:27:16.997 回答