xss-labs通关

Posted on 2024-08-05  72 Views


xss源码地址:https://github.com/do0dl3/xss-labs

完成解压后添加至phpstudy的www目录下,开启mysql和apache访问即可,phpstudy安装过程在前面两个靶场有提到,且php版本需切换至5.3.29和sqli-labs一样

第一关

没过滤,让name接受参数值调用js代码

<script>alert(123)</script>

第二关

尝试使用第一关代码,发现不行

查看源码,发现我们处于input标签中,需要先闭合此标签,才能执行代码

构造payload

"><script>alert(123)</script>

提交成功进入第三关

第三关

输入前一关代码观察,发现字符<>被替换

htmlspecialchars()函数把预定义的字符转换为 HTML 实体
预定义的字符有:
 & (和号)成为 &amp;
 " (双引号)成为 &quot;
 ' (单引号)成为 '
 < (小于)成为 &lt;
 > (大于)成为 &gt;

这里单引号不会过滤,我们构造单引号的payload。恰好这里是输入框的形式,我们使用onclick事件可以绕过

' onclick='alert(1)

第四关

发现<>直接被过滤

尝试上一关代码

没有过滤,看看能不能把value闭合

" onclick="alert(1)

第五关

想要看看能不能闭合value,但是onclick被拆开了

那么需要使用a标签的JavaScript伪协议实现href属性支持JavaScript:伪协议,则:后面的代码会被当成JavaScript来执行。注意这里还需要闭合input标签。

"><a href=javascript:alert(1)>

然后点击">

常用xss语句
<script>alert(1)</script>

<img src=jjw onerror=alert(1)>

<svg onload=alert(1)>

<a herf=javascript:alert(1)>

<iframe src="javascript:alert(1)"></iframe>

第六关

注入 和第五关一样的代码,发现href被过滤了

经测试很多都被过滤了,我们考虑大小写绕过

"><a HrEF=javascript:alert(1)>

第七关

部分字符被置换为空

不知道是不是只匹配了一次,看看双写行不行

"><a HrEHreff=javascriscriptpt:alert(1)>

成功

第八关

我们在输入框输入的内容,会被带入到友情链接href属性中,那我们是不是可以直接输入javascript:alert(1),点击友情链接不就可以了嘛。当我们输入后发现javascript被过滤了。

选择使用HTML实体编码(即Unicode编码)绕过

网址:https://www.qqxiuzi.cn/bianma/zifushiti.php
&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;

第九关

上一关操作被过滤

不合法试试加上http://,有链接但没效果

不编码情况被过滤,且http://在前面是无法执行JavaScript

我们想到这个是php代码,是不是可以用双斜杠进行注释

&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;//http://

第十关

这一关没有输入框,我们查看下源代码

可以看到有hidden,把输入框给隐藏了,把type属性删掉或者修改hidden为text,则会出现输入框

输入框出来了,这里显示输入框作用不大,因为没有按钮,我们想到使用url给输入框传参,三个都传一下,看哪个发生变化

http://127.0.0.1/xss-labs-master/level10.php?keyword=asd&t_link=asda&t_history=asdads&t_sort=asdas

看到t_sort发生变化,可以猜到后台源码包含两个参数keyword和t_sort,我们进行传参

http://127.0.0.1/xss-labs-master/level10.php?keyword=1&t_sort=%22%3E%3Cscript%3Ealert(1)%3C/script%3E

发现<>被过滤,可以换成鼠标事件进行过滤。注意这时就需要把hidden改为text,因为要进行点击执行JavaScript

?keyword=1&t_sort=" onclick="alert(1)

第十一关

没找到点击按钮,按f12看看,比上一关多了一个参数

继续和上一关一样传参数进去

t_sort和t_ref的value都变了,但t_ref没有变成我们传入的值,既然t_sort变化了,我们试着注入第10关的paylod

oneclick显示蓝色,被实体化了,回想到t_ref的value的值是前一个页面的地址,通过$_SERVER['HTTP_REFERER']也可以获取前一个页面的地址。所以referer请求头也成了输出参数

Referer是HTTP请求header的一部分,当浏览器向web服务器发送请求的时候,头信息里就有包含,比如在www.Firefox.com 里有一个www.baidu.com链接,那么点击这个链接 ,它的header信息里就会看见有:referer=http://www.Firefox.com,说明是被引用过来的

我们尝试referer注入。通过bp抓包修改referer(这里需抓最开始跳转到11关的网页),最好先退到第十关重新来。

" type="text" onmousemove="alert(1)
或
" onclick="alert(1)  (不过这个需要修改hidden为text)

第十二关

源代码发现疑似user-agent头部信息,尝试对他进行注入

尝试和前一关一样的payload,用bp抓包

直接就成了

第十三关

源码发现cook,推理得知应该是cookie

同样的操作,注入cookie

看到有框框重新发个包,用此数据包替换,测试是否写入成功

直接秒了

第十四关

该关是修改iframe调用的文件来实现xss注入(但因为iframe调用的文件地址失效,无法进行测试),直接跳

第十五关

源代码里面看到文件包含

include作用是将同一服务器的html文件包含进来,和src进行传参,在请求 src 资源时会将其指向的资源下载并应用到文档中,比如 JavaScript 脚本,img 图片等等,在这里我们将src指向任意一关,输入对应的xss弹窗脚本即可。

接收参数给的src,后面的1.gif就在里面,我们直接把payload写在=后

'level1.php?name=<img src=1 onerror=alert(1)>'

第十六关

这一关的源码非常简洁,和前面不一样的是多了center标签

试试看能不能把里面内容换成跨站代码,并不能行

<script>alert(1)</script>

接着尝试其他标签,好像只有script被过滤

<script>alert(1)</script><javascript><img><onclick>

img也不行,但是这里发现空格被换成了html语言

 <img src=1 onerror=alert(1)>

于是想到可以用%0a代替空格

 <img%0asrc=1%0aonerror=alert(1)>

第十七关 从17关开始都需要flash插件了,需要换个支持flash插件的浏览器在开始。

源码多了不认识的标签

<embed> 标签用于在HTML页面中嵌入外部内容,如多媒体文件、插件或其他交互式内容。它是HTML5的一部分。
以下是 <embed> 标签的基本语法:
<embed src="URL" type="MIME-类型" width="宽度" height="高度">
常用的属性包括:
src:指定要嵌入的外部资源的URL。可以是音频、视频、SWF 文件等。
type:指定被嵌入资源的MIME类型。
width:指定嵌入内容的宽度(像素或百分比)。
height:指定嵌入内容的高度(像素或百分比)。

更改参数时发现src也会跟着改变,这两个变量是互相拼接起来的,所以在输入arg02时在b之后加一个空格,当浏览器解析到b的时候就停止判断,然后将onclick或onmouseover看作另外一个属性。从而执行JavaScript语句。

?arg01=a&arg02=b onmousemove='alert(1)'

第十八关

和第十七关一样,也是拼接,payload也一样

第十九关

直接注入前一关的payload,发现不行

后经查询需要反编译方面相关的知识,本人尚未掌握,留个坑以后再来填

未完待续。。。