有关jsonp劫持漏洞渗透学习笔记 2020-11-01 05:59:31 Steven Xeldax 像这种jsonp,CORS,CSRF一类的漏洞一直以来都是非常鸡肋的存在,但最近在搞蜜罐的时候发现往往在蜜罐中这一类的漏洞发挥这奇效。通过对CSDN,QQ,贴吧的jsonp漏洞可以清楚的获取用户的画像,从而帮助蓝队进行夙愿。所以不管是攻击方还是防守方都应该重新重视下jsonp的一类漏洞。 ### JSONP概念 在受到同源规则的限制下(同协议、同域名、同端口),资源不允许跨域访问,但是在实际的使用过程中总有一些地方需要跨域去调用其他域下的资源。 这时候jsonp身为跨域的方法中的一个就孕育而生了,由于html标签中的 script 、 img 、 iframe 这三个标签是允许进行资源的跨域获取的,jsonp就是利用了这三个标签中的其中一个 script利用js代码动态生成script标签然后利用标签中的src属性来进行资源的跨域调用。 利用回调函数"包"住我们的json数据返回。 一个最简单的jsonp应用: https://www.runoob.com/json/json-jsonp.html  可以发现前端可以轻轻松松的获取跨域的数据,那么问题来了,当后端如果没有判断发送数据的源的时候那么可能这个接口会被恶意的攻击者所利用,比如说蜜罐。 ### jsonp劫持 通过JSONP技术可以实现数据的跨域访问,必然会产生安全问题,如果网站B对网站A的JSONP请求没有进行安全检查直接返回数据,则网站B 便存在JSONP 漏洞,网站A 利用JSONP漏洞能够获取用户在网站B上的数据。 利用: 1)用户在网站B 注册并登录,网站B 包含了用户的id,name,email等信息; 2)用户通过浏览器向网站A发出URL请求; 3)网站A向用户返回响应页面,响应页面中注册了JavaScript的回调函数和向网站B请求的script标签 4)用户收到响应,解析JS代码,将回调函数作为参数向网站B发出请求; 5)网站B接收到请求后,解析请求的URL,以JSON 格式生成请求需要的数据,将封装的包含用户信息的JSON数据作为回调函数的参数返回给浏览器,网站B返回的数据实例如下: Callback({"id":1,"name":"test","email":"test@test.com"})。 6)网站B数据返回后,浏览器则自动执行Callback函数对步骤4返回的JSON格式数据进行处理,通过alert弹窗展示了用户在网站B的注册信息。另外也可将JSON数据回传到网站A的服务器,这样网站A利用网站B的JSONP漏洞便获取到了用户在网站B注册的信息。  ### jsonp POC ``` <!DOCTYPE html> <html lang='en'> <head> <title>jsonp</title> </head> <body> jsonp劫持测试 </body> <script> function jsonp2(data){ alert(JSON.stringify(data)); } </script> <script src="https://www.xxx.com/api?jsonp=jsonp2"></script> </html> ``` ### jsonp 利用 1. 水坑攻击,自己搭建一个网站,然后把带有jsonp漏洞目标的请求放入网站中,诱使受害者访问你的网站。 2. 截取敏感信息,id,姓名,甚至是CSRF Token 相关项目: https://github.com/qiaofei32/jsonp_info_leak ### jsonp挖掘 查找带有敏感信息的jsonp请求,确认这个请求的返回值是否有泄露用户的敏感信息,并且能被不同的域的页面去请求获取。 当然可以自动化,对所有的jsonp请求自动用不同的域进行访问来确认是否有jsonp的问题,最后在配上人工筛查寻找感兴趣的接口。 ### jsonp防护 1、严格安全的实现 CSRF 方式调用 JSON 文件:限制 Referer 、部署一次性 Token 等。 2、严格安装 JSON 格式标准输出 Content-Type 及编码( Content-Type : application/json; charset=utf-8 )。 3、严格过滤 callback 函数名及 JSON 里数据的输出。 4、严格限制对 JSONP 输出 callback 函数名的长度(如防御上面 flash 输出的方法)。 5、其他一些比较“猥琐”的方法:如在 Callback 输出之前加入其他字符(如:/**/、回车换行)这样不影响 JSON 文件加载,又能一定程度预防其他文件格式的输出。还比如 Gmail 早起使用 AJAX 的方式获取 JSON ,听过在输出 JSON 之前加入 while(1) ;这样的代码来防止 JS 远程调用。 ### 参考资料 https://www.bilibili.com/s/video/BV1RK4y1t7CX https://www.wjlshare.xyz/2020/07/23/jsonp%E5%8A%AB%E6%8C%81%E6%BC%8F%E6%B4%9E%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/$ https://www.colabug.com/2020/0723/7556785/ https://www.k0rz3n.com/2019/03/07/JSONP%20%E5%8A%AB%E6%8C%81%E5%8E%9F%E7%90%86%E4%B8%8E%E6%8C%96%E6%8E%98%E6%96%B9%E6%B3%95/