0x01:前言

基础漏洞梳理,依旧白盒为主。

0x02:环境搭建

直接下载项目 https://github.com/do0dl3/xss-labs 放到lamp-html目录即可

0x03:开始练习

1、level 1

此关卡无任何过滤,直接拼接了参数,导致了任意标签执行

观察代码:

所以payload:<script>alert(1)</script>

2、level 2

此关卡为文本框xss,代码无过滤,代码如下

此关直接使用script标签已经无法弹窗,原因在于文本框本来就是input标签,我们查看源代码的from标签。

发现payload被value值的双引号包裹,这就意味着我们无论输入何值,它都会被当作一个字符串,也就无法执行script标签。

因此我们将value的第一个双引号闭合,再将input标签闭合,即可执行我们定义的标签。

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

3、level 3

我们查看源代码

源代码使用了htmlspecialchars()函数对尖括号等特殊符号进行转义,

htmlspecialchars()函数

htmlspecialchars()函数是使用来把一些预定义的字符转换为HTML实体,返回转换后的新字符串,原字符串不变。如果 string 包含无效的编码,则返回一个空的字符串,除非设置了 ENT_IGNORE 或者 ENT_SUBSTITUTE 标志;

被转换的预定义的字符有:

也就是说尖括号无法使用,也就无法使用标签,但是依然可以使用事件进行弹窗。

比如

onclick
事件

onclick事件

当点击按钮时执行一段 JavaScript: 该属性由元素上的鼠标点击触发

我们查看源代码的from标签

我们首先要闭合value的单引号,那么我们就可以使用这样的payload:1' onclick=alert(1)

但是别忘了,input标签是未被闭合的,这就导致payload依然无法独立作为一个事件执行,但是我们可以注释掉input标签的后半段。

payload:1' onclick=alert(1)//

黑盒做法

我们输入正常的payload进行测试,比如<script>alert</script>

点击发送后查看源代码

发现尖括号已经被转义,根据特征可知源代码使用的是 htmlspecialchars()函数 ,所以我们选择事件进行测试:

首先需要闭合value的单引号,然后要闭合input标签,所以给出payload: 1' onclick=alert(1)// ,测试后成功弹窗。

4、level 4

我们观察源码

可见此关卡对尖括号进行了删除操作,且使用了 htmlspecialchars()函数 二次过滤,导致无法使用html标签进行突破,但是事件并未过滤,所以突破点依然是事件。

我们观察页面源码的from标签

发现与level 3的区别仅仅在于value的单引号变为了双引号,因此给出payload: 1" onclick=alert(1)//

5、level 5

我们查看源代码

首先strtolower()函数将接收到的值全部转化为小写,这就过滤了大小写混合绕过这个姿势。然后使用正则将<script、on两个关键字替换,也就是说script标签和onclick事件无法使用了。

虽然过滤了onclick标签,但是a标签并未被过滤

<a>标签

<a>标签定义超链接,用于从一张页面链接到另一张页面。

<a>元素最重要的属性是href属性,它指示链接的目标。

示例:<a href="http://127.0.0.1">local</a>

这里给出一个payload:"><a href="javascript:alert(1)">//

首先闭合value的双引号,然后href属性调用javascript的alert()函数。最后将input标签后半段注释。

这里要注意的是,输入payload并不会马上弹窗,而是需要点击变为超链接的文本,如

之所以出现两个也很好解释

这两个都是因为由于未闭合<a>标签,<a>标签后的文本会被当作该超链接的介绍。所以就都变为了链接

6、level 6

我们查看源代码

可见过滤了script标签、onclick事件、和href。但是由于代码未进行统一大小写过滤,这就导致了可以使用大小写混合绕过。

payload: "><a hRef="javascRipt:alert(1)">//

同样需要点击超链接触发。

7、level 7

我们观察源码:

这次代码做了统一小写和正则过滤关键字,因此大小写混合绕过已经不行了,但是由于正则操作是删除动作,所以可以使用双写绕过。

payload: "><a hrhrefef="javascrscriptipt:alert(1)">//

同样需要点击超链接触发

8、level 8

我们查看源代码:

