通达OA11.6 preauth RCE 0day分析

 

0x00关于本文

这漏洞我7.4挖出来交给先知,6号审核通过
但是迟迟不发奖金,再留言就又是审核中,一直审核到现在
(怀疑是因为厂商7.5的新版本就不收影响了,阿里觉得亏了?)
护网听说这玩意爆出来了,群里面看知道创宇都有漏洞详情了,感觉吧这个烂在我手上显得没价值,倒不如在EXP流传的到处都是之前,放出来找找乐子
需要者自取(注意,该EXP不是无损EXP,会删除auth.inc.php让OA无法正常工作

这个漏洞结合了任意文件删除漏洞以及文件上传漏洞,需要两个漏洞配合才可以实现preauth rce
复现需要的11.6安装我传到Google上面了:https://drive.google.com/file/d/1L3wG58EQpCufwqoTRP3lFq7IY6PYYqZ-/view?usp=sharing
需要者自取

0x01貌似鸡肋的任意文件删除漏洞

首先漏洞是在/module/appbuilder/assets/print.php里面
一眼看过去,就是把get里面的guid传过去然后删除掉
但是任意文件删除漏洞除了搞破坏有什么卵用呢,反正一眼看过去是没什么卵用的

0x02化腐朽为神奇的身份绕过

尽管删文件看似只能做破坏,但在某些时候也能绕过一些认证!这是怎么做到的呢?
我们来看看通达OA里常用来做身份校验的代码
这里呢,简单来讲就是把auth.inc.php给包含进来,如果没有对应session的话,auth.inc.php就会作为“拦路虎”,让用户去登陆,但是删掉会怎么样?
这里就要看php里面include和require的区别了
这两个东西看起来很相似,都是包含嘛,但是稍稍学过洋文的都知道,include的意思指的是包含,而require却有要求的意思,在这里就可以看出点区别了。
如果要包含的文件找不着,include就索性跳过去了,而require是要求,感觉更加强烈一些,找不着文件就撒泼打滚fatal error停止不前了。
而恰巧通达OA里面用的都是include,于是如果发现auth.inc.php失踪了,就会直接跳过去!
因此我们只需要利用前面的漏洞,删掉auth.inc.php,即可跳过通达OA里面大部分身份验证!

0x03最后一击!变量覆盖&任意文件上传

除了身份绕过,我们还要找到一个漏洞点,来getshell

这里我们看到general/data_center/utils/upload.php
这前面包含的header.inc.php会将$_REQUEST中的所有东西注册成变量
(或者是别的被include进来的文件,因为一个月之前挖掘的,现在记不真切了)
这样的话我们就有玩变量覆盖的可能性了!
这里呢我们直接跳到漏洞点,就是最下面那个else
(为什么直接跳呢?因为其实老版本的代码我删了,这点是我拿漏洞报告里面的代码片段粘的,新版本把这个改的面目全非,而我又忘了代码怎么弄的了,所以直接讲这个漏洞点,想研究的自己搞来分析)

这里则个$s_n是这样的,如果开头不是"{"那么$s_n前面加上一个$repkid,那么就可以通过变量覆盖,传入参数覆盖$repkid,加入../跳到别的目录去
(为什么要跳到别的目录呢?因为通达OA的nginx配置中,上传文件所在的attachment目录里面的PHP不准访问,因此必须要跳出去)

那么综合上述就可以给出EXP了(在前面给了)

0x04修复方案

删掉这个/module/appbuilder/assets/print.php
或者升级到最新版(11.7)
不要自定义WAF规则拦截,通达OA对$_REQUEST里面的东西的全局过滤,导致黑客可以添加<>之类会被过滤掉的内容来绕过去

0x05吐槽

昨天说深信服的代码质量不佳,是因为里面有许多奇奇怪怪的用法
而这个通达OA的代码质量,只能用惨不忍睹来形容
我就说四点
1.首先代码里面有的时候会有些调试用的代码片段,莫名其妙打出某个变量,突兀地出现在屏幕上面
2.接着呢,这里面有许多没用的PHP文件,散乱地堆在那儿
3.还有,代码里面有些地方用了框架,有些地方没有用框架。然后代码各种风格都不统一,强行赛在一块的
4.里面有很多不安全的写法,比如说直接echo一个$_GET参数出来,结果又是全局替换过滤了GET参数的,似乎是防护了问题,但是众所周知防护XSS从根本上来说还是要靠编码,这种全局过滤的歪路子,只要哪里没限制好就会出问题

评论

此博客中的热门博文

局域网监控软件WFilter ICF 鸡肋0day RCE漏洞挖掘

别想偷我源码:通用的针对源码泄露利用程序的反制(常见工具集体沦陷)

复现基于eBPF实现的Docker逃逸