介绍

JSON劫持⼜称“JSON Hijacking”,2008年国外安全研究⼈员开始提到由JSONP带来的风险。这个问题属于CSRF(Cross-site
request forgery跨站请求伪造)攻击范畴,当某⽹站通过JSONP的⽅式跨域(⼀般为⼦域)传递⽤户认证后的敏感信息时,攻击者可以构
造恶意的JSONP调⽤页⾯,诱导被攻击者访问,以达到截取⽤户敏感信息的⽬的
image.png

JSONP漏洞挖掘

JSONP漏洞挖掘,⾸先需要尽可能的找到所有的接⼝,尤其是返回数据格式是JSONP的接口,然后在数据包中检索关键词callback、json、jsonp、email等,修改Referer后观察返回值是否变化。所有包含有callback等回调函数的,且请求方式为 GET,没有验证 referer 等,都可以尝试下该漏洞

步骤:

  1. 筛出js资源:通过content-type即可判断。

    const char* const kSupportedJavascriptTypes[] = {
     "application/ecmascript",
     "application/javascript",
     "application/x-ecmascript",
     "application/x-javascript",
     "text/ecmascript",
     "text/javascript",
     "text/javascript1.0",
     "text/javascript1.1",
     "text/javascript1.2",
     "text/javascript1.3",
     "text/javascript1.4",
     "text/javascript1.5",
     "text/jscript",
     "text/livescript",
     "text/x-ecmascript",
     "text/x-javascript",
    };
  2. 解析js类型资源,检查query中的每个key,是否满足jsonp的特征。正则大法好:
    (?m)(?i)(callback)|(jsonp)|(^cb$)|(function)
  3. referer配置为同域,请求js获取响应。
  4. 将JSONP响应解析成AST。因为影响在 AST 层面的统一,可以很轻易的解决下面几种问题:
    callback({"username":"jweny"});
    callback({"data": {username:"jweny"}});
    /aa/ window.cb && window.cb({"username":"jweny"})
    callback([{"info": {"username": "jweny"}}])
    cb(' {"username":"jweny"} ')
    a={"username": "jweny"}; cb({"s": a})
    因此,如果生成的AST满足以下条件即可认定存在JSONP漏洞。
    一、Callee.Name == callback函数名
    二、检查是否存在敏感信息:递归遍历AST 获取所key和value,是否满足满足正则(?m)(?i)(uid)|(userid)|(user_id)|(nin)|(name)|(username)|(nick),且value不为空
  5. 替换Referer后再请求一次,重新验证步骤4。

    
    FILTER_WORD = ["jcb", "jsonp", "jsoncb", "jsonpcb", "jsonp_cb" "cb", "json",
                   "jsonpcall", "jsoncall", "jQuery", "callback", "call", "ca"
                   "back", "jsoncallback", "jsonpcallback", ]

    一些JSONP示例接口

      name: '人人网1',
             link: 'http://base.yx.renren.com/RestAPI?method=api.base.getLoginUser&format=2&callback='
         }, {
             name: '人人网2',
             link: 'http://passport.game.renren.com/user/info?callback='
         }, {
             name: '网易163',
             link: 'http://comment.money.163.com/reply/check.jsp?time=1367240961474&callback='
         }, {
             name: '天涯论坛1',
             link: 'http://passport.tianya.cn/online/checkuseronline.jsp?callback='
         }, {
             name: '当当网',
             link: 'http://message.dangdang.com/api/msg_detail.php?customer_id=o4P00TweebicwjhS72NWew%3D%3D&data_type=jsonp&pageindex=1&module=1&pagesize=10&_=1416721945308&callback='

防御方式

  • 限制来源refer
  • 按照JSON格式标准输出(设置Content-Type : application/json; charset=utf-8),预防http://127.0.0.1/getUsers.php...形式的xss
  • 过滤callback函数名以及JSON数据输出,预防xss
  • 严格过滤 callback 函数名及 JSON 里数据的输出。

特别注意

复现问题请选择Chrome 80以下的版本,80以后的版本默认启用samesite,cookie只能同域名或站点访问
https://www.cfanz.cn/resource...

参考资料

https://wenku.baidu.com/view/...
http://drops.xmd5.com/static/...
https://blog.knownsec.com/201...
https://sec-in.com/article/1253
https://zhuanlan.zhihu.com/p/...
https://www.jweny.top/2020/08...


白风之下
10 声望3 粉丝

下一篇 »
CRLF注入