MENU

通达OA 11.6 任意文件删除+任意文件上传

August 19, 2020 • PHP

通达OA 11.X 任意文件删除+任意文件上传

分析

文件位置:webroot/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();
}

此文件没有引入登录校验文件,所以可以在前台访问,代码问题主要出现在Line4-8

  1. 第四行获取get传入的参数,拼接到源来的log目录
  2. 第六行判断文件是否存在,然后对文件内容进行反序列化
  3. 第8行进行了删除文件操作

因为第四行直接拼接了文件路径所以可以通过../来跳出log目录,导致可以删除任意文件

再看/general/data_center/utils/upload.php

<?php

require_once 'inc/auth.inc.php';
include_once './utils.func.php';
$HTML_PAGE_TITLE = _('�ϴ��ļ�');
include_once 'inc/header.inc.php';
$error = '';
$msg = '';
if (strstr($filename, '..') || !td_path_valid($filename)) {
    echo '{';
    echo 'new_name:\'' . $_FILES['FILE1']['name'] . '\',' . "\n";
    echo 'error: \'' . $error . '\',' . "\n";
    echo 'msg: \'' . $msg . '\'' . "\n";
    echo '}';
}

首先引入了登录认证inc/auth.inc.php

在line16判断是否传入action为upload在line75-81执行文件上传操作
-w925

Line79:
$s_n = $repkid . '_' . $s_n;对文件名进行了拼接操作而$repkid可以通过变量覆盖赋值为.<>./来跳过td_move_uploaded_file中对后缀名检测的检测,虽然通达的过滤规则中不允许出现..但在获取GET参数时进行了一次strip_tags操作,所以可以在..之间加入一些特殊标签来绕过。

Leave a Comment

已有 1 条评论
  1. 123 123

    可以问一下老哥这源码哪搞的吗,通达OA的源码不是ZendGuard加密的吗