$GET/$POST 中的“+having+”导致服务器 return 403 Forbidden

"+having+" in $GET/$POST causes server to return 403 Forbidden

我的一个客户有一个 PHP 脚本,该脚本一直莫名其妙地崩溃。经过数小时的研究,我确定您是否向任何 PHP 脚本发送一个包含“having t”的变量(通过 GET 或 POST),或者转义为 URL“+having+ t”,它使脚本崩溃并且 returns 出现“403 禁止错误”。为了测试它,我制作了一个包含全部内容的示例脚本:

<?php echo "works";

我把它(暂时)放在这里:http://primecarerefer.com/test/test.php

现在,如果您尝试向它发送一些数据,例如:http://primecarerefer.com/test/test.php?x=+having+x

失败了。最后一个字母可以是任何字母,它仍然会崩溃,但更改任何其他字母会使脚本加载正常。什么会导致这种情况,如何解决?如果有人想尝试不同的组合,link 现已上线。

PS - 我发现如果我连续多次收到 403 错误,服务器会阻止我 15 分钟。

我在 运行 apache mod_security 的网络服务器上遇到过此类问题,但它的配置非常糟糕,实际上 mod_security 的默认正则表达式规则非常糟糕,非常使用有效的 POST 或 GET 数据很容易跳闸。

需要说明的是,这与PHP或HTML无关,它是关于POST和GET数据通过mod_security,几乎可以肯定,并且mod_security 拒绝请求,因为它认为这是一次 sql 注入尝试。

您可以根据服务器访问权限自行编辑规则,但我不相信您可以做任何事情,好吧,如果是 mod_security,我知道您无法通过 [=55] 做任何事情=] 来解决这个问题。

/etc/httpd/conf.d/mod_security.conf(旧路径,已更改,但给出了思路)

默认规则示例:

SecFilter "delete[[:space:]]+from"
SecFilter "insert[[:space:]]+into"
SecFilter "select.+from"

这些是规则示例 https://www.howtoforge.com/apache_mod_security

这里他们过滤了过滤器:

http://primecarerefer.com/test/test.php?x=%20%22%20%20select%20from%22

请注意,这篇文章非常古老,现在规则的结构实际上大不相同,但错误的正则表达式仍然存在,即:select[任意数量的字符,无论删除或关闭多远] from 会触发它,任何符合这些松散规则的 sql 都会触发它。

但是由于编辑这些默认文件需要访问它们,并且假设它们在升级 apache mod_security 的某些时候不会被更改,所以这不是解决我发现的问题的好方法,转向更好、更专业的设置、托管服务商,为我们解决了这些问题。但是,如果您与托管支持人员交谈以了解问题的原因,它确实会有所帮助。

事实上 'having' 根本不是无关紧要的,它是 POST/GET 上安全过滤器 运行 正则表达式规则中 sql 注入过滤器的一部分。我们过去常常在管理员编辑 CMS 页面时点击这个,这将不可避免地触发一些 sql 过滤器,因为任何人类单词字符串总是包含 'select.*from' 或 'insert.*into' 等内容.

这个 mod_security 问题曾经让我发疯,试图调试为什么后端编辑表单更新会挂起,直到我最终意识到 mod_security 文件本身的通用正则表达式模式做得很糟糕。

从某种意义上说,这不是答案,因为唯一的解决办法是进入服务器并编辑规则文件,这很容易,或者禁用 mod_security,或者移动到网络不使用那些糟糕的通用默认值的主机。