Java渗透测试靶场“天境”通关系列:XSS 2023-04-05 13:59:22 所属地 广东省 ![](https://image.3001.net/images/20240308/1709876354_65eaa4828e91d155430d9.png) 本文由 创作,已纳入「FreeBuf原创奖励计划」,未授权禁止转载 一、靶场地址 ------ ### GitHub https://github.com/mynameis0day/skymirror/tree/master ### 百度网盘 链接:https://pan.baidu.com/s/1103FAT65VLXWj0NbN4TYMw?pwd=37r2  提取码:37r2 二、靶场搭建 ------ 天境是一款基于Java编写的渗透测试靶场,目前1.0版本覆盖的漏洞类型是暴力破解、命令执行、反序列化、文件下载、SpEL注入、SSRF、文件上传、URL跳转、XSS、XEE,共计10种类型。 靶场启动特别简单,资源文件夹中包含了项目的源代码“SourceCode”和它的jar包文件“skymirror.jar”,大家可以根据自己的喜好来启动靶场。 下面说明一下如何利用jar包来启动该靶场: (1)来到skymirror.jar的本地目录下 (2)运行命令“java -jar skymirror.jar” (3)浏览器访问“本机IP:8080/interface/index.html”即可访问靶场。 启动成功如下图: ![](https://image.3001.net/images/20230405/1680665371_642ceb1b6f26fa88e96da.png)然后就可以愉快的玩耍了! 三、XSS关卡 ------- 靶场的XSS关卡共用16关,每一个关卡所考察的知识点都非常经典,值得大家好好钻研。 ![](https://image.3001.net/images/20230405/1680666009_642ced999d876c80e51ac.png)那就让我们开始通关之旅吧! ### 第一关:熟悉XSS漏洞 这一关没有任何的过滤,直接输入payload“”即可触发弹窗: ### ![](https://image.3001.net/images/20230405/1680667592_642cf3c86d6da9e9bb6cc.png)第二关:叠堆绕过 看一下源代码: ![](https://image.3001.net/images/20230405/1680667675_642cf41bd7c25648fc395.png)可以知道,后台把“”给过滤了,但只是过滤一次,所以这时候可以构造payload“ipt>alert(2)ript>”来绕过过滤: ### ![](https://image.3001.net/images/20230405/1680667860_642cf4d47b9c99c997b3f.png)![](https://image.3001.net/images/20230405/1680667876_642cf4e4e220ea39384bd.png)第三关:事件绕过 看一下源代码: ![](https://image.3001.net/images/20230405/1680668181_642cf615a3402939d6e6a.png)后台把“script”替换为了“?”,可以得知,含有“script”的payload都不起作用了。这时候可以考虑利用事件来绕过过滤,构造payload:,点击图片,成功触发弹窗: ![1680668403_642cf6f368d9776cef8f4.png?1680668404155](https://image.3001.net/images/20230405/1680668403_642cf6f368d9776cef8f4.png?1680668404155) 总结一下常见事件函数: ![1680668473_642cf7393940f9a0b8b6a.png?1680668474113](https://image.3001.net/images/20230405/1680668473_642cf7393940f9a0b8b6a.png?1680668474113) ### 第四关:html实体编码绕过 看一下源代码: ![1680668602_642cf7bade4cae31fc3a7.png?1680668603421](https://image.3001.net/images/20230405/1680668602_642cf7bade4cae31fc3a7.png?1680668603421) 这一关过滤得非常严格,有“script”关键词、弹窗函数和伪协议javascript的payload都不起作用了。遇到这种情况,可以利用HTML编码绕过。 当"可控点"为单个标签属性时,可以使用 html 实体编码: test 构造payload:test,进行url编码(注意需要编码的地方): test,点击“test”,成功触发弹窗: ![1680669245_642cfa3d399e937943a71.png?1680669245661](https://image.3001.net/images/20230405/1680669245_642cfa3d399e937943a71.png?1680669245661) 注意:url 解析过程中,不能对协议类型进行任何的编码操作,所以 javascript: 协议头需要保留。 ### 第六关:js编码绕过 看一下源代码: ![1680670201_642cfdf9d232e9f874957.png?1680670202593](https://image.3001.net/images/20230405/1680670201_642cfdf9d232e9f874957.png?1680670202593) 承接第四和第五关,为协议javascript被过滤了,所以url编码无法用,易知,HTML编码也无法用。这时候我们可以利用js编码绕过。 js 编码策略: 1、"\\" 加上三个八进制数字,如果个数不够,前面补0,例如 "<" 编码为 "\\074" 2、"\\x" 加上两个十六进制数字,如果个数不够,前面补0,例如 "<" 编码为 "\\x3c" 3、"\\u" 加上四个十六进制数字,如果个数不够,前面补0,例如 "<" 编码为 "\\u003c" 4、对于一些控制字符,使用特殊的 C 类型的转义风格(例如 \\n 和 \\r) 构造payload:,对其进行js编码: ,成功触发弹窗: ![1680670546_642cff5295b7e378b7b1a.png?1680670547018](https://image.3001.net/images/20230405/1680670546_642cff5295b7e378b7b1a.png?1680670547018) 注:js编码时,只能对有效的标识符进行编码,否则非标识符解码后不能解析执行。例如 javascript:alert(1) ,进行 js编码时,只能对 alert 和 "1" 进行编码,框号编码后会被当成文本字符,不能执行。 ### 第七关:混合编码绕过 看一下源代码: ![1680670940_642d00dc9721211345623.png?1680670941243](https://image.3001.net/images/20230405/1680670940_642d00dc9721211345623.png?1680670941243) 承接第四、第五和第六关,这一关把事件也过滤了,单纯的html编码、url编码和js编码已经不起作用,这时候我们利用混合编码来绕过过滤。 遵循浏览器的解析顺序:HTML解码->URL解码->JS解码。 Payload:test ①先进行js编码: test ②再进行url编码: test ③然后进行html编码: ![1680671234_642d020245dafd673d23d.png?1680671234662](https://image.3001.net/images/20230405/1680671234_642d020245dafd673d23d.png?1680671234662) 点击“test”,成功触发弹窗: ![1680671455_642d02df517e11cd17d15.png?1680671455800](https://image.3001.net/images/20230405/1680671455_642d02df517e11cd17d15.png?1680671455800) ### 第八关:base64编码绕过 base64 编码通常需要使用到 data 伪协议。 data 协议使用方法:data:资源类型;编码,内容。 通常与 base64 编码配合 data 协议的标签有