删除或重复的非单词字符,如HTML文本区域中的换行符,这些字符会导致modsecurity中的错误

Removal or repetitive non-word characters like line breaks in a HTML textarea that cause errors in modsecurity

本文关键字:字符 换行符 错误 modsecurity HTML 单词 文本 删除 区域      更新时间:2023-09-26

我需要一些帮助来删除或重复的非单词字符,如HTML文本区域中的换行符,这些字符会导致modsecurity中的错误。我正在制作一个简单的HTML表单,其中有一个文本区域,访问者可以填写:

  Your question:<br>
  <textarea name="question" cols=100 rows=8></textarea>

接下来,我将使用gen_validatorv4.js来验证输入

frmvalidator.addValidation("question","maxlen=800", "Max length is 800 characters");

提交时的表单操作是一个脚本contact-form-handler.php,它执行以下操作:

$question = $_POST['question']; 

我的问题是,当客户输入多个换行符(Enter,Return)时,Modsecurity返回一个错误,即拒绝访问contact-form-handler.php:

Message: Access denied with code 403 (phase 2). Pattern match "''W{4,}" at ARGS:bericht. [file "/usr/share/modsecurity-crs/base_rules/modsecurity_crs_41_sql_injection_attacks.conf"] [line "155"] [id "960024"] [rev "2.2.5"] [msg "SQL Character Anomaly Detection Alert - Repetative Non-Word Characters"] [data "'x0d'x0a'x0d'x0a"]
Action: Intercepted (phase 2)
Apache-Handler: application/x-httpd-php
Stopwatch: 1414686989441629 117554 (- - -)
Stopwatch2: 1414686989441629 117554; combined=91683, p1=11515, p2=79432, p3=0, p4=0, p5=731, sr=815, sw=5, l=0, gc=0
Response-Body-Transformed: Dechunked
Producer: ModSecurity for Apache/2.6.6 (http://www.modsecurity.org/); OWASP_CRS/2.2.5.
Server: Apache/2.2.22 (Debian)

我尝试了第二个(伪)文本区域,它甚至没有在php脚本中处理,尽管如此,modsecurity阻止了对脚本的访问。删除多个换行符后,表单将成功处理并与msmtp一起发送。

与其减轻modsecurity规则(也不知道如何做到这一点),我更喜欢在php脚本处理HTML联系人表单之前删除该表单中的多个换行符(和空格)。我找到了一些使用以下javascript格式的指南:

txt = txt.replace(/('r'n|'n|'r)/gm," "); 

但我错过了将"问题"输入该命令,然后使其可用于php命令$question = $_POST['question']; 的知识

有人能帮忙吗?

不要尝试删除换行符。这是一个黑客攻击,并没有解决问题。为了解决这个问题,您需要对modsecurity owasp核心规则进行自定义更改。如果您不知道如何执行此操作,请与管理员联系。如果你想了解modsecurity购买https://www.feistyduck.com/books/modsecurity-handbook/

例如,以下是我们所做的操作-我们通过禁用规则,然后再次添加,将正则表达式从"''W{4,}"更改为"''W{6,}

SecRuleRemoveByID 960024
SecRule ARGS "'W{6,}" "phase:2,capture,t:none,t:utf8toUnicode,t:urlDecodeUni,block,id:'960024',rev:'2',ver:'OWASP_CRS/2.2.9',maturity:'9',accuracy:'8',msg:'Meta-Character Anomaly Detection Alert - Repetative Non-Word Characters',logdata:'Matched Data: %{TX.0} found within %{MATCHED_VAR_NAME}: %{MATCHED_VAR}',setvar:tx.anomaly_score=+%{tx.warning_anomaly_score},setvar:'tx.msg=%{rule.msg}',setvar:tx.%{rule.id}-OWASP_CRS/WEB_ATTACK/COMMAND_INJECTION-%{matched_var_name}=%{tx.0}"

但也许你想禁用这个特定URL的规则:

SecRule REQUEST_URI "@beginsWith /your/url/to/the/php/script" "phase:1,t:none,pass,id:'5000',nolog,ctl:ruleRemoveById=960024"

希望这能有所帮助,罗纳德

感谢您的回复。我听从了你的建议,创建了一个新文件modsecurity_crs_6o_customrules.conf,添加了SecRuleRemoveByID 960024,复制了原始SecRule ARGS"''W{4,}"。。。。。。。。。。。。从modsecuritycrs_41_sql_injection_attacks.conf转换为它,然后将4改为6。您的SecRule不起作用,可能是来自另一个规则集版本。

这适用于两个连续的换行符。对于连续三次中断,我将得到相同的旧错误403。所以我希望访问者在输入问题时注意他们的布局。