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 实体
预定义的字符有:
& (和号)成为 &
" (双引号)成为 "
' (单引号)成为 '
< (小于)成为 <
> (大于)成为 >
这里单引号不会过滤,我们构造单引号的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
javascript:alert(1)
第九关
上一关操作被过滤

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

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

我们想到这个是php代码,是不是可以用双斜杠进行注释
javascript:alert(1)//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,发现不行

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