通达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

1.png

  1. 原始的webroot中文件使用zend加密压缩,此处需要使用zend解密工具批量解密为正常的PHP文件

2.png

补丁对比

  1. 对比更新前后的webroot文件

3.png

  1. 如图更新对$UID进行初始化,并判断是否为0

4.png

5.png

由此可见UID是个关键参数,筛选文件对比结果,很清晰判断出更新补丁中哪些文件有相关逻辑。

代码分析

​ 重点对更新文件进行分析,使用编辑器导入web项目,分析版本11.4的代码逻辑。

一、Logincheck_code

6.png

$UID有POST请求参数获取,访问该URL共需两个参数:UID & CODEUID;

继续向下分析,中间的判断过程,仅对用户登陆安全登陆限制进行了判断,在如下位置后,直接存入对应UID的SESSION。

7.png

二、跟踪判断如何构造CODEUID参数

​ 更新文件中,login_code去掉了一些方法,从内容看出如果login_codeuid为空,访问该php时,会有getUniqid()返回CODEUID。

8.png

三、构造Logincheck_code访问,获取登陆cookie
  1. 获取code_uid

9.png

  1. 构造POST请求,获取cookie,默认情况下,UID=1是admin账号,为系统管理员。

10.png

11.png

  1. 使用Cookie访问系统

12.png

修复建议

  1. 未更新补丁前,备份logincheck_code.php,将该文件移除webroot目录;或使用WAF等安全产品,禁止logincheck_code.php访问

  2. 更新官方补丁

总结

  1. 需要验证历史版本的从11.0更新时,可以逐步版本更新,备份webroot文件夹,验证对应版本是,更换webroot即可

  2. 第一次尝试对比补丁去验证漏洞,对于更新点比较少的应用,可以很快定位

  3. 登陆验证类功能点,只做状态判断,尽量不要附带其他功能

Ps: 文章审核了快3个月。。。。。。