$GET/$POST 中的 "+have+" 导致服务器返回 403 Forbidden

Posted

技术标签:

【中文标题】$GET/$POST 中的 "+have+" 导致服务器返回 403 Forbidden【英文标题】:"+having+" in $GET/$POST causes server to return 403 Forbidden 【发布时间】:2016-01-04 03:39:18 【问题描述】:

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

<?php echo "works";

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

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

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

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

【问题讨论】:

你怎么知道它使脚本崩溃 并且 403 不是故意返回的? 听起来与 PHP 无关。我将检查 Web 服务器的错误日志以及可能存在的任何 URL 重写/访问控制规则 没有优点? htaccess 会阻止特殊字符吗? 仅供参考,“have” 周围的字符似乎大多无关紧要。如果我要冒险猜测匹配的正则表达式,那将是\bhaving\b.+ 它只发生在 PHP 文件上吗?可以试试 html 文件吗? 【参考方案1】:

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

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

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

/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 的升级中被更改,所以这不是解决我发现的问题的好方法,转向更好的,更专业的设置,主机,为我们解决了这些问题。但是,如果您与托管支持人员交谈以了解问题的原因,这确实会有所帮助。

事实上,“拥有”并非无关紧要,它是 POST/GET 上运行的安全过滤器中正则表达式规则中 sql 注入过滤器的一部分。当管理员编辑 CMS 页面时,我们经常遇到这种情况,这总是会触发一些 sql 过滤器,因为任何人类单词字符串都会包含诸如“select.*from”或“insert.*into”等内容。

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

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

【讨论】:

我已经尝试了一堆 SQL 关键字,到目前为止,没有其他任何错误。 我会看看是否能找到包含该数据的文件,但如前所述,由于此类问题以及许多其他问题,我们离开了该主机,所以我可能无法找到它。顺便说一句,我们的情况也是一样,只有一两个sql关键字,所以很难搞清楚。 primecarerefer.com/test/test.php?x=%20%22having%20zowder%22 我很好奇,你可以清楚地看到模式:空格加有加空格加任何字符。真正的问题是这个过滤器是通过 mod_security 运行的,还是他们创建的一些手动规则集。无论哪种方式,您都可能需要致电托管方了解。 primecarerefer.com/test/test.php?x=%20%22%20select%20zowder%22 是的,这显然是 mod_security,还有一个。我找不到安全过滤器规则的副本,但我认识到这一点,因为我将规则修复得不那么草率。看到 Apache 提供的默认设置如此糟糕,以至于大多数用户只会关闭它们而不是尝试修复它们,我真的很惊讶,这违背了目的。 primecarerefer.com/test/… 还有更多。 howtoforge.com/apache_mod_security 显示了一些使用的过滤器。这绝对是 mod_security。

以上是关于$GET/$POST 中的 "+have+" 导致服务器返回 403 Forbidden的主要内容,如果未能解决你的问题,请参考以下文章

Wordpress页面循环

从循环中完全排除粘帖

Java反射 getFields和getDeclaredFields的区别

Form表单中method="post/get'的区别

从WordPress的循环中排除粘性帖子

如何在不知道表单内控件名称的情况下获取表单中的 GET/POST 元素