【问题标题】:False positive mod_security Cross Site Scripting Attack due to content of submitted form由于提交表单的内容,误报 mod_security 跨站点脚本攻击
【发布时间】:2014-12-30 22:00:17
【问题描述】:

这有点类似于403 Forbidden Error, probably ModSecurity

我在网页上有一个表格,用于提交数学方程式和内容。合法使用时,这些字段将包含不安全字符 "、、&、' 和 ` 我用

转义了这些字符
 ", <, >, &, ' and `

在将表单从网页提交到 PHP 脚本之前,我正在使用上述 HTML 实体对不安全字符进行编码/转义。因此,即使这些字段合法地包含不安全字符,提交的表单也没有。在我的 PHP 脚本中,我首先检查了$_POST['formFieldData'];,如果它包含任何不安全的字符,那么我会立即默默地中止对整个帖子的处理。我的想法是在我的网页上合法使用表单不会包含任何不安全的字符。因此,如果有人使用针对我的 PHP 脚本的表单设置自己的页面,他们将无法向其发送不安全的字符。我只将数据写入浏览器屏幕,并使用编码的不安全字符 HTML 实体。

最初(几年前)当我设置表单时,原始数据(合法包含不安全字符)被发布到 PHP 脚本,并且在对不安全字符进行编码后回显到浏览器,然后通过电子邮件发送数据给我做进一步处理和储存。我收到了大量来自机器人或其他形式的诈骗/网络钓鱼/垃圾邮件。为了减少这些内容的数量并仍然允许合法的内容,我在我的网页上实施了编码并拒绝了包含不安全字符的传入帖子。一夜之间,这些的音量变为零。我必须补充一点,我还认为. : ; / \ @ 是不安全的,并对其进行了编码/转义,如果帖子以未编码的形式包含它们,则将其删除。

最近,即使进行了上述清理/转义,我也开始收到针对 XSS 过滤的误报 mod-security 旅行,这些旅行阻止了提交内容到达 php 文件进行处理。消息是“潜在的跨站点脚本攻击”

不幸的是,托管公司没有在用户日志文件中记录这些旅行,所有告诉我的是有旅行,他们给我发了规则

我已将规则粘贴在这篇文章的末尾,因为规则中有大量文字。

托管公司有两个建议:将规则列入白名单,使其不适用于我的网站。关闭 mod 安全性。如果可能的话,我宁愿不做其中之一。

在规则的末尾是代码t:htmlEntityDecode,这给了我这样的想法,即规则正在取消转义内容,因此打败了我的 html 转义。

