0x00 前言
首先祝各位读者朋友们五一快乐,这段时间确实是鸽了很久,我大概快有一个月没发文章了,因为最近有很多事情在忙,不过正好可以趁这次五一更几篇文章证明一下我还在,等这段时间忙完了发文频率应该就会变正常了。
另外在这段时间中我认识了很多优秀的师傅和前辈,有鼓励我的,有帮助我的,有一起学习的,特别感谢大家,希望大家能越来越好。
本文接上文 xss-labs level1 - level10
本文会讲到:通过换行符实现设置属性。
注:本文不会涉及到14、19和20关,具体原因请看下文。
0x01 正文
•level11:http://xss-labs/level11.php?keyword=good%20job!
十一关依旧是和上一关一样没有给表单,直接看代码:
依旧是给了四个隐藏表单,其中有一个name值为t_ref的隐藏表单,只有它的value值里是有内容的,我看了一下正是level10的地址,通过这点和它的name值来看基本上可以判定它是将Referer头的内容放到了value值里,不着急,我们先依据这几个表单构造一下url:
http://xss-labs/level11.php?t_link=123&t_history=123&t_sort=123&t_ref=123
访问:
只有t_sort的值被放入到了value里,输入几个特殊字符测试一下转义:
看来这里使用htmlspecialchars函数进行了转义,那我们只能将目标转移到t_ref表单中了,接下来用burp抓包修改一下Referer头:
我们直接假定它这里没有作转义的操作,构造payload:
" oninput=alert(1) type="text
放包:
通关。
•level12:http://xss-labs/level12.php?keyword=good%20job!
直接看代码:
依旧是老套路,不过这次给的最后一个表单是将UA头放到了value值里,我们依然套用上一关的payload:
" oninput=alert(1) type="text
burp抓包:
替换:
放包:
通关。
•level13:http://xss-labs/level13.php?keyword=good%20job!
直接看代码:
可以看到最后一个表单name属性为t_cook,从这个属性值就能看出来这应该是拿某个cookie的值放进去了,但是不知道是拿哪个键的cookie,不过它这里既然有内容就证明我们可能已经有了这个cookie,看一下cookie:
确实是有的,user为键,我们依然用上一关的payload进行通关:
" oninput=alert(1) type="text
URL编码:
%22%20oninput%3Dalert(1)%20type%3D%22text
刷新:
通关。
URL编码网站:http://www.jsons.cn/urlencode/
。
当然了,这里不进行URL编码也是可以的:
•level14:http://xss-labs/level14.php
经后续查验,本关外链地址已挂,所以14关略过。
•level15:http://xss-labs/level15.php?src=1.gif
开始之前我需要讲一下,上一关底下是可以直接跳到十五关的:
但是它这里给的地址有点问题,直接跳理论上应该是404,因为源码里没有这个目录,所以需要我们自己拼接一下。回到关卡,我们看一下代码:
src参数值被拼接到了span的class属性中,我们试几个特殊字符看看有没有被转义:
看来直接使用htmlspecialchars函数进行了转义,那我们只能另寻他路了。我拿class的那个默认属性值查了一下:
从描述中我们可以知道:ng-include 指令用于包含外部的 HTML 文件。现在我们构造一下URL,将第二关包含进去:
http://xss-labs/level15.php?src=%27level2.php%27
访问:
成功包含,现在拿第二关通关的payload放到此处:
"><img src=x onerror="alert(1)
通关。
•level16:http://xss-labs/level16.php?keyword=test
可以看到访问第六关时默认携带了一个keyword参数,并且参数值也被渲染在了页面上,修改一下看看会不会变:
看样子确实是受keyword参数控制的,看一下代码:
有点似曾相识,我记得刚开始那几关就是这么玩的,但是这关应该就没那么简单了,直接上个payload看看效果:
<script>alert(1)</script>
访问:http://xss-labs/level16.php?keyword=%3Cscript%3Ealert(1)%3C/script%3E
显而易见script被转义了,试试大小写绕过:
<sCRipt>alert(1)</sCRipt>
看来没用,后端应该是做了转小写的动作,不过<>没被转义,试一下img:
<imgsrc='x'onerror=alert(1)>
被转义成了下面这个样子:
<img src='x' onerror=alert(1)>
仔细看的话可以发现后端也把空格转换为了
,其他的都没变,看来这一关我们只能从单标签下手了。
我仔细想了一下,之前我听说过标签设置属性时分隔的空格可以用/来代替,这是不影响渲染的,经测试确实是可以的,我用下面这段测试html给大家演示一下:
<htmllang="en">
<head>
<metacharset="UTF-8">
<metaname="viewport"content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<img/src="x"/onerror=console.log(1)>
</body>
</html>
不过这里需要注意一点,src设置的值必须得引起来,不然浏览器会认为后面这整个内容都是图片地址,例如我现在将引号去掉:
所以现在我们换一下payload看看能不能成:
<img/src="x"/onerror=console.log(1)>
看来后端也把/转换为了
,这就有点难搞了,暂时我也没想出来该怎么绕过,那就看一下后端怎么写的吧:
和我上述的猜测差不多一致,只不过它这里也把制表符转换为了
,这是我没想到的,作者想得很到位。接着我想了大概十分钟,说句实话,我确实是没想到任何可行性方案,有点超出我能力范畴之外了,所以接下来我去问了deepseek,这也是我第一次打这个靶场去问了ai,最终我得到了以下payload:
<img%0asrc=x%0aonerror=console.log(1)>
读者朋友们不要着急,我们先看一下这段字符串url解码后是什么样子的:
也就是说%0a解码后实际上是换行符:
我找了一篇更通俗易懂的解释供大家理解: https://zhidao.baidu.com/question/1554270048047996907.html
我们看一下实际插入后的效果:
这也就是说我们使用换行符替代空格是没问题的,例如:
<htmllang="en">
<head>
<metacharset="UTF-8">
<metaname="viewport"content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<img
src=x
onerror=console.log(1)>
</body>
</html>
接下来我们把payload换为alert:
<img%0asrc=x%0aonerror=alert(1)>
通关。
•level17:http://xss-labs/level17.php?arg01=a&arg02=b
先看一下代码:
通过我箭头指的地方大家应该就能明白我意思了,改一下arg01和arg02的参数值:
看来是可控的,其实根据上一关的经验,我觉得这一关依然是需要用到上一关的思路,因为它是将arg1和arg2的参数值放到了src属性中,所以我们可以通过换行的形式设置属性值,构造payload:
%0aonfocus=alert(1)%0a
访问:http://xss-labs/level17.php?arg01=%0aonfocus=alert(1)%0a
通关。
最后看一下source code:
通过两处换行实现了设置onfocus事件,但其实这里还有一处需要讲一下:
大家可以看到这里其实是没有成功闭合embed标签的,我们回到element看一下实际渲染后的效果:
可以看到依然是渲染成功了,这里还是和我上一篇文章讲到的浏览器在渲染过程中会自动修正原本代码中的错误
有关,不知道的读者朋友可以去看一下我上篇文章。
•level18:http://xss-labs/level18.php?arg01=a&arg02=b
看起来可能还是和上一关一样,看一下代码:
那么我们还是直接用一下上一关的payload:
%0aonfocus=alert(1)%0a
不过我们还需要改一下,这个payload设置的事件不太好,换成onblur比较好:
%0aonblur=alert(1)%0a
访问:http://xss-labs/level18.php?arg01=%0aonblur=alert(1)%0a
通关。
•level19:http://xss-labs/level19.php?arg01=a&arg02=b
看来还是和上一关一样,看一下代码:
这次是使用了双引号进行闭合src属性值,先测试一下会不会转义掉双引号:
看来是会,不过有了上文的经验,我们还是先拿上一关的payload测试一下:
%0aonblur=alert(1)%0a
可以看到其实并不影响闭合,后端依然是会把内容完整的放入到双引号中,后来我想了很久也没想出个大概,那就让我们看看后端代码吧:
这真的有点为难我了,想了大概半个小时,实在是无路可走,随后我看了一下最后一关的代码:
我寻思这不是和19关一模一样吗,于是我去网上查了一下关于这个靶场的最后两关是什么情况:
说实话,我看到flash后就瞬间没有做下去的耐心了,因为早在几年前chrome就宣布往后不再支持flash了:
https://www.flash.cn/index.php/notice/notice?id=157
20关我看了一下也是涉及flash的,所以这两关我会直接略过,至此我们完成了本靶场的1-20关,14,19,20关卡略过,总共四天完成。
原文始发于微信公众号(Spade sec):xss-labs level11 - level20
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论