xss-labs level11 - level20

admin 2025年5月23日15:57:22评论6 views字数 4483阅读14分56秒阅读模式

0x00 前言

首先祝各位读者朋友们五一快乐,这段时间确实是鸽了很久,我大概快有一个月没发文章了,因为最近有很多事情在忙,不过正好可以趁这次五一更几篇文章证明一下我还在,等这段时间忙完了发文频率应该就会变正常了。

另外在这段时间中我认识了很多优秀的师傅和前辈,有鼓励我的,有帮助我的,有一起学习的,特别感谢大家,希望大家能越来越好。

本文接上文 xss-labs level1 - level10

本文会讲到:通过换行符实现设置属性。

注:本文不会涉及到14、19和20关,具体原因请看下文。

0x01 正文

level11:http://xss-labs/level11.php?keyword=good%20job!

xss-labs level11 - level20

十一关依旧是和上一关一样没有给表单,直接看代码:

xss-labs level11 - level20

依旧是给了四个隐藏表单,其中有一个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

访问:

xss-labs level11 - level20

只有t_sort的值被放入到了value里,输入几个特殊字符测试一下转义:

xss-labs level11 - level20

看来这里使用htmlspecialchars函数进行了转义,那我们只能将目标转移到t_ref表单中了,接下来用burp抓包修改一下Referer头:

xss-labs level11 - level20

我们直接假定它这里没有作转义的操作,构造payload:

" oninput=alert(1) type="text
xss-labs level11 - level20

放包:

xss-labs level11 - level20
xss-labs level11 - level20

通关。

level12:http://xss-labs/level12.php?keyword=good%20job!

xss-labs level11 - level20

直接看代码:

xss-labs level11 - level20

依旧是老套路,不过这次给的最后一个表单是将UA头放到了value值里,我们依然套用上一关的payload:

" oninput=alert(1) type="text

burp抓包:

xss-labs level11 - level20

替换:

xss-labs level11 - level20

放包:

xss-labs level11 - level20
xss-labs level11 - level20

通关。

level13:http://xss-labs/level13.php?keyword=good%20job!

xss-labs level11 - level20

直接看代码:

xss-labs level11 - level20

可以看到最后一个表单name属性为t_cook,从这个属性值就能看出来这应该是拿某个cookie的值放进去了,但是不知道是拿哪个键的cookie,不过它这里既然有内容就证明我们可能已经有了这个cookie,看一下cookie:

xss-labs level11 - level20

确实是有的,user为键,我们依然用上一关的payload进行通关:

" oninput=alert(1) type="text

URL编码:

xss-labs level11 - level20
%22%20oninput%3Dalert(1)%20type%3D%22text
xss-labs level11 - level20

刷新:

xss-labs level11 - level20
xss-labs level11 - level20

通关。

URL编码网站:http://www.jsons.cn/urlencode/

当然了,这里不进行URL编码也是可以的:

xss-labs level11 - level20

level14:http://xss-labs/level14.php

xss-labs level11 - level20

经后续查验,本关外链地址已挂,所以14关略过。

level15:http://xss-labs/level15.php?src=1.gif

xss-labs level11 - level20

开始之前我需要讲一下,上一关底下是可以直接跳到十五关的:

xss-labs level11 - level20

但是它这里给的地址有点问题,直接跳理论上应该是404,因为源码里没有这个目录,所以需要我们自己拼接一下。回到关卡,我们看一下代码:

xss-labs level11 - level20

src参数值被拼接到了span的class属性中,我们试几个特殊字符看看有没有被转义:

xss-labs level11 - level20

看来直接使用htmlspecialchars函数进行了转义,那我们只能另寻他路了。我拿class的那个默认属性值查了一下:

xss-labs level11 - level20

从描述中我们可以知道:ng-include 指令用于包含外部的 HTML 文件。现在我们构造一下URL,将第二关包含进去:

http://xss-labs/level15.php?src=%27level2.php%27

访问:

xss-labs level11 - level20

成功包含,现在拿第二关通关的payload放到此处:

"><img src=x onerror="alert(1)
xss-labs level11 - level20
xss-labs level11 - level20
xss-labs level11 - level20

通关。

level16:http://xss-labs/level16.php?keyword=test

xss-labs level11 - level20

可以看到访问第六关时默认携带了一个keyword参数,并且参数值也被渲染在了页面上,修改一下看看会不会变:

xss-labs level11 - level20

看样子确实是受keyword参数控制的,看一下代码:

xss-labs level11 - level20

有点似曾相识,我记得刚开始那几关就是这么玩的,但是这关应该就没那么简单了,直接上个payload看看效果:

<script>alert(1)</script>

访问:http://xss-labs/level16.php?keyword=%3Cscript%3Ealert(1)%3C/script%3E

xss-labs level11 - level20

显而易见script被转义了,试试大小写绕过:

<sCRipt>alert(1)</sCRipt>
xss-labs level11 - level20

看来没用,后端应该是做了转小写的动作,不过<>没被转义,试一下img:

<imgsrc='x'onerror=alert(1)>
xss-labs level11 - level20

被转义成了下面这个样子:

<img&nbsp;src='x'&nbsp;onerror=alert(1)>

仔细看的话可以发现后端也把空格转换为了&nbsp;,其他的都没变,看来这一关我们只能从单标签下手了。