我开始混淆我使用 Javascript 替换 .replace(/&#x/g, "x#&"); 转义的内容,例如 PHP 表单处理文件中服务器上的 " 变为 x#&22; 然后我用 $form_Data = str_replace("x#&", "", $form_Data);

这非常有效,即 mod-security 过滤器没有针对之前导致误报的内容触发。

这是一个 hack,但我认为我别无选择,只能做某种 hack。

下面详述的规则看起来像一个巨大的正则表达式加上一些指令来取消 HTMLentities、compressWhitespace 等。

如果知道这些过滤器的人可以就我可以用来在从网页发布表单内容之前对表单内容进行预处理以使其更能抵御误报的任何方法提供一些建议,我将非常感激。

提前致谢。

这条规则是:

Rule 340147: Generic XSS filter
SecRule ARGS|ARGS_NAMES|!ARGS:js_includes|!ARGS:/m1_source/|!ARGS:/geodir/|!ARGS:/banner_block/
|!ARGS:/introcopy/|!ARGS:eingabe|!ARGS:ausgabe|!ARGS:/previewdata/|!ARGS:/tracking_extra/
|!ARGS:/^groups/|!ARGS:video|!ARGS:/google_map/|!ARGS:/field_map/|!ARGS:/gacode/|!ARGS:code1
|!ARGS:ga_code|!ARGS:customized|!ARGS:code_analytics|!ARGS:uvod|!ARGS:/^field_video/|!ARGS:q
|!ARGS:/^textarea-video/|!ARGS:leirro|!ARGS:lomake|!ARGS:vastaus|!ARGS:/^texte$/|!ARGS:vraag
|!ARGS:qti_data|!ARGS:tracklist|!ARGS:i_google|!ARGS:code_area_text|!ARGS:/log_code/
|!ARGS:/^ADVERT_/|!ARGS:UserData|!ARGS:areas|!ARGS:templatecode|!ARGS:/prevObject/
|!ARGS:/replaceAll/|!ARGS:/insertBefore/|!ARGS:/insertAfter/|!ARGS:/prependTo/|!ARGS:/appendTo/
|!ARGS:/mapcode/|!ARGS:googleCode|!ARGS:/sidebar/|!ARGS:/ad_code/|!ARGS:/^recipient/
|!ARGS:optional_head|!ARGS:/^form/|!ARGS:/^var_value/|!ARGS:variable_data|!ARGS:/^instance/
|!ARGS:/customfield/|!ARGS:notice|!ARGS:/formcode/|!ARGS:/ajax/|!ARGS:all|!ARGS:allowedTags
|!ARGS:/google_analytics/|!ARGS:/widget/|!ARGS:ad_code|!ARGS:/keycaptcha_code/|!ARGS:/jscode/
|!ARGS:postcontents|!ARGS:/adsense/|!ARGS:video1|!ARGS:/updateAds/|!ARGS:map|!ARGS:gmapcode
|!ARGS:/^Sidebar/|!ARGS:/^wpTextbox/|!ARGS:paragrafo|!ARGS:/question/|!ARGS:/style/
|!ARGS:tracking_code|!ARGS:whats-new|!ARGS:analyticscode|!ARGS:top_news|!ARGS:data[config]
|!ARGS:fulltext|!ARGS:introtext|!ARGS:offertext|!ARGS:block|!ARGS:livezillacode|!ARGS:/embed/
|!ARGS:/desc/|!ARGS:/script/|!ARGS:/^p_process_chats/|!ARGS:obj_itop|!ARGS:/cms/
|!ARGS:eventDescription|!ARGS:/^product/|!ARGS:match_report|!ARGS:eip_value|!ARGS:/^usergroup/
|!ARGS:sendDescription|!ARGS:email_id|!ARGS:obj_itop|!ARGS:sml_prt_1|!ARGS:pay_inst_1
|!ARGS:/^jform/|!ARGS:phpcode|!ARGS:intro|!ARGS:Snippet|!ARGS:oid|!ARGS:Submit2|!ARGS:/^obj_/
|!ARGS:layout|!ARGS:pageset|!ARGS:contact_form_information|!ARGS:/^site_/|!ARGS:/^translations/
|!ARGS:create_tables|!ARGS:insertfile|!ARGS:video_credits|!ARGS:input[Desarrollo]|!ARGS:move2
|!ARGS:hoperation|!ARGS:login_form|!ARGS:/product_benefits/|!ARGS:/custom_code/|!ARGS:arg2
|!ARGS:resumoDetalhe|!ARGS:bbcode_tpl|!ARGS:Right_photo_1|!ARGS:embedVideo|!ARGS:/^K2ExtraField/
|!ARGS:mentorhelp|!ARGS:/submitcode/|!ARGS:beschrijving|!ARGS:custombannercode|!ARGS:bannercode
|!ARGS:privatecapacity|!ARGS:diz|!ARGS:FormLayout|!ARGS:/^fck/|!ARGS:parent_name
|!ARGS:/^code_tscript/|!ARGS:_qf_Group_next|!ARGS:project_company|!ARGS:categories_title
|!ARGS:antwoord|!ARGS:project_company|!ARGS:signature|!ARGS:paepdc|!ARGS:tpl_source
|!ARGS:teaser_js|!ARGS:/^autoDS/|!ARGS:FrmSide|!ARGS:mainKeywords|!ARGS:/VB_announce/
|!ARGS:guardar|!ARGS:/serendipity/|!ARGS:omschrijving|!ARGS:resolution|!ARGS:newyddionc
|!ARGS:bericht|!ARGS:property_copy|!ARGS:/^outpay/|!ARGS:bedrijfsprofiel|!ARGS:s_query
|!ARGS:finish_survey|!ARGS:photolater|!ARGS:ticket_response|!ARGS:/element/
|!ARGS:option[vbpclosedreason]|!ARGS:/introduction/|!ARGS:/contenido/|!ARGS:/sql/
|!ARGS:prefix|!ARGS:query|!ARGS:c_features|!ARGS:/tekst/|!ARGS:embeddump|!ARGS:other_clubs
|!ARGS:/^elm/|!ARGS:/^saes/|!ARGS:dlv_instructions|!ARGS:/^cymr/|!ARGS:_qf_Register_upload
|!ARGS:/^elm/|!ARGS:verbiage|!ARGS:news|!ARGS:/^wz/|!ARGS:tiny_vals|!ARGS:sSave|!ARGS:/article/
|!ARGS:/about/|!ARGS:/Summarize/|!ARGS:/^product_options/|!ARGS:/SiteStructure/|!ARGS:/anmerkung/
|!ARGS:/summary/|!ARGS:/edit/|!ARGS:reply|!ARGS:/story/|!ARGS:resource_box|!ARGS:navig
|!ARGS:preview__hidden|!ARGS:/page/|!ARGS:order|!ARGS:/post/|!ARGS:youtube|!ARGS:reply
|!ARGS:business|!ARGS:/homePage/|!ARGS:pagimenu_inhoud|!ARGS:/note/|!ARGS:Post|!ARGS:/^field_id/
|!ARGS:area|!ARGS:/detail/|!ARGS:/comment/|!ARGS:LongDesc|!ARGS:ta|!ARGS:Returnid|!ARGS:busymess
|!ARGS_NAMES:/^V\*/|!ARGS_NAMES:/^S\*/|!ARGS:/^quickrise_advertise/|!ARGS:rt_xformat
|!ARGS:/wysiwyg/|!ARGS:contingut|!ARGS:/^werg/|!ARGS:/body/|!ARGS:/css/|!ARGS:/^section/
|!ARGS:/msg/|!ARGS:t_cont|!ARGS:/^doc/|!ARGS:/xml/|!ARGS:tekst|!ARGS:formsubmit
|!ARGS:invoice_snapshot|!ARGS:submit|!ARGS:/html/|!ARGS:/content/|!ARGS:/footer/|!ARGS:/header/
|!ARGS:/footer/|!ARGS:/link/|!ARGS:text|!ARGS:txt|!ARGS:/refer/|!ARGS:/referrer/|!ARGS:/template/
|!ARGS:/ajax/ "(?:< ?script|(?:<|< ?/)(?:(?:java|vb)script|about|applet|activex|chrome)|
< ?/?i?frame|\%env)" \Potential Cross Site Scripting Attack'
"phase:2,deny,status:406,t:none,t:removeNulls,t:utf8toUnicode,t:urlDecodeUni,t:htmlEntityDecode,
t:jsdecode,t:cssdecode,t:replaceComments,t:compressWhitespace,t:lowercase,capture,id:340147,
rev:137,severity:2,msg:'Atomicorp.com WAF Rules: ,logdata:'%{TX.0}'"

