通达OA任意用户登录漏洞分析
前言
4月20日,阿里云漏洞预警,通达OA任意用户登录漏洞,链接如下:https://help.aliyun.com/noticelist/articleid/1060277736.html
准备
某盘下载的TDOA11.0.exe
文件对比工具(DiffMerge等)
zend解密小工具
部署
1. 直接安装TDOA11.0.exe,版本号为11.0.190911
2. 打开“通达应用服务控制中心”启动服务,测试web是否能正常访问
3. 使用OfficeAuto更新程序到11.4.200323 ,备份webroot文件夹
4. 更新到11.4.200417,拷贝webroot
- 原始的webroot中文件使用zend加密压缩,此处需要使用zend解密工具批量解密为正常的PHP文件
补丁对比
- 对比更新前后的webroot文件
- 如图更新对$UID进行初始化,并判断是否为0
由此可见UID是个关键参数,筛选文件对比结果,很清晰判断出更新补丁中哪些文件有相关逻辑。
代码分析
重点对更新文件进行分析,使用编辑器导入web项目,分析版本11.4的代码逻辑。
一、Logincheck_code
$UID有POST请求参数获取,访问该URL共需两个参数:UID & CODEUID;
继续向下分析,中间的判断过程,仅对用户登陆安全登陆限制进行了判断,在如下位置后,直接存入对应UID的SESSION。
二、跟踪判断如何构造CODEUID参数
更新文件中,login_code去掉了一些方法,从内容看出如果login_codeuid为空,访问该php时,会有getUniqid()返回CODEUID。
三、构造Logincheck_code访问,获取登陆cookie
- 获取code_uid
- 构造POST请求,获取cookie,默认情况下,UID=1是admin账号,为系统管理员。
- 使用Cookie访问系统
修复建议
未更新补丁前,备份logincheck_code.php,将该文件移除webroot目录;或使用WAF等安全产品,禁止logincheck_code.php访问
更新官方补丁
总结
需要验证历史版本的从11.0更新时,可以逐步版本更新,备份webroot文件夹,验证对应版本是,更换webroot即可
第一次尝试对比补丁去验证漏洞,对于更新点比较少的应用,可以很快定位
登陆验证类功能点,只做状态判断,尽量不要附带其他功能
Ps: 文章审核了快3个月。。。。。。