×

新闻动态 资料下载 源码审核

javascript审计分析之-前端用户任意密码登陆漏洞

0x_www 0x_www 发表于2022-05-23 14:33:49 浏览702 评论0

抢沙发发表评论

javascript审计分析之-前端用户任意密码登陆漏洞


1.审计前端javascript的一些技巧


这里如何去注意技巧,首先是查看源代码,看到很多函数,先理解一下整个函数过程,然后再去对函数之间的关系进行梳理。


2.审计哪些函数可以被调用,哪些不能被调用


可以调用的函数是指当前前端在用户功能上相对应的函数,这里需要注意是功能函数的实现方法,不能被调用的是指函数之间的参数引用多处,有的函数在APP端,那么在网站端接口,如果进行调用,那么意义不大,就像做白盒代码审计,去回溯静态跟踪,你可能也会忽略掉对APP端的代码审计,也不去考虑后台的函数漏洞,只会考虑前端的白盒代码审计。


这里就好比是3扇门,第一扇门是登陆的函数,而有时候我们需要去利用的第二扇门的钥匙,在第一扇门触发,最终才能打开第三扇门,而第一扇门是有验证的,那么不确保第二扇门一定有验证,所以这就造成了漏洞。


3.函数与参数之间的逻辑关系


这里就是两者之间的引用关系,函数对应的参数指向了多处,那么在很多函数会有一系列的逻辑判断,判断用户是否正常去触发这些功能函数,就好比一个用户按照正常逻辑,输入用户和密码,还有验证码,然后点击登陆,就进入后台,就是这样一个方法,我们可以把用户这一系列的操作方法理解为一个动作,如果用户是明文,那么长时间的网页交互,可能会造成什么漏洞呢,那么很明显,可能就会造成COOKIE记忆漏洞(案例4)


4.全文通读代码和单函数通读代码的区别


全文通读是指理解整个前端的函数代码,然后进行分析这是耗时比较长的,但是能够把整个前端可能出现的问题进行分析并利用,单函数,就是只是对某个前端的函数进行分析那么效果就是也可以利用,但是你没有理解函数对应的参数与其他的关系,那么这样做效果是不好的。



本次漏洞分析

前端login()函数代码段存在问题,导致用户任意密码登陆漏洞

大量用户敏感信息泄漏漏洞

QQ截图20220523143725.jpg



通过输入错误的用户密码,弹出信息,用户名或者密码错误

首先打开源代码进行分析


这里需要注意,默认调用的是checkUserIsLogin()函数

定位到checkUserIsLogin()函数的代码段

QQ截图20220523143922.jpg

 

可以看到这里base64进行了实例化

QQ截图20220523143955.jpg




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函数

那我们先尝试,正确的密码:走一遍, 看看回显


QQ截图20220523144047.jpg



QQ截图20220523144108.jpg



返回信息{hasLogin:false}

经过测试,无论正确和错误密码都会返回{hasLogin:false}

点击确定还是用户和密码都会提示错误,因为密码根本不对

那如果我们直接输入错误的密码进行登陆,是肯定不行的

这是第一层的强验证

如果这样都可以登陆的话,那么证明代码写得是不行的


那么既然第一层过不了

我们就看看第二层,看看login函数的代码段


333.JPG


我们可以理解成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函数


QQ截图20220523144332.jpg

我们进行替换

checkUserIsLogin()换成login函数

进行抓包


QQ截图20220523144404.jpg



抓包后发现代码变了





i=1&code=1wjhi&username=d2FuZ2ppbmc%3D&password=MTIzNDU2&method=home

代码走到了这里



QQ截图20220523144454.jpg



这里为0就可以逃过,我们试试

 

那么我们就使用最传统的,登陆一次,打开两个页面

来尝试

先输入正确的密码,触发一次,登陆过校检

接着找login()函数代码存在的问题


接着再打开

checkUserIsLogin换成login()函数

接着把result换成0,提交

QQ截图20220523144549.jpg




我们发现就直接登陆进去了,密码都是错的,也能够进入,漏洞原理很简单

因为第一次我们是过了真校检,传了数据,第二次login函数这里就没有二次的校检了

从而导致了漏洞


少长咸集