概念
跨站脚本攻击(Cross-Site Scripting, XSS),可以将代码注入到用户浏览的网页上,这种代码包括 HTML 和 JavaScript。
攻击原理
危害
- 偷取网站任意数据
- 偷取用户资料
- 劫持前端逻辑
- 显示伪造的文章或者图片
攻击分类
1. 反射型
反射型指的是 url 参数直接注入。比如:在浏览器地址栏中
localhost:1521?from=<script>alert(1)</script>Bai
2. 存储型
存储到数据库后读取时注入。
一个攻击者在论坛的楼层中包含了一段 JavaScript 代码,并且服务器没有正确进行过滤,那就会造在浏览这个页面时会执行这段 JavaScript 代码。
XSS 攻击注入点
1. HTML 节点内容
<div>
#{content}
</div>
注入点:
<div>
<script>
</script>
</div>
2. HTML 属性
<img src="#{image}"/>
注入点:
<img src="1" onerror="alert(1)"/>
其中 1” onerror=”alert(1) 就是 #{image} 。这里可看出 <img>
多了一个属性 onerror。
3. JavaScript 代码
<script>
var data="#{data}";
</script>
注入点:
<script>
var data="hello";alert(1);"";
</script>
其中 hello”;alert(1);” 就是 #{data}。这里可看出实际上是即为 data 赋值,也进行了 alert 操作。
4. 富文本
富文本需要保留 HTML,但 HTML 存在 XSS 攻击风险。
防御
浏览器自带防御
使用浏览器自带防御可防御一些 XSS。但是存在一些不足:
- 只能对参数出现在 HMTL 内容或属性的反射型 XSS 进行防御
- 并不是所有浏览器都支持对 XSS 的防御
HTML 内容
<div>
<script>
</script>
</div>
解决:
- 将
<
转义为<
- 将
>
转义为>
转义后:
<div>
<script>
</script>
</div>
HTML 属性
<img src="1" onerror="alert(1)"/>
解决:
- 将
"
转义为&quto;
- 将
'
转义为'
- 将空格转义为
 
转义后:
<img src="1&quto; onerror=&quto;alert(1)"/>
JavaScript 代码
<script>
var data="hello";alert(1);"";
</script>
解决:
- 将
"
转义为\"
- 将
\
转义为\\
- 或者转化为 json
转义后:
<script>
var data="hello\";alert(1);\"";
</script>
富文本
CSP
内容安全策略(Content Security Policy):用于指定那些内容可执行。