0

TL;DR - 我的服务器上的默认 ModSecurity 规则在尝试提交包含单词“from”的 PHP 表单字段时生成 500 内部服务器错误,因为它将其视为可能的 SQL 注入,即使我正在使用PDO 准备好的语句。不确定解决此问题的最佳方法。

当尝试提交一个包含“将电子邮件从 x 更改为 x”的文本区域的表单时,我收到 500 内部服务器错误,并且我已将其缩小为罪魁祸首。根据我在日志中看到的内容,似乎表单提交被视为可能的 SQL 注入。我禁用了这个特定的规则(300016)作为测试,表单开始正常工作。

从 Apache 错误日志:

[:error] [pid 39495] [client x.x.x.x] ModSecurity: Access denied with code 500 (phase 2). Pattern match "(insert[[:space:]]+into.+values|select.*from.+[a-z|A-Z|0-9]|select.+from|bulk[[:space:]]+insert|union.+select|convert.+\\\\(.*from)" at ARGS:notes. [file "/etc/apache2/conf.d/modsec/modsec2.user.conf"] [line "247"] [id "300016"] [rev "2"] [msg "Generic SQL injection protection"] [severity "CRITICAL"] [hostname "xxxxxxxxxx.com"] [uri "/path/to/page/with/form.php"] [unique_id "WiGVQoP7XCbNIjL9nZzrKAAAAAo"]

从 ModSecurity 审核日志:

Message: Access denied with code 500 (phase 2). Pattern match "(insert[[:space:]]+into.+values|select.*from.+[a-z|A-Z|0-9]|select.+from|bulk[[:space:]]+insert|union.+select|convert.+\\(.*from)" at ARGS:notes. [file "/etc/apache2/conf.d/modsec/modsec2.user.conf"] [line "247"] [id "300016"] [rev "2"] [msg "Generic SQL injection protection"] [severity "CRITICAL"]
Action: Intercepted (phase 2)
Stopwatch: 1512150338540293 2147 (- - -)
Stopwatch2: 1512150338540293 2147; combined=549, p1=96, p2=449, p3=0, p4=0, p5=3, sr=32, sw=1, l=0, gc=0
Producer: ModSecurity for Apache/2.9.0 (http://www.modsecurity.org/).
Server: Apache
Engine-Mode: "ENABLED"

ModSecurity 规则:

#Generic SQL sigs
SecRule REQUEST_URI "!(/node/[0-9]+/edit|/forum/posting\.php|/admins/wnedit\.php|/alt_doc\.php\?returnUrl=.*edit|/admin/categories\.php\?cPath=.*|modules\.php\?name=Forums&;file=posting&;mode=.*)" "chain,id:300016,t:lowercase,rev:2,severity:2,msg:'Generic SQL injection protection'"
SecRule ARGS "(insert[[:space:]]+into.+values|select.*from.+[a-z|A-Z|0-9]|select.+from|bulk[[:space:]]+insert|union.+select|convert.+\(.*from)"
  • ModSecurity 规则似乎有点限制,但是我宁愿不完全禁用它,因为它肯定有一些价值(我相信这个规则是在我的 WHM/cPanel 最近升级时自动实现的)
  • 我见过的解决方案之一是为我尝试访问的文件(或文件夹)禁用此特定规则,但这只能解决一个域的这一部分的问题,而我服务器上的其他用户仍然可以遇到这个问题
  • 产生错误的表单是使用 PDO 准备好的语句

我对 ModSecurity 不是很有经验,我真的不确定解决这个问题的最佳方法是什么,所以我想我会看看这里是否有人有任何建议。

PS - 由于表单在 ModSecurity 规则被禁用时有效,我认为表单本身不是问题,但以防万一......

形式

<form method="post">
    <textarea class="form-control" placeholder="Notes" name="notes" cols="40" rows="10" wrap="VIRTUAL">
    <input class="form-control" type="submit" name="Submit" value="Save Changes">
</form>

表格处理

$notes = $_POST['notes'];
$stmt = $pdo->prepare("
    UPDATE links
    SET notes = :notes
    WHERE id = :link_id");
$stmt->bindValue('notes', $notes, PDO::PARAM_LOB);
$stmt->bindValue('link_id', $link_id, PDO::PARAM_INT);
$stmt->execute();
4

1 回答 1

0

我今天遇到了这个错误,在调查期间,我注意到正则表达式错误或错误消息错误地报告

(insert[[:space:]]+into.+values|select.*from.+[a-z|A-Z|0-9]|select.+from|bulk[[:space:]]+insert|union.+select|convert.+\\\\(.*from)

正则表达式(第一个字符)中有一个额外的括号。

您始终可以将固定版本添加为自定义规则(同时仍禁用原始 300016 规则)并等到 Apache 修复它。

于 2018-08-14T06:10:20.280 回答