level-11
同第十关一样,页面上只有一个显示位,再看看源码:
可以看到有隐藏表单比第十关多了一个t_ref的<input>
标签
而且t_ref的value的值为一个地址,那么我们可以通过抓包修改这个值来攻击。将referer的值内容修改为
" type="text" onclick="alert(1)
成功插入,然后点击空白框即可:
查看源码:
$_SERVER[‘HTTP_REFERER’]
: 得到链接到当前页面的前一页面的地址。
可以看到将我们前页面的地址进行了去<、>处理后插入到了t_ref中。t_sort接收的值进行了htmlspecialchars()处理。
11-14关卡原理一样都是用burp suite找能输出值的地方然后再闭合前面的value,再给后面添加" type="text" onclick="alert(1) 即可成功
level-12
先看看源代码
多了一个名字为t_ua的<input>
标签,而其value值看起来很像User-Agent头部,而上一关就是修改referer,所以我们可以联想到还是要burp抓包,先看看
可以看到其value值确实为数据包中的User-Agent头的值,让我们修改它
来看看后端代码:
可以看到$str
与$str00分别接收了keyword,t_sort的值并将其用htmlspecialchars()函数处理后分别拼接到<h2>
和名字为t_sort的<input>
标签处
$str11接受了请求中的User-Agent头的值,后去掉了其中的<,>后插入到了名字为t_ua的<input>
标签中,所以我们从这里入手.
less-13
还是一样的套路,来看看源码
这里多出了名为t_cook的<input>
标签,这个名字很容易让我们想到cookie啊,结合前面的思路,我们burp抓包:
看到cookie确实一样,修改内容
" type="text" onclick="alert(1)
源码也没什么新奇的东西:看懂怎么传递值即可
level-14
这一关我们无法访问,所以参考博客https://www.zhaosimeng.cn/writeup/117.html
查看源码发现通过iframe标签引入了一个http://exofvoewer.org
这一关涉及到了exif xss漏洞,exif是可交换图像文件格式(Exchangeable image file format,简称Exif),是专门为数码相机的照片设定的,可以记录数码照片的属性信息和拍摄数据。
上传一个含有xss代码的图片来触发xss:
将刚才的图片上传后再去访问,出发弹窗:
自己复现一下:
准备一个文件:
<?php
$exif = exif_read_data('oh.jpg');
var_dump($exif);
?>
使用exif_read_data()函数需要先修改PHP配置,在其配置文件php.ini中找到php_exif.dll将其加载顺序替换到php_mbstring.dll的后面,哦还要把前面的;去掉,重启apache后即可。
在当前文件夹下放一个名为oh.jpg的图片。
然后我们访问这个文件:
可以看到将图片的exif信息都打印出来了。如果我们将图片的exif信息改为触发xss的payload呢?
修改一个即可,然后我们再次访问看看:
可以看到成功了
level-15
页面是干净的,url处只有src这个参数
所以我们看看源码
看到我们提交的src参数的值被插入到了<span>
标签的class属性值中,且前面还有ng-include:,ng-include是angular.js中的东西,相当于php中的include函数,这里就是将这个文件给包含进来。
首先尝试看看能不能直接闭合标签来触发弹窗:
"><script>alert(1)</script>
发现<,>被编码,然后查看源码:
可以看到src的值赋给了str变量,后通过htmlspecialchars()函数将其赋给了<span>
标签的class属性值中
现在让我们先了解一些ng-include的具体用法:
ng-include指令用于包含外部的html文件
包含的内容将作为指定元素的子节点
ng-include属性的值可以是一个表达式,返回一个文件名
默认情况下,包含的文件需要包含在同一个域名下
特别注意:
ng-include,如果单纯指定地址,必须要加引号
ng-include,加载外部html,<script>标签中的内容不执行。
ng-include,加载外部html中含有style标签样式可以识别。
既然这里可以包含html文件,那么我们就可以包含之前有过xss漏洞的源文件了比如:
src='level1.php?name=<img src=1 onerror=alert(1)>'
因为这里参数值算是一个地址,所以我们需要添加引号。有的小伙伴就可能有疑惑了,之前那不是说
是包含html文件吗?,但是level1.php不是一个php文件吗?,这是因为我们不是单纯的去包含level1.php,而是在后面添加了参数值的。这就有点像是在访问了该参数值中的地址响应再浏览器端的html文件给包含进来的意思。
让我们看看效果:
可以看到成功了,且level1的页面也出现在了下方。
这里可能还会有小伙伴有疑惑,我们的值不是先进行了htmlspecialchars()函数处理了吗,怎么这次我们的<、>就没有被转义呢? 这里是因为一开始我们的<、>是会被转义成实体字符的,但是因为又要模拟去访问level1.php,所以这里后端会构造隐藏请求。在后端php构造请求的顺序一般是执行urldecode(htmlspecialchars_decode($request))
。所以明显可以知道虽然被转义成了字符实体,但是在请求的时候会先还原然后在url编码。
less-16
可以看到页面有一显示位,先来试试普通弹窗:
可以看到外面的script字符与/都被编码成了空格字符实体。所以,闭合前面标签的方法也不行了。来看看后端代码:
可以看到依次对我们输入的参数值中的script,空格,/,空格被替换成了 (空格字符实体)。因此也这里无法使用空格来讲字符分隔进行语义的区分,但是我们还可以用回车来替代。而且我们需要一个不需要闭合的标签,如<img>
标签。构造如下语句:
<img
src=1
onerror=alert(1)
>
但是这样浏览器并没有将字符分隔开(已试过).所以我们要用回车的url编码格式(%01)
来表示代替。
level-17
1.做这关的时候需要下载chrome低版本我下载的是chrome66.0.3359.139
https://www.chromedownloads.net/chrome64win-stable/763.html
下载之后解压到当前文件夹两次,然后点开文件夹就会有exe文件运行即可
然后打开设置页面找到显示高级设置找到隐私设置,然后点击内容设置钮找到弹出内容设置信息框,找到flash那一栏点击允许网站运行flash,点击完成即可
2.然后需要下载Adobe Flash Player然后选择自定义下载选择
这一关显示这么简陋是因为中间有一个flash无法正常显示出来
可以看到我们url处的参数值出现在了<embed>
标签的src属性值中。所以从这里入手,先来个普通弹窗探探底:
><script>alert(1)</script>
可以看到代码中的瓜纳金字符都被编码了,不用想又是htmlspecialchars()函数处理的。这里src属性值并没有添加引号,且两个变量是相互拼接起来的,所以我们可以在后面直接添加onclick事件来试试,在b后面加个空格然后加入onclick事件,这样浏览器解析到b后悔停止判断,然后将onclick事件看作另外一个属性。
?arg01=a&arg02=b onclick=alert(1)
emmm,火狐不显示图片也触发不到,这里就用谷歌看一下:
看看后端:
可以看到服务器端对于上传的两个参数值都用htmlspecialchars()函数进行了处理。
level-18
同17关。
http://127.0.0.1/xss-labs-master/level18.php?arg01=a&arg02=b onmouseover=alert(1)
level-19
还是看看源码先:
可以看到其与上两关不同的地方为src的值使用了双引号括起来,这样我们想要成功执行js代码就要先闭合标签,但是其还用了htmlspecialchars()函数进行处理,所以无法闭合。
接下来就涉及到了一种xss攻击手段,flashxss,flashxss就是flash有可以调用js的函数,也就是可以和js进行通信。因此这些如果使用不当也是会造成xss的,常见的可触发xss的危险函数有:
getURL,navigate ToURL,Externallnterface.call,htmlText,loadMovie等。
这里需要对引用的swf文件进行反编译然后进行源码分析。这里用到的对此类文件进行反编译的攻击是jpexs-decompiler.项目地址:http://github.com/jindrapetrik/jpexs-decompiler/releases.
安装后导入源文件引用xsf03.swf文件
从上图中脚本代码可以看到,在右侧箭头处是一个getURL函数。该函数可以获取一些参数值。
可以看到如果构造version参数的话,其值能够传入loc4变量中,也就是sIFR的内容中。但是前面getURL函数中已经指明了只有在内容为link时才会打开。那么什么才算是link啊,继续看:
有一个contentIsLink函数就是专门定义用来判断内容是不是link的。通过分析其中的代码可以找到这里所谓的link就是一个<a></a>
这样标签包含起来的内容。
因此我们可以构造如下代码进行测试:
http://127.0.0.1/xss-labs-master/level19.php?arg01=version&arg02=<a%20href="javascript:alert(1)">oh</a>
这里就要先把我的flash更新一下了,不然实在做不了了。可以看到更新后的显示:
将构造的payload加入:
可以看到我们前一个参数的值写成了version,后一个参数的值就是一个由<a></a>
标签触发的XSS的payload,并且我们提交的恶意代码在页面响应的flash中已经体现出来了,点击链接:
成功,看看源码:
可以看到虽然浏览器处关键字符被编码了,但是对于xsf03.swf来说依然是正常访问的。
level-20
好了,进入20关,这看起来还真是空空如也。
让我们看看源码:
可以看到依然是将我们提交的两个参数插入到了<embed>
标签的scr属性值中,并且还是引用了swf文件,但是没有显示出来。
还是用jpexs对xsf04.swf文件进行反编译:
可以看到Externalinterface.call的第二个参数传回来的id没有进行正确过滤,这就可能导致xss。
这里参考大佬的payload:
arg01=id&arg02=xss\"))}catch(e){alert(/xss/)}//%26width=123%26height=123