WEB安全——XSS
by addy 原创文章,欢迎转载,但希望全文转载,注明本文地址。
本文地址:http://www.iamaddy.net/2014/02/web%e5%ae%89%e5%85%a8-xss/
什么是XSS攻击
Cross site Script,跨站脚本攻击。XSS是通过HTML注入(本质),篡改网页,插入恶意脚本,控制用户浏览器。由于javascript的强大,现在是否跨域已经不再重要。
类型
反射型XSS,简单的把用户输入的数据反射给浏览器,非持久。
存储型XSS,把用户数据存储在服务器,稳定性强,持久。
DOM based XSS,效果是反射型XSS,修改页面DOM。
XSS构造技巧
利用字符编码
//页面如果是gbk的,%c1\组合在一块,成为一个新的unicode字符
var url=”\”;alert(/XSS/);”一般来说这个是没啥问题的,对”进行了转义。若构造为%c”;alert(1);//,则可构成攻击。
绕过长度限制
最常用能藏代码的地方是location.hash,不会在http包中发送。
在某些环境下,利用注释绕过长度限制。 <input id=1 value=”" /> <input id=2 value=”" /> ,input2允许输入更多字节。 第一个输入><!– ,第二个输入–><script>alert(1)</script>
使用base标签
<base>标签不是很常用,作用是定义页面上所有使用的相对路径的标签地址。
<scrpit src=”/xxx/xxx/a.js”>当在这段代码前加入<base href=”http://www.xss.com” />时,情况就会变得不一样。请求的地址变为http://www.xss.com/xxx/xxx/a.js,使得攻击成功。所以这是个非常危险的标签。
window.name
对window.name赋值没有特殊字符限制,而且也不受同源策略的限制,可以实现跨域跨页面传递数据。
flash XSS
Flash可以嵌入ActionScript,构造如下:getURL(“javascript:alert(document.cookie)”)
将flash嵌入页面:<embed src=”http://www.a.com/evil.swf”>
XSS防御
HttpOnly
禁止页面的javascript访问带有HttpOnly的Cookie,对抗cookie劫持。
输入检查
检查必须在服务器端,前端很容易绕过。普遍做法是前后端都检查,节约服务端资源。利用XSS Filter,过滤或者编码相关XSS特征字符。script、javascript等敏感字。
输出检查
安全的编码函数,对以下等字符编码:& < > ” ‘ /,php中有htmlentities()和htmlspecialchars()两个函数。
富文本处理
标签的选择上,用黑白名单。<iframe>、<script>、<base>、<form>等严格禁止,只允许使用安全标签。PHP开源项目HTMLPurify,对富文本进行xss检查。
示例
在html标签输出
<div>$var</div>
可构造如下$var:<div><script>alert(1)</script></div> 或者 <a href=”#”><img src=”#” onerror=”alert(1)” /></a>
防御的方式是对$var进行htmlencode
在html属性中输出
<div id=”as” name=”$var”>xxx</div>
可构造如下攻击:<div id=”as” name=”"><script>alert(’1′)</script><”">xxx</div>
防御的方式也是对$var进行htmlencode
在<script>标签中输出
<script>var a = “$var”;</script>
攻击的前提使得”闭合,构造如下:<script>var a = “”;alert(1);//”;</script>
防御的方法也是对其encode
在css中输出
<div style=”height: expression(alert(1));”></div>
<div style=”background-image: url(javascript:alert(1));”></div>
<style> div {background-image: url(“javascript:alert(1)”);”}</style>
<style>@import ‘http://www.xxx.com/xss.css’;</style>
防御:XSS在CSS、style、style属性中存在多样化,尽可能禁止用户变量在<style>标签、style属性、以及CSS文件中输出。对输出进行encode。
在url地址输出
$var是url的一部分:<a href=”http://www.xxx.com/?test=$var”>test</a>
可构造如下攻击:<a href=”http://www.xxx.com/?test=” onclick=alert(1)”">test</a>
$var是整个url:<a href=”$var”>test</a>
可构造如下攻击:<a href=”javascript:alert(1);”>test</a>
防御:除javascript可作为伪协议执行代码外,vbscript、dataUrl也可导致脚本执行。Mozilla支持dataUrl。若$var是整个url,则判断是否含有http开头,没有则自动添加。然后对其urlencode。
本文为原创文章,可能会经常更新知识点以及修正一些错误,因此转载请保留原出处,方便溯源,谢谢合作
本文地址:http://www.iamaddy.net/2014/02/web%e5%ae%89%e5%85%a8-xss/
个人知乎,欢迎关注:https://www.zhihu.com/people/iamaddy
欢迎关注公众号【入门游戏开发】
支持一下!!!