介绍
JSON劫持⼜称“JSON Hijacking”,2008年国外安全研究⼈员开始提到由JSONP带来的风险。这个问题属于CSRF(Cross-site
request forgery跨站请求伪造)攻击范畴,当某⽹站通过JSONP的⽅式跨域(⼀般为⼦域)传递⽤户认证后的敏感信息时,攻击者可以构
造恶意的JSONP调⽤页⾯,诱导被攻击者访问,以达到截取⽤户敏感信息的⽬的
JSONP漏洞挖掘
JSONP漏洞挖掘,⾸先需要尽可能的找到所有的接⼝,尤其是返回数据格式是JSONP的接口,然后在数据包中检索关键词callback、json、jsonp、email等,修改Referer后观察返回值是否变化。所有包含有callback等回调函数的,且请求方式为 GET,没有验证 referer 等,都可以尝试下该漏洞
步骤:
筛出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", };
- 解析js类型资源,检查query中的每个key,是否满足jsonp的特征。正则大法好:
(?m)(?i)(callback)|(jsonp)|(^cb$)|(function) - referer配置为同域,请求js获取响应。
- 将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不为空 替换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...
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。