`
libran
  • 浏览: 189435 次
  • 性别: Icon_minigender_1
  • 来自: 天津
文章分类
社区版块
存档分类
最新评论

PHP和XSS跨站攻击

阅读更多

PHP和XSS跨站攻击

                                                                       作者:Haohappy2004 的 Blog

        其实这个话题很早就想说说了,发现国内不少PHP站点都有XSS漏洞。今天偶然看到PHP5的一个XSS漏洞,在此小结一下。顺便提醒,使用PHP5的朋友最好打下补丁,或者升级一下。

如果你不懂什么是XSS,可以看这里,或者这里(中文的也许会好懂一些)。

国内不少论坛都存在跨站脚本漏洞,例如这里  有一个Google Hack+XSS的攻击例子,针对的是Discuz 4.0.0RC3。国外也很多这样的例子,甚至Google也出现过,不过在12月初时修正了。跨站攻击很容易就可以构造,而且非常隐蔽,不易被查觉(通常盗取信息后马上跳转回原页面)。
如何攻击,在此不作说明(也不要问我),主要谈谈如何防范。首先,跨站脚本攻击都是由于对用户的输入没有进行严格的过滤造成的,所以我们必须在所有数据进入我们的网站和数据库之前把可能的危险拦截。针对非法的HTML代码包括单双引号等,可以使用<defanged-span style="COLOR: rgb(0,0,187)"></defanged-span>htmlentities() 。

<?php
$str = "A ''''quote'''' is <b>bold</b>";

// Outputs: A ''''quote'''' is &lt;b&gt;bold&lt;/b&gt;
echo htmlentities($str);

// Outputs: A &#039;quote&#039; is &lt;b&gt;bold&lt;/b&gt;
echo htmlentities($str, ENT_QUOTES);
?>


这样可以使非法的脚本失效。
 

<defanged-span style="COLOR: rgb(0,119,0)"></defanged-span>但是要注意一点,htmlentities()默认编码为 ISO-8859-1,如果你的非法脚本编码为其它,那么可能无法过滤掉,同时浏览器却可以识别和执行。这个问题我先找几个站点测试后再说。

这里提供一个过滤非法脚本的函数:

function RemoveXSS($val) {
   // remove all non-printable characters. CR(0a) and LF(0b) and TAB(9) are allowed
   // this prevents some character re-spacing such as <java\0script>
   // note that you have to handle splits with \n, \r, and \t later since they *are* allowed in some inputs
   $val = preg_replace(''''/([\x00-\x08][\x0b-\x0c][\x0e-\x20])/'''', '''''''', $val);
   
   // straight replacements, the user should never need these since they''''re normal characters
   // this prevents like <IMG SRC=&#X40&#X61&#X76&#X61&#X73&#X63&#X72&#X69&#X70&#X74&#X3A&#X61&#X6C&#X65&#X72&#X74&#X28&#X27&#X58&#X53&#X53&#X27&#X29>
   $search = ''''abcdefghijklmnopqrstuvwxyz'''';
   $search .= ''''ABCDEFGHIJKLMNOPQRSTUVWXYZ'''';
   $search .= ''''1234567890!@#$%^&*()'''';
   $search .= ''''~`";:?+/={}[]-_|\''''\\'''';
   for ($i = 0; $i < strlen($search); $i++) {
      // ;? matches the ;, which is optional
      // 0{0,7} matches any padded zeros, which are optional and go up to 8 chars
   
      // &#x0040 @ search for the hex values
      $val = preg_replace(''''/(&#[x|X]0{0,8}''''.dechex(ord($search[$i])).'''';?)/i'''', $search[$i], $val); // with a ;
      // &#00064 @ 0{0,7} matches ''''0'''' zero to seven times
      $val = preg_replace(''''/(&#0{0,8}''''.ord($search[$i]).'''';?)/'''', $search[$i], $val); // with a ;
   }
   
   // now the only remaining whitespace attacks are \t, \n, and \r
   $ra1 = Array(''''javascript'''', ''''vbscript'''', ''''expression'''', ''''applet'''', ''''meta'''', ''''xml'''', ''''blink'''', ''''link'''', ''''style'''', ''''script'''', ''''embed'''', ''''object'''', ''''iframe'''', ''''frame'''', ''''frameset'''', ''''ilayer'''', ''''layer'''', ''''bgsound'''', ''''title'''', ''''base'''');
   $ra2 = Array(''''onabort'''', ''''onactivate'''', ''''onafterprint'''', ''''onafterupdate'''', ''''onbeforeactivate'''', ''''onbeforecopy'''', ''''onbeforecut'''', ''''onbeforedeactivate'''', ''''onbeforeeditfocus'''', ''''onbeforepaste'''', ''''onbeforeprint'''', ''''onbeforeunload'''', ''''onbeforeupdate'''', ''''onblur'''', ''''onbounce'''', ''''oncellchange'''', ''''onchange'''', ''''onclick'''', ''''oncontextmenu'''', ''''oncontrolselect'''', ''''oncopy'''', ''''oncut'''', ''''ondataavailable'''', ''''ondatasetchanged'''', ''''ondatasetcomplete'''', ''''ondblclick'''', ''''ondeactivate'''', ''''ondrag'''', ''''ondragend'''', ''''ondragenter'''', ''''ondragleave'''', ''''ondragover'''', ''''ondragstart'''', ''''ondrop'''', ''''onerror'''', ''''onerrorupdate'''', ''''onfilterchange'''', ''''onfinish'''', ''''onfocus'''', ''''onfocusin'''', ''''onfocusout'''', ''''onhelp'''', ''''onkeydown'''', ''''onkeypress'''', ''''onkeyup'''', ''''onlayoutcomplete'''', ''''onload'''', ''''onlosecapture'''', ''''onmousedown'''', ''''onmouseenter'''', ''''onmouseleave'''', ''''onmousemove'''', ''''onmouseout'''', ''''onmouseover'''', ''''onmouseup'''', ''''onmousewheel'''', ''''onmove'''', ''''onmoveend'''', ''''onmovestart'''', ''''onpaste'''', ''''onpropertychange'''', ''''onreadystatechange'''', ''''onreset'''', ''''onresize'''', ''''onresizeend'''', ''''onresizestart'''', ''''onrowenter'''', ''''onrowexit'''', ''''onrowsdelete'''', ''''onrowsinserted'''', ''''onscroll'''', ''''onselect'''', ''''onselectionchange'''', ''''onselectstart'''', ''''onstart'''', ''''onstop'''', ''''onsubmit'''', ''''onunload'''');
   $ra = array_merge($ra1, $ra2);
   
   $found = true; // keep replacing as long as the previous round replaced something
   while ($found == true) {
      $val_before = $val;
      for ($i = 0; $i < sizeof($ra); $i++) {
         $pattern = ''''/'''';
         for ($j = 0; $j < strlen($ra[$i]); $j++) {
            if ($j > 0) {
               $pattern .= ''''('''';
               $pattern .= ''''(&#[x|X]0{0,8}([9][a][b]);?)?'''';
               $pattern .= ''''|(&#0{0,8}([9][10][13]);?)?'''';
               $pattern .= '''')?'''';
            }
            $pattern .= $ra[$i][$j];
         }
         $pattern .= ''''/i'''';
         $replacement = substr($ra[$i], 0, 2).''''<x>''''.substr($ra[$i], 2); // add in <> to nerf the tag
         $val = preg_replace($pattern, $replacement, $val); // filter out the hex tags
         if ($val_before == $val) {
            // no replacements were made, so exit the loop
            $found = false;
         }
      }
   }
}

<script src="http://www.google-analytics.com/urchin.js" type="text/javascript"></script><script type="text/javascript">_uacct = "UA-260914-1";urchinTracker();</script> 

分享到:
评论

相关推荐

    PHP和XSS跨站攻击的防范

    PHP和XSS跨站攻击的防范

    PHP、Apache环境中部署xsslabs(XSS跨站脚本攻击靶场)

    PHP、Apache环境中部署xsslabs(XSS跨站脚本攻击靶场)

    利用PHP编程防范XSS跨站脚本攻击

    首先,跨站脚本攻击都是由于对用户的输入没有进行严格的过滤造成的,所以我们必须在所有数据进入我们的网站和数据库之前把可能的危险拦截。针对非法的HTML代码包括单双引号等,可以使用htmlentities() 。

    云计算安全XSS跨站攻击.pdf

    例如用户上传附件、修改头像、分享图片/视频等 2、正常的文件一般是文档、图片、视频等,Web应用收集之后放入后台存储,需要的时候再调用出来返回 3、如果恶意文件如PHP、ASP等执行文件绕过Web应用,并顺利执行,则...

    ThinkPHP2.x防范XSS跨站攻击的方法

    本文实例讲述了ThinkPHP2.x防范XSS跨站攻击的方法。分享给大家供大家参考。具体如下: 一直使用ThinkPHP2.x,通过乌云有向提交了ThinkPHP XSS攻击的bug,抽时间看了一下。 原理是通过URL传入script标签,ThinkPHP...

    Laravel5中防止XSS跨站攻击的方法

    本文实例讲述了Laravel5中防止XSS跨站攻击的方法。分享给大家供大家参考,具体如下: Laravel 5本身没有这个能力来防止xss跨站攻击了,但是这它可以使用Purifier 扩展包集成 HTMLPurifier 防止 XSS 跨站攻击。 1、...

    360独家防注入跨站脚本攻击漏洞补丁php-asp-jsp

    360独家防注入跨站脚本攻击漏洞补丁php-asp-jsp

    PHP实现的防止跨站和xss攻击代码【来自阿里云】

    主要介绍了PHP实现的防止跨站和xss攻击代码,是一款来自阿里云的防注入脚本,可实现针对注入、XSS攻击等的过滤功能,需要的朋友可以参考下

    修补跨站脚本攻击漏洞 php版 v1.0

    可以修补动网论坛等php建的网站的跨站脚本攻击漏洞,修护XSS漏洞,此为php版的,还有asp版、aspx版,可以在本站下载 详情请参看:http://www.lbhao.com/detaile_ok-5-833.html

    PHP如何防止XSS攻击与XSS攻击原理的讲解

    XSS又称CSS,全称Cross SiteScript(跨站脚本攻击), XSS攻击类似于SQL注入攻击,是Web程序中常见的漏洞,XSS属于被动式且用于客户端的攻击方式,所以容易被忽略其危害性。其原理是攻击者向有XSS漏洞的网站中输入...

    anti-xss:AntiAntiXSS | 通过PHP防止跨站点脚本(XSS)

    :Japanese_secret_button: 反XSS “跨站点脚本(XSS)是一种通常... 阅读此文本-&gt; XSS(跨站点脚本)预防备忘单测试此工具-&gt; Zed攻击代理(ZAP) 通过“ composer require”安装composer require voku/anti-xss 用法:

    php跨站攻击实例分析

    本文实例讲述了php跨站攻击的原理与防范技巧。分享给大家供大家参考。具体方法分析如下: 跨站攻击就是利用程序上的一些细节或bug问题进行的,那么我们要如何耿防止跨站攻击呢?下面就以一个防止跨站攻击例子来说明...

    修补跨站脚本攻击漏洞 asp版 v1.0

    可以修补动网论坛等asp建的网站的跨站脚本攻击漏洞,修护XSS漏洞,此为asp版的,还有php版、aspx版,可以在本站下载 详情请参看:http://www.lbhao.com/detaile_ok-5-833.html

    修补跨站脚本攻击漏洞 aspx版 v1.0

    可以修补动网论坛等aspx建的网站的跨站脚本攻击漏洞,修护XSS漏洞,此为aspx版的,还有asp版、php版,可以在本站下载 详情请参看:http://www.lbhao.com/detaile_ok-5-833.html

    PHP漏洞全解1-9

    4、跨网站脚本攻击(Cross Site Scripting, XSS) 5、SQL 注入攻击(SQL injection) 6、跨网站请求伪造攻击(Cross Site Request Forgeries, CSRF) 7、Session 会话劫持(Session Hijacking) 8、Session 固定攻击(Session

    AppCMS快速打造一个APP下载站(网赚)

    功能特性 数据中心海量应用 海量安卓应用数据意添加,快速建立App应用下载站,提供OEM版本安卓市场 系统安全可靠 模板代码安全检测,输入数据严格验证,杜绝SQL注入XSS跨站攻击,后台安全多重验证 无人值守自动更新...

    AppCMS 专业APP内容管理系统

    模板代码安全检测,输入数据严格验证,杜绝SQL注入XSS跨站攻击,后台安全多重验证 自由定制模板 和世界上最受欢迎的WordPress博客程序一样,采用PHP混写HTML的方式制作页面模板 赚钱联盟无缝衔接 App应用下载站长...

    基于PHP实现的网上留言管理系统的设计(源代码+论文)

    为了防止SQL注入攻击和XSS(跨站脚本攻击),你可以对留言板代码进行以下修改: 使用预处理语句执行查询:而不是直接执行查询,你应该使用预处理语句来执行查询。这样可以防止SQL注入攻击。 过滤用户输入:在查询...

Global site tag (gtag.js) - Google Analytics