前言
在做题过程中,作者把用到的知识进行了全面、详细、系统的总结,所以为了方便学习,查阅完全适配此文的总结是必不可少的(怎么可以光训练不去学习、总结呢)。
作者的总结:https://blog.csdn.net/2302_81178149/article/details/142746504
XSS-labs:一款以练习测试XSS思路和命令的闯关游戏,主要是以反射型XSS漏洞为主。每关弹出弹窗即视为闯关成功。
靶场搭建参考下文:
[ 靶场环境篇 ] XSS-labs 靶场环境搭建(特别详细)_xss靶场搭建-CSDN博客
Level1
欢迎用户test?payload的长度为4?
发现URL上的GET型传参,name估计就是payload攻击的点,test长度正好为4,第一关目的应该是先test一下
构造payload
?name=<script>alert()</script>
Level2
这次是一个搜索框
直接构造payload试试
不行,看看源代码,发现value=“搜索”,需要闭合掉引号,重新构造payload
"/><script>alert()</script>
Level3
直接看页面源代码
试试闭合单引号
'/><script>alert()</script>
发现不好使
看页面源代码,果然符号被实体化了,但是htmlspecialchars函数只针对<>大于小于号进行html实体化,我们还可以利用其他方法进行xss注入
这里我们利用onfocus事件绕过
' onfocus=javascript:alert() ‘
Level4
看看前端代码
试试能不能闭合掉”/>
不好使
用focus
" onfocus=javascript:alert() "
Level5
试了试
”/><script>alert()</script><”
不好使,看看php,过滤了js的标签还有onfocus事件,虽然str_replace不区分大小写,但是有小写字母转化函数,所以就不能用大小写法来绕过过滤了,只能新找一个方法进行xss注入
这里我们用a href标签法
"/><a href=javascript:alert()>a-alert</a><"
点击我们写的a-alert
Level6
简单尝试发现不好使
这关过滤掉了on,src,href,data,但是没有添加小写转化函数 ,导致能用大写绕过
"/><ScRipt>alert()</ScriPt>
Level7
不难发现,这里面进行了小写转化,将检测出来的on,script,href给删掉了
但是没有关系,我们可以利用双拼写来绕过。
比如on,我们可以写成oonn,当中间on被删掉的时候,就变成了on
比如script,可以写成scscriptipt,当script被删掉的时候,就变成了script
甚至可以在外面一层进行大小写绕过,比如下面
"/><SCRscriptIPT>alert()</SCRscriptIPT><"
Level8
试了试老方法,不太行
可以发现,input标签添加了html实体转化函数还把双引号也给实体化了, 添加了小写转化函数,还有过滤掉了src、data、onfocus、href、script、"(双引号),难搞哦,看一下这关的源码
但是我们能利用href的隐藏属性自动Unicode解码,我们可以插入一段js伪协议
在线Unicode编码:在线Unicode编码解码 - 码工具
javascript:alert()
复制后添加友情链接,然后点击友情链接
Level9
试试上一关的方法
竟然没插入成功
这里呢,当false===false的时候(就是传入的值没有http://)就会执行if
为了防止false===false,我们需要向传入的值里面添加http://,而且要用注释符注释掉,否则会执行不了、无法弹窗,让函数strpos返回一个数字,构造payload
javascript:alert()/* http:// */
Level10
简单试了试,没有效果
看源码,原来还有其他隐藏的参数传递,下次就一个个测,这里是get传参t_sort,并过滤掉了<>号,不能闭合插入标签
所以我们用onfocus事件,因为这里输入框被隐藏了,需要添加type="text",构造payload
?t_sort=" onfocus=javascript:alert() type="text
(点击空边框即可下一关)
看一下前端代码,完美闭合
Level11
<input>标签有四个值,都做了隐藏处理,
不难看出,第四个名为t_ref的<input>标签是http头referer的参数
(HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器该网页是从哪个页面链接过来的,服务器因此可以获得一些信息用于处理。咱们是从level10.php来的)
咱们在referer上试试,用bp抓包一下,试一下测试代码
Referer:
" sRc DaTa OnFocus <sCriPt> <a hReF=javascript:alert()> j
放包,发现过滤了<>
那就用上一题的payload
" onfocus=javascript:alert() type="text
点击空边框
Level12
看一下前端代码,
t-ua肯定是User-Agent头了
再用burpsuite抓包一下,将User-Agent头修改为我们的测试代码
" sRc DaTa OnFocus <sCriPt> <a hReF=javascript:alert()> j
还是过滤<>
直接套用上题的payload
" onfocus=javascript:alert() type="text
Level13
t_cook应该是cookie
看看cookie,确实如此
还是试试测试代码,
" sRc DaTa OnFocus <sCriPt> <a hReF=javascript:alert()> j
发现过滤了<>
直接套用上题的payload
" onfocus=javascript:alert() type="text
Level14
这一关我们似乎访问不了,一直加载不出来
查看源码通过iframe标签引入了一个http://exofvoewer.org
这题本来是利用转跳到的网站,在那网站去上传一个属性里面含有xss代码的图片,以达到弹窗的效果,可以参考这篇文章。
【巨人肩膀上的矮子】XSS挑战之旅---游戏通关攻略(更新至18关) - 先知社区
这篇文章里面的wooyun也已经闭站了,大家有兴趣可与去搜搜这个wooyun(乌云网),看完感觉有些感慨。
这关主要涉及的漏洞是exif xss漏洞。exif是可交换图像文件格式(英语:Exchangeable image file format,官方简称Exif),是专门为数码相机的照片设定的,可以记录数码照片的属性信息和拍摄数据。
我们可以在网上随便下载一个带有exif的图片,然后按下面步骤制作图片xss。当然可能大家想做的图片可能没有exif,这里作者制作了一个脚本,可以给没有exif的图片加上exif
(需要下载两个Python包:
- Pillow:这是一个用于图像处理的库,支持打开、操作和保存多种格式的图像。
- piexif:用于处理EXIF数据的库,能方便地读取、修改和保存EXIF信息。
pip install Pillow piexif
)。
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的相关属性。
我们可以在这些属性里面添加XSS代码,然后上传图片实现弹窗。
由于目标URL无法访问我们也无法上传图片。
根据大佬写的这关的PAYLOAD,并结合fuzzDicts-master中的XSS PAYLOAD:
因为iframe是内嵌对象,所以可以通过内嵌对象中的内容,通过XSS获取到相关信息。
Level15
可以看到这儿有个陌生的东西ng-include。
使用了ng-include这个表达式的意思是当HTML代码过于复杂时,可以将部分代码打包成独立文件,在使用ng-include来引用这个独立的HTML文件。
ng-include 指令用于包含外部的 HTML 文件,包含的内容将作为指定元素的子节点,ng-include 属性的值可以是一个表达式,返回一个文件名,默认情况下,包含的文件需要包含在同一个域名下。
我们先试试看ng-include,看看包涵第一关是怎样的
?src='level1.php'
发现两关合二为一了(如下)
先测试一下过滤了啥
?src=" ' sRc DaTa OnFocus <sCriPt> <a hReF=javascript:alert()> j
发现这里进行了实体转义,所以在本关进行xss有些困难,好在并没有删除<>等符号,实体转义后在别的关卡还是好使的。
所以可以随便包涵之前的一关并对其传参,以达到弹窗的效果
注意,这里不能包涵那些直接弹窗的东西如<script>,比如?src='level1.php?name=<script>alert()</script>',但是可以包涵那些标签的东西比如<a>、<input>、<img>、<p>标签等等,这些标签是能需要我们手动点击弹窗的,构造正确的payload:
?src='level1.php?name=<img src=XXX onmouseover=alert()>'
Level16
test插入到了center标签中,所以这里就不用闭合了,老规矩,先测试一波关键字
?keyword=" ' sRc DaTa OnFocus OnmOuseOver OnMouseDoWn P</> <sCriPt> <a hReF=javascript:alert()> j
对比发现,这里先是将字母小写化了,再把script和/替换成空格,最后将空格给实体化
空格可以用回车来代替绕过,回车的url编码是%0a,再配合上不用/的<img>、<details>、<svg>等标签
?keyword=<svg%0Aonload=alert()>
Level17
没发现什么有用的,传了两个参数
先测测关键字吧
?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插件了)
我们来看看embed标签是啥
embed标签可以理解为定义了一个区域,可以放图片、视频、音频等内容,但是呢相对于他们,embed标签打开不了文件的时候就会没有显示的区域在,他们就能有块错误的区域
再看一下onfocus和onclick事件,这两事件是等价的,都是一触即发
支持的标签范围还广,也就是支持embed标签 ,这里呢我们可以尝试插入该标签
再看一下onmouse系列的事件
跟onfocus事件支持的标签一样 。
所以,这题的解法很简单,首先得用一个支持flash插件的浏览器打开本关(打开后会有个图片出来的,不支持flash插件浏览器就没有)。
Flash我们都用过的,记得那时候和小伙伴一起玩的火柴人、冰火人、疯狂小人战斗、还有最经典的拳皇等等等等,那时候浏览器无需下载flash就可以直接运行。
但是随着HTML5、WebGL 以及 WebAssembly的成熟,不断暴露出的安全问题,Flash还是走向了终结。微软宣布在2024年初停止对Adobe Flash Playe的支持,win10的下一次更新也将自动删除Flash
具体怎么在浏览器中打开flash我在firefox中尝试失败了,但在edge中尝试成功了,参考下面博客,经尝试,两种方法都可以。
如何不安装Flash玩4399小游戏等Flash游戏、视频方法 - 哔哩哔哩
下面我们对比一下是否支持flash的区别:
不支持
支持
可以发现支持的就有个embed标签的区域在,不支持的就不加载
?arg01=a&arg02= onmouseover=alert(1)
然后移动鼠标到embed标签区域
Level18
直接构造payload
?arg02= onmouseover=alert()
Level19、20
这两关关是flash xss,涉及到反编译,暂时搞不懂(以后有可能会更新),有兴趣的小伙伴们可以自己去深入学习。