【问题讨论】:

  • Web 应用程序防火墙不会使适当的上下文数据处理过时。但是,适当的上下文数据处理可以使 Web 应用程序防火墙过时。
  • 谢谢秋葵。我不知道您所说的“正确的上下文数据处理”是什么意思。如果您能详细说明,我将不胜感激。
  • 您不能平等对待所有数据,因为某些数据是否构成安全威胁取决于其处理方式。以 StackOverflow 为例:您可以编写一个包含&lt;script&gt;…&lt;/script&gt; 的问题/答案/评论,这不是问题,因为提交的文本已根据其用途进行了正确处理(即,在特殊字符正确获取的同时打印到 HTML 文档中)编码)。但是,通用 Web 应用程序防火墙会拒绝 HTTP 请求,因为它包含 &lt;script&gt;…&lt;/script&gt;。
  • Gumbo,我现在知道你的意思了,我认为我在处理数据时知道合法使用包含不安全字符但以编码形式,而非法使用可能包含未编码形式的不安全字符。我已经编辑了我的原始帖子以提供应该首先提供的信息。感谢您宝贵的 cmets。
  • 我的意思是:Web 应用程序防火墙不知道数据是如何处理的,因此对所有数据一视同仁——导致许多误报。

标签: security mod-security


【解决方案1】:

