javascript审计分析之-前端用户任意密码登陆漏洞
javascript审计分析之-前端用户任意密码登陆漏洞
1.审计前端javascript的一些技巧
这里如何去注意技巧,首先是查看源代码,看到很多函数,先理解一下整个函数过程,然后再去对函数之间的关系进行梳理。
2.审计哪些函数可以被调用,哪些不能被调用
可以调用的函数是指当前前端在用户功能上相对应的函数,这里需要注意是功能函数的实现方法,不能被调用的是指函数之间的参数引用多处,有的函数在APP端,那么在网站端接口,如果进行调用,那么意义不大,就像做白盒代码审计,去回溯静态跟踪,你可能也会忽略掉对APP端的代码审计,也不去考虑后台的函数漏洞,只会考虑前端的白盒代码审计。
这里就好比是3扇门,第一扇门是登陆的函数,而有时候我们需要去利用的第二扇门的钥匙,在第一扇门触发,最终才能打开第三扇门,而第一扇门是有验证的,那么不确保第二扇门一定有验证,所以这就造成了漏洞。
3.函数与参数之间的逻辑关系
这里就是两者之间的引用关系,函数对应的参数指向了多处,那么在很多函数会有一系列的逻辑判断,判断用户是否正常去触发这些功能函数,就好比一个用户按照正常逻辑,输入用户和密码,还有验证码,然后点击登陆,就进入后台,就是这样一个方法,我们可以把用户这一系列的操作方法理解为一个动作,如果用户是明文,那么长时间的网页交互,可能会造成什么漏洞呢,那么很明显,可能就会造成COOKIE记忆漏洞(案例4)
4.全文通读代码和单函数通读代码的区别
全文通读是指理解整个前端的函数代码,然后进行分析这是耗时比较长的,但是能够把整个前端可能出现的问题进行分析并利用,单函数,就是只是对某个前端的函数进行分析那么效果就是也可以利用,但是你没有理解函数对应的参数与其他的关系,那么这样做效果是不好的。
本次漏洞分析
前端login()函数代码段存在问题,导致用户任意密码登陆漏洞
大量用户敏感信息泄漏漏洞
通过输入错误的用户密码,弹出信息,用户名或者密码错误
首先打开源代码进行分析
这里需要注意,默认调用的是checkUserIsLogin()函数
定位到checkUserIsLogin()函数的代码段
可以看到这里base64进行了实例化
checkUserIsLogin()函数分别实现了对用户名,密码,验证码的判断
注意TYPE类别这里,这里是JSON的参数去接收数据
注意这里“
if(result.hasLogin){ if(confirm("该账号已经登陆,确定重新登录吗?")){ login(); }else{ $("#pageloading").hide();
该账号已经登陆?
那么这里我们可以理解成第二层
已经过了校检,那么第一层就应该是这里
”var result = stringToJson(data); if(result.erroLogin=="验证码错误") { alert(result.erroLogin); changeCode(); document.getElementById("validateCode").value = "";
else { login();
注意这里
否则触发login函数
那我们先尝试,正确的密码:走一遍, 看看回显
返回信息{hasLogin:false}
经过测试,无论正确和错误密码都会返回{hasLogin:false}
点击确定还是用户和密码都会提示错误,因为密码根本不对
那如果我们直接输入错误的密码进行登陆,是肯定不行的
这是第一层的强验证
如果这样都可以登陆的话,那么证明代码写得是不行的
那么既然第一层过不了
我们就看看第二层,看看login函数的代码段
我们可以理解成login函数是过了校检的函数,可以这样理解
那么这里也是校检用户和密码,注意这里
$("#pageloading").hide(); if(result.result == '0'){ document.location.href="/ehmsexp"; } else { alert(result.result); changeCode(); document.getElementById("validateCode").value = ""; } }, beforeSend : function() { $("#pageloading").show(); }, error : function() { $("#pageloading").hide(); alert("登录出现错误!");
这里result结果为0,就可以登陆系统
后面得到结果代码层,明显没有校检用户TOKEN
仅仅是}不为0, else { alert(result.result);
否则弹出结果错误信息
那么这样一来,对我们而言,就有了条件
我们大概理清一下思路
1,第一层错误的密码123456,密码肯定过不了(强验证肯定的)
2,那么就利用第二层login函数过校检(这里是必须要过真校检,所以有条件,假校检是过不了的)
3,我们利用的点,就在第二层,所以必须到第二层触发
接着,那么思路应该是直接把checkUserIsLogin()函数换成login函数
我们进行替换
checkUserIsLogin()换成login函数
进行抓包
抓包后发现代码变了
i=1&code=1wjhi&username=d2FuZ2ppbmc%3D&password=MTIzNDU2&method=home
代码走到了这里
这里为0就可以逃过,我们试试
那么我们就使用最传统的,登陆一次,打开两个页面
来尝试
先输入正确的密码,触发一次,登陆过校检
接着找login()函数代码存在的问题
接着再打开
把checkUserIsLogin换成login()函数
接着把result换成0,提交
我们发现就直接登陆进去了,密码都是错的,也能够进入,漏洞原理很简单
因为第一次我们是过了真校检,传了数据,第二次login函数这里就没有二次的校检了
从而导致了漏洞
<< 上一篇