标签: mod-security

mod_security 通过 http-host 头阻止请求

最近几天,我注意到一些服务器受到未知请求的影响。

他们中的大多数是这样的:

60.246.*.* - - [03/Jan/2015:20:59:16 +0200] "GET /announce.php?info_hash=%80%85%8e%9bu%cfJ.%85%82%e9%25%bf%8e%9e%d7%bf%c5%b0%12&peer_id=-UT3420-v%8bN%aa%60%60%fd%5d%d1%b0Ux&port=15411&uploaded=48588531&downloaded=0&left=0&corrupt=0&key=9E124668&numwant=200&compact=1&no_peer_id=1 HTTP/1.1" 200 -
Run Code Online (Sandbox Code Playgroud)

经过一些记录和搜索,我发现一些中国 ISP(根据 whatsmydns.net 的结果可能是 CERNET)和一些土耳其 ISP(可能是 TTNET)响应 dns 查询,例如a.tracker.thepiratebay.org使用与piratebay 无关的各种 IP或种子。换句话说,他们似乎出于某种奇怪的原因进行了某种 DNS 缓存中毒。

因此,这些国家/地区的数百个(如果不是数千个)bittorrent 客户端向我的网络服务器发出大量“通知”,这几乎导致 DDoS 攻击填满了 Apache 的所有连接。

目前,我完全阻止了中国和土耳其,它可以完成工作,但我想找到一种更好的方法来阻止这些请求。

我正在考虑使用基于 HTTP 主机标头的 mod_security 阻止这些请求。

所有这些请求都包含一个 HTTP Host 标头a.tracker.thepiratebay.org(或 thepiratebay.org 域的许多其他子域)。

这是通过 PHP$_SERVER变量的请求标头转储。

DOCUMENT_ROOT: /usr/local/apache/htdocs
GATEWAY_INTERFACE: CGI/1.1
HTTP_ACCEPT_ENCODING: gzip
HTTP_CONNECTION: Close
HTTP_HOST: a.tracker.thepiratebay.org
HTTP_USER_AGENT: uTorrent/342(109415286)(35702)
PATH: /bin:/usr/bin
QUERY_STRING: info_hash=%80%85%8e%9bu%cfJ.%85%82%e9%25%bf%8e%9e%d7%bf%c5%b0%12&peer_id=-UT3420-v%8bN%aa%60%60%fd%5d%d1%b0Ux&port=15411&uploaded=48588531&downloaded=0&left=0&corrupt=0&key=9E124668&numwant=200&compact=1&no_peer_id=1
REDIRECT_STATUS: 200
REMOTE_ADDR: 60.246.*.*
REMOTE_PORT: 3445
REQUEST_METHOD: GET
REQUEST_URI: /announce.php?info_hash=%80%85%8e%9bu%cfJ.%85%82%e9%25%bf%8e%9e%d7%bf%c5%b0%12&peer_id=-UT3420-v%8bN%aa%60%60%fd%5d%d1%b0Ux&port=15411&uploaded=48588531&downloaded=0&left=0&corrupt=0&key=9E124668&numwant=200&compact=1&no_peer_id=1
SCRIPT_FILENAME: /usr/local/apache/htdocs/announce.php
SCRIPT_NAME: …
Run Code Online (Sandbox Code Playgroud)

http bittorrent mod-security apache-2.2

16
推荐指数
4
解决办法
2万
查看次数

为特定目录禁用 modsecurity

如何仅针对特定目录禁用 modsecurity。我在 phpMyAdmin 中遇到错误,这是由基于规则的 modsecurity 跳闸引起的。我设置了以下文件:

# /etc/httpd/modsecurity.d/modsecurity_crs_15_customrules.conf
<LocationMatch "^/phpMA/">
    SecRuleEngine Off
</LocationMatch>

# /etc/httpd/modsecurity.d/modsecurity_crs_60.custom.conf
<LocationMatch '^/phpMA/*'>
    SecRuleRemoveById 950004
    SecRuleRemoveById 950005
    SecRuleRemoveById 950006
    SecRuleRemoveById 960010
    SecRuleRemoveById 960012
</LocationMatch>
Run Code Online (Sandbox Code Playgroud)