如果知道这些过滤器的人可以就我可以用来在从网页发布表单内容之前对表单内容进行预处理以使其更能抵御误报的任何方法提供一些建议,我将非常感激。

base64?

当合法使用时,字段将包含不安全字符"、&amp;lt;、&gt;、&amp;、' 和`

那么 mod_security 对您来说不是一个好的工具选择。 (我个人的观点是,像这样的输入过滤规则对任何人来说都不是一个好主意。)

这是一个 hack,但我认为我别无选择,只能做某种 hack。

有人在你身上强加 mod_security 吗?在任何情况下,通过隧道穿过它都会使其无效,因此(甚至比正常情况更多)是一种无可救药的浪费时间。

【讨论】:

  • Bobince,我今天尝试了 base64,如果我继续尝试通过 mod_security 破解我的方式,它似乎非常适合这项工作。我已经编辑了我的帖子,以提供更多关于我为什么在源代码中编码的信息。
  • Bobince,mod_security 并不是“强加”在我身上的。他们默默地实现了它,并且没有适当的机制来通知用户关于 mod_security 规则被触发“因为这样做可能会比帮助更多的障碍”他们甚至没有记录触发器。我只是偶然发现托管公司在没有通知客户的情况下拦截并放弃了合法提交。
  • Bobince,我的选择是关闭 mod_security 或保留它并进行预处理(在表单端编码),因此不会阻止字段中包含不安全字符的合法提交,但任何不安全的提交已发布数据中的字符被 mod_security 阻止。根据您的意见以及托管公司不向我提供反馈的事实,我认为最好关闭 mod_security。他们确实将这些触发器记录在自己的日志中,但不在客户看到的日志中。
  • 没有天生的“不安全”角色。您需要确保正确处理应用程序代码中的所有字符,并且无论您是否使用 mod_security,都需要这样做,因为 (a) 像 mod_security 这样的 WAF 不是无懈可击的,并且 (b) 您目前故意提供通过 WAF 的不受保护的隧道,确保结果与开始时一样安全。正确处理字符意味着,一方面,为您注入它们的任何上下文适当地转义它们,例如在写入 HTML 时将 &amp;lt; 替换为 &amp;lt;。
  • 停止垃圾邮件是另一个与输入过滤和输出转义无关的问题。一种常见的方法是实施速率限制 CAPTCHA,但这有明显的 UX 缺点。一系列其他技术旨在通过使表单以标准脚本不期望的不同方式表现来阻止愚蠢的机器人(例如蜜罐字段、JavaScript 验证、限时 CSRF 令牌)。参见例如stackoverflow.com/questions/2387496/…
猜你喜欢
  • 2015-04-01
  • 2020-06-12
  • 1970-01-01
  • 1970-01-01
  • 2011-05-19
  • 2018-10-27
  • 2017-11-06
  • 2011-09-07
  • 2021-06-04
相关资源
最近更新 更多