【发布时间】: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 表单处理文件中服务器上的 &#x22; 变为 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 为例:您可以编写一个包含
<script>…</script>的问题/答案/评论,这不是问题,因为提交的文本已根据其用途进行了正确处理(即,在特殊字符正确获取的同时打印到 HTML 文档中)编码)。但是,通用 Web 应用程序防火墙会拒绝 HTTP 请求,因为它包含<script>…</script>。 -
Gumbo,我现在知道你的意思了,我认为我在处理数据时知道合法使用包含不安全字符但以编码形式,而非法使用可能包含未编码形式的不安全字符。我已经编辑了我的原始帖子以提供应该首先提供的信息。感谢您宝贵的 cmets。
-
我的意思是:Web 应用程序防火墙不知道数据是如何处理的,因此对所有数据一视同仁——导致许多误报。
标签: security mod-security