PHP China | 中国开源之路 's Archiver

dzjzmj 发表于 2007-1-2 16:33

PHP和XSS跨站攻击

[font=宋体][size=4]其实这个话题很早就想说说了,发现国内不少[/size][/font][font="][size=4]PHP[/size][/font][font=宋体][size=4]站点都有[/size][/font][font="][size=4]XSS[/size][/font][font=宋体][size=4]漏洞。今天偶然看到[/size][/font][font="][size=4]PHP5[/size][/font][font=宋体][size=4]的[/size][/font][font="][size=4][url=http://www.hardened-php.net/advisory_012006.112.html][font=宋体]一个[/font]XSS[font=宋体]漏洞[/font][/url][/size][/font][font=宋体][size=4],在此小结一下。顺便提醒,使用[/size][/font][font="][size=4]PHP5[/size][/font][font=宋体][size=4]的朋友最好打下补丁,或者升级一下。[/size][/font][font=宋体][size=4]如果你不懂什么是[/size][/font][font="][size=4]XSS[/size][/font][font=宋体][size=4],可以看[/size][/font][font="][size=4][url=http://ha.ckers.org/xss.html][font=宋体]这里[/font][/url][/size][/font][font=宋体][size=4],或者[/size][/font][font="][size=4][url=http://soft.yesky.com/security/hkjj/136/2233136.shtml][font=宋体]这里[/font][/url][/size][/font][font=宋体][size=4](中文的也许会好懂一些)。[/size][/font][font=宋体][size=4]国内不少论坛都存在跨站脚本漏洞,例如[/size][/font][font="][size=4][url=http://www.discuz.net/viewthread.php?tid=223917&extra=page%3D1][font=宋体]这里[/font][/url][/size][/font][font=宋体][size=4]有一个[/size][/font][font="][size=4]Google Hack+XSS[/size][/font][font=宋体][size=4]的攻击例子,针对的是[/size][/font][font="][size=4]Discuz4.0.0RC3[/size][/font][font=宋体][size=4]。国外也很多这样的例子,甚至[/size][/font][font="][size=4]Google[/size][/font][font=宋体][size=4]也出现过,不过在[/size][/font][font="][size=4]12[/size][/font][font=宋体][size=4]月初时修正了。跨站攻击很容易就可以构造,而且非常隐蔽,不易被查觉(通常盗取信息后马上跳转回原页面)。[/size][/font][size=4][b][font=宋体]如何攻击,在此不作说明[/font][/b][/size][font=宋体][size=4](也不要问我[/size][/font][font="][size=4][img=19,19]http://file:///C:/DOCUME%7E1/new/LOCALS%7E1/Temp/msohtmlclip1/01/clip_image001.gif[/img][/size][/font][font=宋体][size=4]),主要谈谈如何防范。首先,跨站脚本攻击都是由于对用户的输入没有进行严格的过滤造成的,所以我们必须在所有数据进入我们的网站和数据库之前把可能的危险拦截。针对非法的[/size][/font][font="][size=4]HTML[/size][/font][font=宋体][size=4]代码包括单双引号等,可以使用[/size][/font][font="][size=4]htmlentities() [/size][/font][font=宋体][size=4]。[/size][/font]

[[i] 本帖最后由 dzjzmj 于 2007-1-2 16:35 编辑 [/i]]

dzjzmj 发表于 2007-1-2 16:33

[size=9pt]<?php[/size][size=9pt]$str [/size][size=9pt]= [/size][size=9pt]"A 'quote' is<b>bold</b>"[/size][size=9pt];[/size][size=9pt]// Outputs:A 'quote' is <b>bold</b>[/size][size=9pt]echo [/size][size=9pt]htmlentities[/size][size=9pt]([/size][size=9pt]$str[/size][size=9pt]);[/size][size=9pt]// Outputs:A 'quote' is <b>bold</b>[/size][size=9pt]echo [/size][size=9pt]htmlentities[/size][size=9pt]([/size][size=9pt]$str[/size][size=9pt], [/size][size=9pt]ENT_QUOTES[/size][size=9pt]);[/size][size=9pt]?>[/size][size=12pt]这样可以使非法的脚本失效。[/size][size=12pt] [/size][font=宋体]但是要注意一点,[/font][size=12pt]htmlentities()[/size][font=宋体]默认编码为[/font] ISO-8859-1[font=宋体],如果你的非法脚本编码为其它,那么可能无法过滤掉,同时浏览器却可以识别和执行。这个问题我先找几个站点测试后再说。[/font][font=宋体]这里提供一个过滤非法脚本的函数:[/font][font=&quot][size=9pt]functionRemoveXSS($val) { [/size][/font][font=&quot][size=9pt]
[font=&quot]   [color=#339966]//remove all non-printable characters. CR(0a)and LF(0b) and TAB(9) are allowed [/color][/font][color=#339966]
[font=&quot]   // this prevents some characterre-spacing such as <java\0script> [/font]
[font=&quot]   // note that you have to handlesplits with \n, \r, and \t later since they *are* allowed in some inputs [/font][/color]
[font=&quot]   $val = preg_replace([color=#cf41cf]'/([\x00-\x08][\x0b-\x0c][\x0e-\x20])/'[/color], [color=#cf41cf]''[/color],$val); [/font]
[font=&quot]    [/font]
[font=&quot]   [color=#6fe16f]//straight replacements, the user should never need these since they're normalcharacters[/color] [/font]
[font=&quot]   [color=#6fe16f]//this prevents like <IMGSRC=&#X40&#X61&#X76&#X61&#X73&#X63&#X72&#X69&#X70&#X74&#X3A&#X61&#X6C&#X65&#X72&#X74&#X28&#X27&#X58&#X53&#X53&#X27&#X29>[/color][/font]
[font=&quot]   $search = [color=#cf41cf]'abcdefghijklmnopqrstuvwxyz'[/color];[/font]
[font=&quot]   $search .= [color=#cf41cf]'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[/color]; [/font]
[font=&quot]   $search .= [color=#cf41cf]'1234567890!@#$%^&*()'[/color]; [/font]
[font=&quot]   $search .= [color=#cf41cf]'~`";:?+/={}[]-_|\'\\'[/color]; [/font]
[font=&quot]   for ($i = 0; $i <strlen($search); $i++) { [/font]
[font=&quot]      [color=#6fe16f]// ;? matches the ;, which is optional[/color] [/font]
[font=&quot]      [color=#6fe16f]// 0{0,7} matches any padded zeros, which are optionaland go up to 8 chars[/color] [/font]
[font=&quot]    [/font]
[font=&quot]      [color=#6fe16f]// &#x0040 @ search for the hex values[/color] [/font]
[font=&quot]      $val =preg_replace([color=#cf41cf]'/(&#[x|X]0{0,8}'[/color].dechex(ord($search[$i])).[color=#cf41cf]';?)/i'[/color], $search[$i], $val); [color=#6fe16f]// with a ;[/color] [/font]
[font=&quot]      [color=#6fe16f]// &#00064 @ 0{0,7} matches '0' zero to seven times[/color][/font]
[font=&quot]      $val =preg_replace([color=#cf41cf]'/(&#0{0,8}'[/color].ord($search[$i]).[color=#cf41cf]';?)/'[/color], $search[$i], $val); [color=#6fe16f]// with a ;[/color] [/font]
[font=&quot]   } [/font]
[font=&quot]    [/font]
[font=&quot]   [color=#6fe16f]// nowthe only remaining whitespace attacks are \t, \n, and \r[/color] [/font]
[font=&quot]   $ra1 = Array([color=#cf41cf]'javascript'[/color], [color=#cf41cf]'vbscript'[/color],[color=#cf41cf]'expression'[/color], [color=#cf41cf]'applet'[/color],[color=#cf41cf]'meta'[/color], [color=#cf41cf]'xml'[/color],[color=#cf41cf]'blink'[/color], [color=#cf41cf]'link'[/color],[color=#cf41cf]'style'[/color], [color=#cf41cf]'script'[/color],[color=#cf41cf]'embed'[/color], [color=#cf41cf]'object'[/color],[color=#cf41cf]'iframe'[/color], [color=#cf41cf]'frame'[/color],[color=#cf41cf]'frameset'[/color], [color=#cf41cf]'ilayer'[/color],[color=#cf41cf]'layer'[/color], [color=#cf41cf]'bgsound'[/color],[color=#cf41cf]'title'[/color], [color=#cf41cf]'base'[/color]);[/font]
[font=&quot]   $ra2 = Array([color=#cf41cf]'onabort'[/color], [color=#cf41cf]'onactivate'[/color],[color=#cf41cf]'onafterprint'[/color], [color=#cf41cf]'onafterupdate'[/color],[color=#cf41cf]'onbeforeactivate'[/color], [color=#cf41cf]'onbeforecopy'[/color],[color=#cf41cf]'onbeforecut'[/color], [color=#cf41cf]'onbeforedeactivate'[/color],[color=#cf41cf]'onbeforeeditfocus'[/color], [color=#cf41cf]'onbeforepaste'[/color], [color=#cf41cf]'onbeforeprint'[/color],[color=#cf41cf]'onbeforeunload'[/color], [color=#cf41cf]'onbeforeupdate'[/color],[color=#cf41cf]'onblur'[/color], [color=#cf41cf]'onbounce'[/color],[color=#cf41cf]'oncellchange'[/color], [color=#cf41cf]'onchange'[/color],[color=#cf41cf]'onclick'[/color], [color=#cf41cf]'oncontextmenu'[/color],[color=#cf41cf]'oncontrolselect'[/color], [color=#cf41cf]'oncopy'[/color],[color=#cf41cf]'oncut'[/color], [color=#cf41cf]'ondataavailable'[/color],[color=#cf41cf]'ondatasetchanged'[/color], [color=#cf41cf]'ondatasetcomplete'[/color],[color=#cf41cf]'ondblclick'[/color], [color=#cf41cf]'ondeactivate'[/color],[color=#cf41cf]'ondrag'[/color], [color=#cf41cf]'ondragend'[/color],[color=#cf41cf]'ondragenter'[/color], [color=#cf41cf]'ondragleave'[/color],[color=#cf41cf]'ondragover'[/color], [color=#cf41cf]'ondragstart'[/color],[color=#cf41cf]'ondrop'[/color], [color=#cf41cf]'onerror'[/color],[color=#cf41cf]'onerrorupdate'[/color], [color=#cf41cf]'onfilterchange'[/color],[color=#cf41cf]'onfinish'[/color], [color=#cf41cf]'onfocus'[/color],[color=#cf41cf]'onfocusin'[/color], [color=#cf41cf]'onfocusout'[/color],[color=#cf41cf]'onhelp'[/color], [color=#cf41cf]'onkeydown'[/color],[color=#cf41cf]'onkeypress'[/color], [color=#cf41cf]'onkeyup'[/color],[color=#cf41cf]'onlayoutcomplete'[/color], [color=#cf41cf]'onload'[/color],[color=#cf41cf]'onlosecapture'[/color], [color=#cf41cf]'onmousedown'[/color],[color=#cf41cf]'onmouseenter'[/color], [color=#cf41cf]'onmouseleave'[/color],[color=#cf41cf]'onmousemove'[/color], [color=#cf41cf]'onmouseout'[/color],[color=#cf41cf]'onmouseover'[/color], [color=#cf41cf]'onmouseup'[/color],[color=#cf41cf]'onmousewheel'[/color], [color=#cf41cf]'onmove'[/color],[color=#cf41cf]'onmoveend'[/color], [color=#cf41cf]'onmovestart'[/color],[color=#cf41cf]'onpaste'[/color], [color=#cf41cf]'onpropertychange'[/color],[color=#cf41cf]'onreadystatechange'[/color], [color=#cf41cf]'onreset'[/color], [color=#cf41cf]'onresize'[/color],[color=#cf41cf]'onresizeend'[/color], [color=#cf41cf]'onresizestart'[/color],[color=#cf41cf]'onrowenter'[/color], [color=#cf41cf]'onrowexit'[/color],[color=#cf41cf]'onrowsdelete'[/color], [color=#cf41cf]'onrowsinserted'[/color],[color=#cf41cf]'onscroll'[/color], [color=#cf41cf]'onselect'[/color],[color=#cf41cf]'onselectionchange'[/color], [color=#cf41cf]'onselectstart'[/color], [color=#cf41cf]'onstart'[/color], [color=#cf41cf]'onstop'[/color], [color=#cf41cf]'onsubmit'[/color],[color=#cf41cf]'onunload'[/color]); [/font]
[font=&quot]   $ra = array_merge($ra1, $ra2); [/font]
[font=&quot]    [/font]
[font=&quot]   $found = true; [color=#6fe16f]// keep replacing as long as the previous round replacedsomething[/color] [/font]
[font=&quot]   while ($found == true) { [/font]
[font=&quot]      $val_before =$val; [/font]
[font=&quot]      for ($i = 0; $i< sizeof($ra); $i++) { [/font]
[font=&quot]         $pattern= [color=#cf41cf]'/'[/color]; [/font]
[font=&quot]         for($j = 0; $j < strlen($ra[$i]); $j++) { [/font]
[font=&quot]            if($j > 0) { [/font]
[font=&quot]               $pattern.= [color=#cf41cf]'('[/color]; [/font]
[font=&quot]               $pattern.= [color=#cf41cf]'(&#[x|X]0{0,8}([9][a][b]);?)?'[/color]; [/font]
[font=&quot]               $pattern.= [color=#cf41cf]'|(&#0{0,8}([9][10][13]);?)?'[/color]; [/font]
[font=&quot]               $pattern.= [color=#cf41cf]')?'[/color]; [/font]
[font=&quot]            }[/font]
[font=&quot]            $pattern.= $ra[$i][$j]; [/font]
[font=&quot]         }[/font]
[font=&quot]         $pattern.= [color=#cf41cf]'/i'[/color]; [/font]
[font=&quot]         $replacement= substr($ra[$i], 0, 2).[color=#cf41cf]'<x>'[/color].substr($ra[$i],2); [color=#6fe16f]// add in <> to nerf the tag[/color] [/font]
[font=&quot]         $val= preg_replace($pattern, $replacement, $val); [color=#6fe16f]//filter out the hex tags[/color] [/font]
[font=&quot]         if($val_before == $val) { [/font]
[font=&quot]            [color=#6fe16f]// no replacements were made, so exit the loop[/color] [/font]
[font=&quot]            $found= false; [/font]
[font=&quot]         }[/font]
[font=&quot]      } [/font]
[font=&quot]   } [/font]
[font=&quot]}[/font][/size][/font][size=9pt][/size]

blankyao 发表于 2007-11-21 01:16

收藏了,好东西竟然没人顶

gdk2006 发表于 2007-12-8 11:09

我来顶一个,收下了。:tongue:

wangchun 发表于 2007-12-8 20:33

早就解决了

Ven 发表于 2008-3-5 01:54

Daniel Morris写了个InputFilter类,很好用。

goodboy11 发表于 2008-6-22 14:57

听说这里有火爆的帖子

*** 作者被禁止或删除 内容自动屏蔽 ***

SysTem128 发表于 2008-6-24 19:14

相关工程
[url]http://htmlpurifier.org/[/url]

还有一个htmlfilter,自己搜搜。

smoon 发表于 2008-9-25 09:22

htmlentities()默认编码为 ISO-8859-1,如果你的非法脚本编码为其它,那么可能无法过滤掉
------
这句能不详细说说!

limiwaer 发表于 2008-10-26 01:04

赵文娟卷入副市长受贿案

 10月23日新华社报道说,“江苏省苏州市原副市长姜人杰因受贿1亿多元人民币,日前被南京市中级人民法院一审判处死刑”。

  稍早一天的10月22日上午,南京市检察院召开新闻发布会,作为纪念检察院机关恢复30年的系列活动,公布了改革开放后其侦办的30起大案要案,其中就包括姜人杰一案。

  1948年出生的姜人杰,2001年开始担任苏州市副市长,直到2006年3月以挪用公款罪、受贿罪被起诉。主办姜案的南京市检察院透露,姜人杰受贿1亿多元,单笔受贿达8000万。

  担任苏州市副市长期间,姜主要分管苏州城建、交通、房地产开发等领域,同时兼任苏州城市建设投资发展有限公司董事长和苏州市高速公路建设指挥部总指挥等职。

  法院判决书说,2001年至2004年间,姜人杰即利用上述职务便利,先后收受4家房地产开发公司和一家科技公司的贿赂款,共计人民币1.0867亿元、港币5万元、美元4000元。

  知情人士告诉本报记者,姜人杰目前被关押在南京市建邺区某看守所内。一审判决后,姜人杰提出了上诉。“正在等待二审。”
[url=http://www.bartendersoft.cn/]bartender[/url][url=http://www.codesoft.net.cn/]codesoft[/url][url=http://www.labelmatrix.cn/]labelmatrix[/url][url=http://www.intermeccorp.com/labelmatrix.htm]labelmatrix[/url][url=http://www.microscan.org.cn/]microscan[/url]
  “大家都在关注,姜人杰一案到底还牵涉到哪些人。”苏州市政府一位官员10月23日称。

  知情人士向本报记者透露,苏州市政协原副主席赵文娟即是被姜人杰揭发的地方官员之一。赵文娟已经在今年8月前后被江苏省纪委“双规”。但此信息仍未获得相关方面的证实。

  苏州市纪委一位人士则表示,由于赵文娟是副厅级干部,属省管干部序列,因此依据干部管理权限,此案查处权限归江苏省纪委负责,苏州纪委只是配合。

  自1990年就开始担任苏州市财政局长,直到2004年卸任,赵此番深陷姜人杰“窝案”让苏州官场吃惊。

  本报记者获悉,苏州市方面已经就赵文娟问题基本情况进行一定层级的传达。赵文娟涉案金额巨大,具体涉案情节还在继续调查中。(
 

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.