vlambda博客
学习文章列表

社交网站上的JSON CSRF攻击[Hackerone Platform]


  手翻加机翻,如有问题,那也只能凑合着看了,或是看原文: JSON CSRF attack on a Social Networking Site [ Hackerone Platform ][1]

Badoo.com on Hackerone Platform

在描述这个攻击场景前,先让我们了解一下什么是CSRF攻击?

基本上,考虑到受害者在某个网站上的会话处于活动状态,并且说受害者在该网站的“设置”页面上有一些详细信息,因此,如果有人尝试更新从设置页面发出的请求时,如果没有实现csrf令牌,攻击者可以使用html中的<form>,<input>等在受害者的设置页面中制作包含待更新详细信息的html文件或图像,攻击者只要打开受害者的图像或html文件,其设置页面中的内容将使用攻击者的内容进行更新。

进行攻击必须满足两个条件,首先,该网站的请求中不应包含任何令牌,其次,受害者应该在该站点上有有效的会话(注:也就使用户已经登录了该网站)

一年期,我在hackerone平台上的此网站m.badoo.com中搜索bug,我在burpsuite中找到此请求https://m.badoo.com/api.phtml?SERVER_DELETE_ACCOUNT的地方,其中数据以json格式传输,可能猜测这是删除注册用户帐户的请求,类似地,还有另一个是https://m.badoo.com/api.phtml?SERVER_RESET_TRUSTED_NETWORK,它本意是删除该站点上用户的所有联系人,所以当我看到这些请求时,我注意到没有随这些请求一起发送csrf令牌,但问题是数据是在Json中发送的,因此我必须找到一个为CSRF POC生成HTML文件的方法,所以我制作了两个html文件,一个用于删除导入的联系人,另一个用于删除m.badoo.com上的帐户。但是,由于content-type为json,因此解析器在标头的内容末尾引入了“ =”,因此这成为攻击触发的问题,但是您可以通过在末尾添加自己的一对值来轻松绕过此类参数就像我添加了“ ignore_me”:“'value ='test”一样。HTML代码[删除联系人]已显示如下:

<html><head><meta name="DNT" content="1"><meta name="Connection" content="close"></head><body><form action="https://m.badoo.com/api.phtml?SERVER_RESET_TRUSTED_NETWORK" method="POST" enctype="text/plain"><input name='{"$gpb":"badoo.bma.BadooMessage","version":1,"message_type":327,"body":[],"is_background":false, "ignore_me":"' value='test"}' type="hidden"><input type="submit"></body></html>

注:在这个地方发送json请求也可以使用fetch方法,这就避免了末尾引入‘=’的问题。

我想在这里提到的另一件事是,在表单动作中提到enctype="text/plain"之前,在name参数中传递的整个json有效负载将不被接受为内容类型Json。因此,它与我们为CSRF生成的基本HTML格式有所不同。该发现的实质是,如果请求以JSON格式发送,则只需将encoding-type用作文本/纯文本,然后绕过自动添加在请求内容末尾的"="即可。下面是受害者在浏览器中打开这个html的结果。(注:text/plain的意思是将内容设置为纯文本的形式)

“Your contacts are being erased, this could take up to 5 minutes.”

最终,我通过这个bug从badoo通过hackerone获得了280美元的赏金

References

[1] JSON CSRF attack on a Social Networking Site [ Hackerone Platform ]: https://medium.com/@pig.wig45/json-csrf-attack-on-a-social-networking-site-hackerone-platform-3d7aed3239b0