xss-labs通关全详解

前言

本文是作者由CSDN博客迁移而来,原文地址:https://blog.csdn.net/2302_81178149/article/details/142746914?spm=1001.2014.3001.5501

我们下面进行下一个漏洞——XSS的学习,XSS是常见漏洞之一,是Web安全入门必学漏洞。为探讨清楚XSS的诸多细节,我们特以经典的xss-labs进行从入门到进阶的专项训练。

在做题过程中,作者把用到的知识进行了全面、详细、系统的总结,所以为了方便学习,查阅完全适配此文的总结是必不可少的**(怎么可以光训练不去学习、总结呢)**。

作者的总结:XSS学习总结-CSDN博客

靶场介绍及搭建

XSS-labs:一款以练习测试XSS思路和命令的闯关游戏,主要是以反射型XSS漏洞为主。每关弹出弹窗即视为闯关成功。

靶场搭建参考下文:

[ 靶场环境篇 ] XSS-labs 靶场环境搭建(特别详细)_xss靶场搭建-CSDN博客

当然,也有一些在线xss-labs平台,不想搭建也可以去找一个用

Level1

欢迎用户test?payload的长度为4?

Image 9

发现URL上的GET型传参,name估计就是payload攻击的点,test长度正好为4,第一关目的应该是先test一下

Image 10

Image 11

构造payload

1
?name=<script>alert()</script>

Image 12

Level2

这次是一个搜索框

Image 13

直接构造payload试试

Image 14

不行,看看源代码,发现value=“<script>alert()</script>”,需要闭合掉引号,重新构造payload

Image 15

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

Image 16

Level3

直接看页面源代码

Image 17

试试闭合单引号

1
'/><script>alert()</script>

发现不好使

Image 18

看页面源代码,果然符号被实体化了,但是htmlspecialchars函数只针对<>(即大于小于号)进行html实体化,我们还可以利用其他方法进行xss注入

Image 19

这里我们利用onfocus事件绕过

1
' onfocus=javascript:alert() ‘

Image 20

Level4

Image 21

看看前端代码

Image 22

试试能不能闭合掉”/>

不好使

Image 23

用focus

1
" onfocus=javascript:alert() "

Image 24

Level5

Image 25

试了试

1
”/><script>alert()</script><”

不好使,看看php,过滤了js的标签还有onfocus事件,虽然str_replace不区分大小写,但是有小写字母转化函数,所以就不能用大小写法来绕过过滤了,只能新找一个方法进行xss注入

Image 26

Image 27

这里我们用a href标签法

1
"/><a href=javascript:alert()>a-alert</a><"

点击我们写的a-alert

Image 28

Level6

简单尝试之前的payload发现不好使

这关过滤掉了on,src,href,data,但是没有添加小写转化函数 ,导致能用大写绕过

Image 29

1
"/><ScRipt>alert()</ScriPt>

Image 30

Level7

不难发现,这里面进行了小写转化,将检测出来的on,script,href给删掉了

Image 31

Image 32

Image 33

但是没有关系,我们可以利用双拼写来绕过。

比如on,我们可以写成oonn,当中间on被删掉的时候,就变成了on;比如script,可以写成scscriptipt,当script被删掉的时候,就变成了script

甚至可以在外面一层进行大小写绕过,比如下面

1
"/><SCRscriptIPT>alert()</SCRscriptIPT><"

Level8

试了试老方法,不太行

Image 34

可以发现,input标签添加了html实体转化函数还把双引号也给实体化了, 添加了小写转化函数,还有过滤掉了src、data、onfocus、href、script、”(双引号),难搞哦,看一下这关的源码

Image 35

但是我们能利用href的隐藏属性自动Unicode解码,我们可以插入一段js伪协议

在线Unicode编码:在线Unicode编码解码 - 码工具

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

Image 36

复制后添加友情链接,然后点击友情链接

Image 37

Level9

试试上一关的方法

竟然没插入成功

Image 38

