大家好,我是ABC_123。今天我们研究一下JSONP劫持漏洞,早些年这个漏洞主要被攻击者用来窃取个人信息,如姓名、身份证号、家庭住址等,现在更多的用于蜜罐之中,间接溯源红队攻击者的个人身份。好多朋友至今对这个漏洞理解不深刻,能发现能利用,但是就是不明白原理,有时候别人能复现成功,但是自己却怎么都复现成功。今天ABC_123搭建一个tomcat环境,用java代码写了几个servlet复现并讲解一下这个漏洞,收获不少,也踩了不少坑。
**注:**关于javascript的同源策略问题,我很久之前的一篇文章《第40篇:CORS跨域资源共享漏洞的复现、分析、利用及修复过程》写的很清楚,大家可以重新阅读一下,这里就不过多叙述了。
首先,JSON与JSONP是两个概念,JSON是一种比较流行的数据格式,用于在不同应用程序之间传输和存储数据。JSONP是在CORS出现之前,解决跨域请求的技术,可以让网页从不满足同源策略的其它域名获取数据;JSONP是json的一种使用方式,可以让当前网页跨域从别的域名获取数据,它利用了。
当网站通过JSONP方式传递用户的敏感数据时,攻击者可以搭建一个第三方网站,网页内部嵌入JSONP链接,并嵌入恶意的JS代码,一旦受害者用户浏览此网站,自己的敏感信息会在毫不知情的情况下被攻击者事先构造好的js代码窃取,这就是今天我们要讲解的JSONP劫持漏洞。
首先编写一个servlet页面,可以让用户使用用户名密码登录并会保存cookie,模仿生产环境中用户登录后的状态。JSONP劫持要想获取受害者敏感数据,受害者前提一定要登录过网站,并且没有注销登录,这样在攻击者在实施JSONP劫持攻击时,浏览器会自动带上用户的Cookie,从而获取敏感数据。
编写一个GetUserInfo页面,返回JSONP格式的数据,其中包括用户的敏感数据身份证号、姓名、密码等。
如下图所示,生成war包并部署到tomcat中,浏览器中输入用户名密码admin:123456,提示登录成功。
访问以下URL路径,模仿正常网站,返回我们自己填入的个人信息。
http://192.168.237.1:9999/Servlet/GetUserInfo
接下来我们传入callback参数,正式模仿JSONP劫持,发现当前JSONP页面返回了一个符合javascript标准的代码格式,test111()相当于一个JS函数。
接下来模仿攻击者构造一个JSONP劫持漏洞测试页面,如下图所示。
其中user111222是要回调的函数,