从我可以找到的第一个文件应该禁用它,但它仍然跳闸,所以我尝试添加它跳闸到 60 文件的规则 ID,但它仍然抱怨。

我在 CentOS 5.3 上运行以下软件包:

  • mod_security-2.5.0-jason.2
  • httpd-2.2.8-jason.3
  • mod-php5-apache2-zend-ce-5.2.10-65

httpd centos mod-security apache-2.2

12
推荐指数
2
解决办法
3万
查看次数

mod_security - 超出 PCRE 限制

几乎在每个请求中,我都会收到以下错误:

Rule execution error - PCRE limits exceeded (-8): (null).

经过一堆谷歌搜索后,唯一的解决方案似乎是

a) 在您的 httpd.conf 中添加以下内容

SecPcreMatchLimit 150000
SecPcreMatchLimitRecursion 150000
Run Code Online (Sandbox Code Playgroud)

b) 将以下内容添加到您的 php.ini

pcre.backtrack_limit = 10000000
pcre.recursion_limit = 10000000
Run Code Online (Sandbox Code Playgroud)

c) 使用使用-disable-pcre-match-limit选项编译的版本。


我正在运行以下内容:

Apache/2.5.12 ( http://www.modsecurity.org/ ) 的ModSecurity 。

Apache/2.2.16 (Debian) PHP/5.3.3-7+squeeze8 with Suhosin-Patch mod_ssl/2.2.16 OpenSSL/0.9.8

对于 ModSec 我的规则,我使用的是 OWASP ModSecurity 核心规则集项目版本 (CRS) 版本 2.2.3,这是本文发布时的最新版本。

我的 httpd.conf 主要包括:

<IfModule security2_module>
    SecUploadDir /var/asl/data/suspicious
    SecDataDir /var/asl/data/msa
    SecTmpDir /tmp
    SecAuditLogStorageDir /var/asl/data/audit

    Include modsecurity.d/modsecurity_crs_10_config.conf
    Include modsecurity.d/activated_rules/*.conf

    SecRuleEngine On

    # Debug log
    SecDebugLog /var/log/apache2/modsec_debug.log
    SecDebugLogLevel …
Run Code Online (Sandbox Code Playgroud)

mod-security pcre apache-2.2

12
推荐指数
1
解决办法
2万
查看次数

什么是 PCRE 限制?

在 ModSecurity 中有PCRE limits exceeded错误。

我知道我可以通过设置规则来解决这个问题,例如:

SecPcreMatchLimit 150000
SecPcreMatchLimitRecursion 150000
Run Code Online (Sandbox Code Playgroud)

但是,这些规则实际上在做什么?PCRE 限制递归设置为 150,000 是什么意思?通过将这些设置得如此高,我允许通过哪些安全漏洞?什么是recursionlimit是什么意思?

我知道有文档,但文档实际上并没有告诉我发生了什么,它只是告诉我如何使用指令。

regex mod-security pcre

11
推荐指数
1
解决办法
2万
查看次数

为什么 modsecurity 在 POST 请求中需要 Content-Length?

我有一个 RESTful Web 服务,它接受对没有实体主体的资源的 POST 请求,例如空的 POST 请求。默认的 modsecurity 配置要求所有 POST 请求都具有 Content-Length:

# Require Content-Length to be provided with every POST request
SecFilterSelective REQUEST_METHOD "^POST$" chain
SecFilterSelective HTTP_Content-Length "^$"
Run Code Online (Sandbox Code Playgroud)

modsecurity 控制台将此报告为 PROTOCOL_VIOLATION/EVASION。但是,在阅读HTTP/1.1 RFC 时,我不认为这是真的。允许服务器要求 Content-Length(返回 400 或 411),但我看不到任何内容表明服务器必须(或建议它应该)以这种方式运行。

这可能因浏览器而异,但在没有实体主体的情况下发出 POST 请求的 Flash 客户端不会发送请求标头。当你做'curl -XPOST ...'时也不会卷曲。由于这些原因,并且因为我认为 modsecurity 规则是对 HTTP 规范的误解,我正在考虑在我们的配置中取消对 POST 请求的 Content-Length 标头的要求。

有谁知道是否有特定的漏洞利用此规则来解决?大量的谷歌搜索,我只发现这是库存 modsecurity 配置的一部分。

http mod-security

7
推荐指数
1
解决办法
4645
查看次数

为什么 mod_security 需要 ACCEPT HTTP 标头字段?

经过一些调试,我发现 mod_security 的核心规则集会阻止没有(可选!)ACCEPT 标头字段的请求。

这是我在日志中找到的内容:

ModSecurity:警告。需要匹配“rx ^OPTIONS$”与“REQUEST_METHOD”。[文件“/etc/apache2/conf.d/modsecurity/modsecurity_crs_21_protocol_anomalies.conf”] [行“41”] [id“960015”] [msg“请求缺少接受头”] [严重性“关键”] [标签“ PROTOCOL_VIOLATION/MISSING_HEADER"] [主机名 "example.com"] [uri "/"] [unique_id "T4F5@H8AAQEAAFU6aPEAAAAL"]
ModSecurity:访问被拒绝,代码为 400(第 2 阶段)。需要匹配“rx ^OPTIONS$”与“REQUEST_METHOD”。[文件“/etc/apache2/conf.d/modsecurity/optional_rules/modsecurity_crs_21_protocol_anomalies.conf”] [行“41”] [id“960015”] [msg“请求缺少接受头”] [严重性“

为什么需要这个标题?我知道“大多数”客户发送这些,但为什么他们的缺席被视为安全威胁?

http mod-security apache-2.2

7
推荐指数
1
解决办法
1万
查看次数

测试 mod_security 是否真的有效

我第一次在我的登台服务器上运行它,我认为我做的一切都是正确的。当我针对它运行 nikto2 时,我可以在 modsec_audit.log 中看到条目,但在我的一生中,我无法手动使 mod_security 阻止任何内容。我已经将 SQL 放入 URL、表单等中,我刚刚得到了我们典型的用户友好的 HTML 404 页面,而不是来自 mod_security 的块,这应该是 403 错误或完全块。

我担心它只是检测而不是停止。我检查了我的配置,它肯定会阻止攻击,而不仅仅是检测它们。关于如何验证这件事实际上阻止攻击的任何想法?任何人都有测试 URL 或我可以做的事情来向我证明它确实有效?

mod-security

7
推荐指数
3
解决办法
3万
查看次数

如何让 mod_security 记录所有 POST 数据?

我目前有一个 CentOS 系统,它成功地将相关的 mod_security 操作记录到审计日志文件中。以下是我的配置:

<IfModule mod_security2.c>
  SecRuleEngine On
  SecAuditEngine RelevantOnly
  SecAuditLog /var/log/httpd/modsec_audit.log
  SecDebugLog /var/log/httpd/modsec_debug.log
  SecDebugLogLevel 0
  SecRequestBodyAccess On
  SecDataDir /tmp
  SecTmpDir /tmp
  SecPcreMatchLimit 250000
  SecPcreMatchLimitRecursion 250000
</IfModule>
Run Code Online (Sandbox Code Playgroud)

这会记录 mod_security 由于SecAuditEngine RelevantOnly设置而拦截/阻止请求的所有操作。

但是,我希望它另外记录提交到服务器的所有 POST 数据(无论状态如何)。我可以通过设置来实现这一点,SecAuditEngine On但这会记录所有的 GET 和 POST 数据,这太过分了。除非请求被拦截,否则我基本上想省略所有 GET 数据。

谁能建议如何做到这一点?

mod-security apache-2.2

7
推荐指数
1
解决办法
7383
查看次数

mod_security 的免费指南?

我看过官方网站的文档,找到起点有点困难。

对于从未处理过 mod_security 的人来说,是否有易于理解的免费综合指南?

security mod-security apache-2.2

6
推荐指数
1
解决办法
400
查看次数

SecAuditLogParts 不工作:mod_security 不断记录响应正文

我已将 modsecurity.conf 中的 SecAuditLogParts 设置为仅记录 ABFH,但 modsecurity 审计日志不断记录 -E- 部分(响应正文),这使得审计日志过大。

我该怎么做才能禁用响应正文日志记录?

mod-security

5
推荐指数
1
解决办法
798
查看次数

标签 统计

mod-security ×10

apache-2.2 ×6

http ×3

pcre ×2

bittorrent ×1

centos ×1

httpd ×1

regex ×1

security ×1