我仔细想了一下,之前我听说过标签设置属性时分隔的空格可以用/来代替,这是不影响渲染的,经测试确实是可以的,我用下面这段测试html给大家演示一下:

<!DOCTYPE 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>
xss-labs level11 - level20

不过这里需要注意一点,src设置的值必须得引起来,不然浏览器会认为后面这整个内容都是图片地址,例如我现在将引号去掉:

xss-labs level11 - level20
xss-labs level11 - level20

所以现在我们换一下payload看看能不能成:

<img/src="x"/onerror=console.log(1)>
xss-labs level11 - level20

看来后端也把/转换为了&nbsp;,这就有点难搞了,暂时我也没想出来该怎么绕过,那就看一下后端怎么写的吧:

xss-labs level11 - level20

和我上述的猜测差不多一致,只不过它这里也把制表符转换为了&nbsp;,这是我没想到的,作者想得很到位。接着我想了大概十分钟,说句实话,我确实是没想到任何可行性方案,有点超出我能力范畴之外了,所以接下来我去问了deepseek,这也是我第一次打这个靶场去问了ai,最终我得到了以下payload:

<img%0asrc=x%0aonerror=console.log(1)>

读者朋友们不要着急,我们先看一下这段字符串url解码后是什么样子的:

xss-labs level11 - level20

也就是说%0a解码后实际上是换行符:

xss-labs level11 - level20

我找了一篇更通俗易懂的解释供大家理解: https://zhidao.baidu.com/question/1554270048047996907.html

xss-labs level11 - level20

我们看一下实际插入后的效果:

xss-labs level11 - level20

这也就是说我们使用换行符替代空格是没问题的,例如:

<!DOCTYPE html><htmllang="en"><head>    <metacharset="UTF-8">    <metaname="viewport"content="width=device-width, initial-scale=1.0">    <title>Document</title></head><body>    <imgsrc=xonerror=console.log(1)></body></html>
xss-labs level11 - level20

接下来我们把payload换为alert:

<img%0asrc=x%0aonerror=alert(1)>
xss-labs level11 - level20

通关。

level17:http://xss-labs/level17.php?arg01=a&arg02=b

xss-labs level11 - level20

先看一下代码:

xss-labs level11 - level20

通过我箭头指的地方大家应该就能明白我意思了,改一下arg01和arg02的参数值:

xss-labs level11 - level20

看来是可控的,其实根据上一关的经验,我觉得这一关依然是需要用到上一关的思路,因为它是将arg1和arg2的参数值放到了src属性中,所以我们可以通过换行的形式设置属性值,构造payload:

%0aonfocus=alert(1)%0a

访问:http://xss-labs/level17.php?arg01=%0aonfocus=alert(1)%0a

xss-labs level11 - level20

通关。

最后看一下source code:

xss-labs level11 - level20

通过两处换行实现了设置onfocus事件,但其实这里还有一处需要讲一下:

xss-labs level11 - level20

大家可以看到这里其实是没有成功闭合embed标签的,我们回到element看一下实际渲染后的效果:

xss-labs level11 - level20

可以看到依然是渲染成功了,这里还是和我上一篇文章讲到的浏览器在渲染过程中会自动修正原本代码中的错误有关,不知道的读者朋友可以去看一下我上篇文章。

level18:http://xss-labs/level18.php?arg01=a&arg02=b

xss-labs level11 - level20

看起来可能还是和上一关一样,看一下代码:

xss-labs level11 - level20

那么我们还是直接用一下上一关的payload:

%0aonfocus=alert(1)%0a

不过我们还需要改一下,这个payload设置的事件不太好,换成onblur比较好:

%0aonblur=alert(1)%0a

访问:http://xss-labs/level18.php?arg01=%0aonblur=alert(1)%0a

xss-labs level11 - level20
xss-labs level11 - level20

通关。

level19:http://xss-labs/level19.php?arg01=a&arg02=b

xss-labs level11 - level20

看来还是和上一关一样,看一下代码:

xss-labs level11 - level20

这次是使用了双引号进行闭合src属性值,先测试一下会不会转义掉双引号:

xss-labs level11 - level20

看来是会,不过有了上文的经验,我们还是先拿上一关的payload测试一下:

%0aonblur=alert(1)%0a
xss-labs level11 - level20

可以看到其实并不影响闭合,后端依然是会把内容完整的放入到双引号中,后来我想了很久也没想出个大概,那就让我们看看后端代码吧:

xss-labs level11 - level20

这真的有点为难我了,想了大概半个小时,实在是无路可走,随后我看了一下最后一关的代码:

xss-labs level11 - level20

我寻思这不是和19关一模一样吗,于是我去网上查了一下关于这个靶场的最后两关是什么情况:

xss-labs level11 - level20
xss-labs level11 - level20

说实话,我看到flash后就瞬间没有做下去的耐心了,因为早在几年前chrome就宣布往后不再支持flash了:

xss-labs level11 - level20
https://www.flash.cn/index.php/notice/notice?id=157

20关我看了一下也是涉及flash的,所以这两关我会直接略过,至此我们完成了本靶场的1-20关,14,19,20关卡略过,总共四天完成。

原文始发于微信公众号(Spade sec):xss-labs level11 - level20

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年5月23日15:57:22
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   xss-labs level11 - level20http://cn-sec.com/archives/4083884.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息