我在我的 Apache2 服务器上使用 mod security 作为 WAF。一切都工作得很好,就在我将更大的 json 数据发布到特殊路由时,WAF 将拒绝我的请求,因为正文太大 ->
SecRequestBodyLimit
。
我想将其限制在一个较低的水平,只是为了那条特殊的路线。我可以用什么来做到这一点?到目前为止,我在网络上找不到任何内容,只是排除某些规则的示例,但请求正文限制是没有规则的。
这非常棘手。标准方法是使用
SecRequestBodyLimit
设置一个宽硬限制,然后设置一个灵活的下限,该下限在运行时检查并根据 URI 拒绝大型请求。
问题是 ModSec 2.9.x JSON 正文处理器消耗请求正文。
REQUEST_BODY
变量在第 2 阶段不可用。因此,在运行时找出整个 JSON 有多大并不容易。您可以做的是检查第 1 阶段中的 Content-Length
HTTP 请求标头并接受该标头是否足够好。
这会产生如下规则集:
SecRequestBodyLimit 1000
SecRule REQUEST_FILENAME "@streq /path/with/large/json" \
"id:1000,phase:1,pass,log,\
msg:'URI with large JSON request encountered. Skipping size check',\
skipAfter:AFTER_SIZE_CHECK"
SecRule REQUEST_HEADERS:Content-Length "@gt 100" \
"id:1001,phase:1,deny,log,msg:'Request too large'"
SecMarker AFTER_SIZE_CHECK
根据您的需要调整数字,并在测试后从规则
log
中删除 1000
。
攻击者可以通过多种方式在不设置 Content-Length 标头的情况下提交更大的请求。我建议您使用 OWASP ModSecurity 核心规则集 (CRS)。它附带了防止这种情况发生的规则。