这里呢,当false===false的时候(就是传入的值没有http://)就会执行if

Image 39

为了防止false===false,我们需要向传入的值里面添加http://,而且要用注释符注释掉,否则会执行不了、无法弹窗,让函数strpos返回一个数字,构造payload

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

Image 40

Level10

简单试了试之前的方法,没有效果

Image 41

Image 42

看源码,原来还有其他隐藏的参数传递,下次就一个个测,这里是get传参t_sort,并过滤掉了<>号,不能闭合插入标签

Image 43

所以我们用onfocus事件,因为这里输入框被隐藏了,需要添加type=”text”,构造payload

1
?t_sort=" onfocus=javascript:alert() type="text

(点击空边框即可下一关)

Image 44

看一下前端代码,完美闭合

Image 45

Level11

<input>标签有四个值,都做了隐藏处理,

不难看出,第四个名为t_ref的<input>标签是http头referer的参数

(HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器该网页是从哪个页面链接过来的,服务器因此可以获得一些信息用于处理。这里可以看到咱们刚刚是从level10.php来的)

Image 46

咱们在referer上试试,用bp抓包一下,试一下测试代码

Referer:

1
" sRc DaTa OnFocus <sCriPt> <a hReF=javascript:alert()> &#106;

Image 47

放包,发现过滤了<>

Image 48

那就用上一题的payload

1
" onfocus=javascript:alert() type="text

Image 49

点击空边框

Image 50

Level12

看一下前端代码,

t-ua肯定是User-Agent头了

Image 51

再用burpsuite抓包一下,将User-Agent头修改为我们的测试代码

1
" sRc DaTa OnFocus <sCriPt> <a hReF=javascript:alert()> &#106;

Image 52

还是过滤<>

Image 53

直接套用上题的payload

1
" onfocus=javascript:alert() type="text

Image 54

Level13

t_cook应该是cookie

Image 55

看看cookie,确实如此

Image 56

还是试试测试代码,

1
" sRc DaTa OnFocus <sCriPt> <a hReF=javascript:alert()> &#106;

发现过滤了<>

Image 57

直接套用上题的payload

1
" onfocus=javascript:alert() type="text

Image 58

Level14

这一关我们似乎访问不了,一直加载不出来

Image 59

查看源码通过iframe标签引入了一个http://exofvoewer.org

这题本来是利用转跳到的网站,在那网站去上传一个属性里面含有xss代码的图片,以达到弹窗的效果。可以参考下面这篇文章:

【巨人肩膀上的矮子】XSS挑战之旅—游戏通关攻略(更新至18关) - 先知社区

这篇文章里面的wooyun也已经闭站了,大家有兴趣可以去搜搜这个wooyun(乌云网),看完感觉有些感慨。

这关主要涉及的漏洞是exif xss漏洞。exif是可交换图像文件格式(英语:Exchangeable image file format,官方简称Exif),是专门为数码相机的照片设定的,可以记录数码照片的属性信息和拍摄数据

我们可以在网上随便下载一个带有exif的图片,然后按下面步骤制作图片xss。当然可能大家想做的图片可能没有exif,这里作者制作了一个脚本,可以给没有exif的图片加上exif

(需要下载两个Python包:

  1. Pillow:这是一个用于图像处理的库,支持打开、操作和保存多种格式的图像。
  2. piexif:用于处理EXIF数据的库,能方便地读取、修改和保存EXIF信息。
1
pip install Pillow piexif

)。

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
import piexif
from PIL import Image

# 加载 JPG 图片
image_path = input("Please enter your image path:\n")
img = Image.open(image_path)

# 创建新的 EXIF 数据
exif_dict = {
piexif.ImageIFD.ImageDescription: "新标题",
piexif.ImageIFD.Make: "相机品牌",
piexif.ImageIFD.Model: "相机型号",
piexif.ImageIFD.Software: "编辑软件",
piexif.ImageIFD.Artist: "作者名",
piexif.ImageIFD.Copyright: "版权所有信息",
piexif.ImageIFD.DateTime: "2024:10:01 12:00:00",
}

# 将字典转换为二进制 EXIF 数据
exif_bytes = piexif.dump(exif_dict)

# 保存带有 EXIF 数据的图片
img.save("output_image.jpg", exif=exif_bytes)

print("EXIF 信息已成功添加!")

我们右键图片选择属性,点击详细信息就可以看到exif的相关属性。

Image 60

我们可以在这些属性里面添加XSS代码,然后上传图片实现弹窗。

由于目标URL无法访问我们也无法上传图片。

Image 61

因为iframe是内嵌对象,所以可以通过内嵌对象中的内容,通过XSS获取到相关信息。

Level15

可以看到这儿有个陌生的东西ng-include。

使用了ng-include这个表达式的意思是当HTML代码过于复杂时,可以将部分代码打包成独立文件,在使用ng-include来引用这个独立的HTML文件。

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

Image 62

我们先试试看ng-include,看看包涵第一关是怎样的

1
?src='level1.php'

发现两关合二为一了(如下)

Image 63

先测试一下过滤了啥

1
?src=" ' sRc DaTa OnFocus <sCriPt> <a hReF=javascript:alert()> &#106;

发现这里进行了实体转义,所以在本关进行xss有些困难,好在并没有删除<>等符号,实体转义后在别的关卡还是好使的。

所以可以随便包涵之前的一关并对其传参,以达到弹窗的效果

Image 64

注意,这里不能包涵那些直接弹窗的东西如‘,但是可以包涵那些标签的东西比如

标签等等,这些标签是能需要我们手动点击弹窗的,构造正确的payload:

1
?src='level1.php?name=<img src=XXX onmouseover=alert()>'

Image 65

Level16

test插入到了center标签中,所以这里就不用闭合了,老规矩,先测试一波关键字

Image 66

1
?keyword=" ' sRc DaTa OnFocus OnmOuseOver OnMouseDoWn P</> <sCriPt> <a hReF=javascript:alert()> &#106;

对比发现,这里先是将字母小写化了,再把script和/替换成空格,最后将空格给实体化

Image 67

空格可以用回车来代替绕过,回车的url编码是%0a,再配合上不用/的<img>、<details>、<svg>等标签

1
?keyword=<svg%0Aonload=alert()>

Image 68

Level17

没发现什么有用的,传了两个参数

Image 69

先测测关键字吧

1
?arg01=" ' sRc DaTa OnFocus OnmOuseOver OnMouseDoWn P <sCriPt> <a hReF=javascript:alert()>; &arg02=" ' sRc DaTa OnFocus OnmOuseOver OnMouseDoWn P <sCriPt> <a hReF=javascript:alert()>;

对比发现,虽然加了该死的html转义,但是这里不需要闭合符号,传入的参数都出现在了embed标签上,打开后缀名为swf的文件(FLASH插件的文件,现在很多浏览器都不支持FLASH插件了)

Image 70

我们来看看embed标签是啥

Image 71

embed标签可以理解为定义了一个区域,可以放图片、视频、音频等内容,但是呢相对于他们,embed标签打开不了文件的时候就会没有显示的区域在,他们就能有块错误的区域

再看一下onfocus和onclick事件,这两事件是等价的,都是一触即发

Image 72

支持的标签范围还广,也就是支持embed标签 ,这里呢我们可以尝试插入该标签

再看一下onmouse系列的事件

Image 73

跟onfocus事件支持的标签一样 。

所以,这题的解法很简单,首先得用一个支持flash插件的浏览器打开本关(打开后会有个图片出来的,不支持flash插件浏览器就没有)。

Flash我们都用过的,记得那时候和小伙伴一起玩的火柴人、冰火人、疯狂小人战斗、还有最经典的拳皇等等等等,那时候浏览器无需下载flash就可以直接运行。

但是随着HTML5、WebGL 以及 WebAssembly的成熟,不断暴露出的安全问题,Flash还是走向了终结。微软宣布在2024年初停止对Adobe Flash Playe的支持,win10的下一次更新也将自动删除Flash。

Image 74

具体怎么在浏览器中打开flash我在firefox中尝试失败了,但在edge中尝试成功了,参考下面博客,经尝试,两种方法都可以。

如何不安装Flash玩4399小游戏等Flash游戏、视频方法 - 哔哩哔哩

下面我们对比一下是否支持flash的区别,

不支持:

Image 75

支持:

Image 76

可以发现支持的就有个embed标签的区域在,不支持的就不加载

1
?arg01=a&arg02= onmouseover=alert(1)

Image 77

然后移动鼠标到embed标签区域

Image 78

Level18

直接构造payload

1
?arg02= onmouseover=alert()

Image 79

Level19、20

这两关关是flash xss,涉及到反编译,暂时过掉(以后有可能会更新),有兴趣的小伙伴们可以自己去深入学习。

参考文献

xss-labs靶场实战全通关详细过程(xss靶场详解)-CSDN博客

【巨人肩膀上的矮子】XSS挑战之旅—游戏通关攻略(更新至18关) - 先知社区


xss-labs通关全详解
http://example.com/2025/05/04/9xss-labs通关全详解/
作者
sangnigege
发布于
2025年5月4日
许可协议