web 安全之 XSS 攻防
1. XSS 的定义
跨站脚本攻击 (Cross Site Scripting), 缩写为 XSS. 恶意攻击者往 Web 页面里插入恶意 Script 代码, 当用户浏览该页之时, 嵌入其中 Web 里面的 Script 代码会被执行, 从而达到恶意攻击用户的目的.
2. XSS 的原理
攻击者对含有漏洞的服务器发起 XSS 攻击 (注入 JS 代码).
诱使受害者打开受到攻击的服务器 URL.
受害者在 Web 浏览器中打开 URL, 恶意脚本执行.
3. XSS 的攻击方式
(1) 反射型: 发出请求时, XSS 代码出现在 URL 中, 作为输入提交到服务器端, 服务器端解析后响应, XSS 随响应内容一起返回给浏览器, 最后浏览器解析执行 XSS 代码, 这个过程就像一次发射, 所以叫反射型 XSS.
(2) 存储型: 存储型 XSS 和反射型的 XSS 差别就在于, 存储型的 XSS 提交的代码会存储在服务器端 (数据库, 内存, 文件系统等), 下次请求目标页面时不用再提交 XSS 代码.
4. XSS 的防御措施
(1) 编码: 对用户输入的数据进行 html Entity 编码
(2) 过滤: 移除用户上传的 DOM 属性, 如 onerror 等, 移除用户上传的 style 节点, script 节点, iframe 节点等.
(3) 校正: 避免直接对 HTML Entity 编码, 使用 DOM Prase 转换, 校正不配对的 DOM 标签.
5. 应用示例
构建 node 应用, 演示反射型 XSS 攻击.(Linux 操作系统中)
本例子的代码地址: https://github.com/Xganying/Web-XSS https://github.com/Xganying/Web-XSS (xss_test1)
(1) 新建一个文件夹 xss: mkdir xss_test1
(2) 切换目录到该文件夹下: cd xss
(3) 安装 express: express -e ./
(4) 构建应用依赖: NPM install
(5) 打开构建好的 node 应用, 得到目录:
(6) 开启 node 服务: NPM start
(7) 在浏览器地址栏输入: localhost:3000 , 得到:
(8) 加入 xss
修改 xss_test1 文件 routers 目録下的 index.JS 文件:
修改 xss_test1 文件 views 目录下的 index.ejs 文件:
(9) 重启 node 服务: NPM start , 打开浏览器
a. 在地址栏输入: localhost:3000/?xss=hello
运行结果得到:
b. 在地址栏输入: localhost:3000/?xss=<img src="null" onerror="alert(1)">
运行结果得到:
说明: 如果代码中没有 res.set('X-XSS-Protection', 0); 则会发现没有弹出框, 这是因为浏览器自动设置了拦截 XSS, 所以 onerror 事件并不会执行, 而加上了: res.set('X-XSS-Protection', 0); 才会出现弹框, 这才完成了一次 xss 攻击.
c. 在地址栏输入: localhost:3000/?xss=<p onclick="alert(% 点我 %)"> 点我 </p>
运行结果得到:
说明: 这种攻击就是常用于篡改页面内容, 破坏页面结构, 引诱用户去点击一些钓鱼等网站的手段.
d. 在地址栏输入: localhost:3000/?xss=<iframe src="//baidu.com/t.html"></iframe>
运行结果得到:
说明: 这种攻击就常用于广告植入等.
简单总结就是: img 标签是自动触发而受到攻击的, p 标签是引诱出发而受到攻击的的, 而 iframe 则是广告植入攻击的.
来源: http://www.qdfuns.com/article/51116/a11ce6bd5e6e15d83e143d93f64828f1.html