可见这次对于文本框的过滤已经很难突破了,代码做了统一小写,正则替换字符,和过滤危险符号操作。

但是由于该页面文本框功能为增加一个链接,所以href属性本来就存在,如上图,所以我们只需要将脚本实体绕过输入即可。

由于代码过滤了script关键字,且做了统一小写,所以无法使用大小写绕过和双写绕过,但是依然可以使用编码绕过。

如html编码:

payload:

9、level 9

我们查看源代码:

可见对于参数的过滤和level 8是相同的,但是与level 8不同的是增加了url合法性判断,即判断是否存在http://

所以只需在payload增加http://关键字即可,未免造成影响也可在payload后加注释符再拼接http://,虽然绕过了http://判断,但是script还是个问题,这里我们可以参照空格绕过的处理方式,用%0a、%09等绕过

payload:javascr%0aipt:alert(1)//http://

10、level 10

我们查看源码:

可见其将尖括号做了删除转义操作,所以从keyword参数无法进行xss,但是可见下面还有一个参数t_sort,且这个参数只进行了删除尖括号操作,所以可以通过这个参数突破。

当然这个参数也可以在源码from表单看见

我们可以通过测试得出哪个是真的参数。

:?keyword=well done!&t_ilnk=" tyoe="text" 1&t_history=" type="text" 2&t_sort=" type="text" 3

payload: ?keyword=well done! &t_sort=" type="text" onclick="alert(1)

11、level 11

我们观察源码

发现存在三个参数,其中参数keyword、t_sort已经无法进行xss,因为特殊符号已经被 htmlspecialchars()函数 转义。

但是还有一个参数HTTP_REFERER未过滤,所以这里就是突破点

由于HTTP_REFERER该参数取自http头中的referer参数,所以我们将payload放到http头的referer参数即可。

payload:Referer: " type="text" onclick="alert(1)

12、level 12

观察源码:

可见第三个参数由 Referer 变为了USER_AGENT,同样的,这也是http头的一个参数。抓包修改即可。

payload:" type="text" onclick="alert(1)"

13、level 13

依旧是查看源码

可见漏洞点由http头字段转向了cookie,$_COOKIE超全局变量,用于接收cookie中的数据

所以突破点在cookie的user字段,继续抓包改包即可

payload:Cookie: user=" type="text" onclick="alert(1)"

14、level 14

这里的网站已经炸了,不知道是需要翻墙还是网站自己关闭的,所以上不去。查看了先知社区后得知该关卡考点为图片的exif属性,也就是图片的属性(大小拍摄时间等等),也就是exif xss

大致攻击过程是上传一张属性改为js代码的图片,然后访问图片达到xss效果。

具体可以看下先知的帖子: https://xz.aliyun.com/t/1206?accounttraceid=74ab404d-2a01-4a1c-8b87-36ad367dbe11#toc-12

15、level 15

查看网页源码

发现一个特殊的指令ng-include

ng-include 指令用于包含外部的 HTML 文件。

也就是说相当于include,可以包含某个可以执行xss漏洞的文件 ,只要让alert触发即可,我们可以包含level1

查看源码后

发现$str变量被 htmlspecialchars()函数 处理,所以尖括号会被转义,所以暂时没过去。

留坑

16、level 16

查看源代码

此关卡对参数keyword进行了正则转义关键字,将空格 、斜杠等转义。

由于我们可以使用事件进行xss,所以/对我们来说无所谓,只需绕过空格即可,上面也有提过空格的绕过方法,即使用%0a、 %0d 绕过

payload:?keyword=<img%09src=1%0aonerror=alert(1)>

17、level 17

查看源代码

可见存在两个参数,只过滤了尖括号,所以使用onmouseover事件

onmouseover 属性在鼠标指针移动到元素上时触发。

payload:?arg01=a onmouseover=alert(1)&arg02=b

18、level 18

与17关相同,不知道这一关意义何在

payload: ?arg01=a onmouseover=alert(1)&arg02=b

19、level 19、20

这里属于flash xss 严格来讲已经脱离了web层的xss。有兴趣可以看一下 https://www.jianshu.com/p/4e3a517bc4ea

0x04:后记

关键在于姿势。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注