0x00 前言
这段时间jsonp漏洞再一次证明了一个微小的漏洞,经过攻击者的巧妙而持久的利用,也会对企业和用户造成巨大的危害。而本文将要介绍的JS泄露敏感信息问题也是如此,攻击者不仅可以轻松收集用户手机号,姓名等隐私信息,更可以借此攻入企业后台甚至是getshell。本文将通过一些公开和未公开的漏洞详细阐述此类漏洞。
0x01 漏洞成因
JavaScript作为一种相当简单但功能强大的客户端脚本语言,本质是一种解释型语言。所以,其执行原理是边解释边运行。上述特性就决定了JavaScript与一些服务器脚本语言(如ASP、PHP)以及编译型语言(如C、C++)不同,其源代码可以轻松被任何人获取到。一些粗心的开发者将各式敏感信息存储在JavaScript脚本中,由于JS的特性,攻击者可以对这些信息一览无余,从而导致对WEB服务和用户隐私造成不同程度的威胁。
0x02 漏洞分类及利用
根据泄露的内容、利用方式以及带来的危害不同,大致可以将JS敏感信息泄露分为以下三类:
1. JS文件泄露后台管理敏感路径及API
此类问题主要存在于后台登陆页面以及类似网页内引入的JS文件中。在企业渗透测试时如果遇到后台,在SQL注入或者是路径爆破都试过,但是仍然无法进入后台时。根据此类漏洞,说不定登陆页面下引入的js文件暴露的后台路径会成为突破口。如果某台的某一个页面没有对是否登陆状态做验证,攻击者就可以一次未授权访问这些暴露的API,实现篡改前台内容甚至是getshell。 下面这个某大型互联网服务提供商的房产后台页面引入的js文件泄露后台接口信息,就是非常典型的例子:
(信息泄露源是房产管理登陆后台页面下的common.js)
(js文件中的urlMap对象内容完整的泄露了后台所有功能实现的API,因此攻击者无需登陆就可以进行未授权操作)
早在12年gainover便在乌云漏洞报告平台上给出了很好的实例: WooYun: PKAV腾讯专场 – 2. 腾讯产品交流平台的一个js文件泄漏了一个url之后
2. 页面内JS泄露http-only保护的cookie
因为此类问题利用方式和造成的危害与即将谈论到的第三类问题不同,所以把这类问题单独拿出来讲一讲。XSS常见利用手段是劫持用户cookie并登陆其账户,但添加了http-only标记的cookie客户端脚本无法读取,该项技术已经成为减小XSS带来的危害的重要手段。部分厂商更是因此降低了对XSS的评级。不过千里之堤溃于蚁穴,可爱的程序员直接将受http-only保护的cookie写入页面,导致通过利用crossdoamin.xml配置不当等漏洞,攻击者可以轻松跨域读取到受保护的cookie,攻击者登陆用户账户登录的梦想得以延续。其实在乌云Zone中WEB前端安全大牛EtherDream早已从漏洞成因检测等方面撰文进行了阐述。
(知道首页js内直接输出受保护的BDUSS)
乌云上也不乏良好的实例,比如下面这个由于百度知道crossdomain配置不当,再结合知道页面内的js直接输出用户的BDUSS,成功绕过了http-only的保护: WooYun: 我是如何窃取到百度受http-only保护的cookie的(3)(附简单POC)
3. 页面内JS以及AJAX请求泄露用户敏感信息
经过以往测试经验的归纳,此类漏洞常见该类型的泄露常见于网站评论功能实现处。其实该类型的漏洞比通过jsonp漏洞收集用户敏感信息来的更加快捷容易。由于程序员疏忽直接在页面的js以及AJAX请求返回的内容中输出参与评论用户的敏感信息,导致攻击者可以轻松获取用户的手机号,真实姓名,注册邮箱,住址甚至有可能获取用户手机的IMEI,和抽奖和抽中的游戏礼包号。泄露内容千奇百怪,遇到此类问题时,看着泄露的内容时常会被雷到。从个人的测试经验来看,涉及的厂商范围广泛,从某搜索服务提供商下的订票网站、在线挂号网站到某公司旗下的大型游戏网站都发现过此类漏洞,其他厂商肯定也存在该类问题。不需要SQL注射脱库,黑产哥通过编写爬虫就能大批量的获取用户的敏感信息,利用难度小,危害却很大。
(某FM类应用评论处泄露匿名评论用户邮箱,手机号)
(某大型游戏网站抽奖页面下泄露获奖用户礼包兑换号码)
(某应用商店获取评论内容ajax请求中泄露用户imei和真实ip)
乌云上也有相关的例子(第一个告诉我们获取音乐人明星的手机号和QQ号不是梦,第二个告诉我们网上看病,隐私会被人看光光):
WooYun: 百度某站一处设计缺陷导致部分用户手机号与邮箱等信息泄漏
0x03 漏洞挖掘和检测
不管是第一、二还是第三种漏洞,他们都有一个共同的检测方式,那就是查看源代码然后在源代码中搜索 (Ctrl+F) 常见的泄露点关键词”phone”,”email”,”ip”等等。当然不同情况还是需要不同对待的:
对于第一种泄露形式的检测相对容易但是可能利用可能相对吃力,在碰到企业后台或者是类似服务时,查看页面也引入的js文件,在文件中查找”.html”,”.do”,”.action”等关键词会帮助快速发觉此类问题,不过对于相对复杂的情况还是需要沉下心将每一个js耐心的看过去。认真,你就赢了。
对于第二、三种泄露,在查看源代码时搜索页面内脚本是否存在泄露得同时,可能还需要检测ajax响应的内容,所以通过Fiddler这类抓包软件查看服务器响应的内容来查找,也绝对是手动查找该类型漏洞的最好方式。
漏洞检测自动化绝对是我们的终极目标,对于该类问题的自动化检测,白帽子EtherDream的文章(http://drops.wooyun.org/tips/2834)给了我们不错的启发,通过编写Chrome插件我们可以添加检测规则,即上文提到的常见关键词,在正常浏览页面的同时挖掘漏洞,一举两得。
0x04 漏洞修复和防范
此类漏洞修复相对容易,在明白了JavaScript的特性以后,不把此类敏感信息直接存储进页面内的js和ajax请求响应内容中就可以解决这类问题。不过根除此类问题之道还是需要程序员提高安全意识,从泄露用户隐私信息到威胁企业安全,再小的问题也会带来蝴蝶效应,毕竟安全无小事。
0x05 参考资料
(1] 《WEB之困》,Zalewski,机械工业出版社 (2] 《HttpOnly 隐私嗅探器》,EtherDream,乌云知识库