원격 코드 실행 취약점 분석에 납을 포함 숙달 OA 임의의 파일 업로드 및 사용 파일

머리말

처음 제출에서, 코드 감사 초보자는 문제 거물 분석 과정 지침의 많은있다

이 취약점에, 사용 패턴은 두 가지 유형의 로그 파일은 기본적으로있는 파일이 바이 패스 인증에 업로드 한 다음 파일에 포함되어 포함되어 있습니다. 첫 번째 사용 패턴 아무것도 나중에 인증을 우회하고 두 번째 경로는 기록에 대한 기사를 작성, 파일을 비트 평균을 업로드 할 말 없습니다.

파일 업로드

입력 파일 /ispirit/im/upload.php

$P = $_POST["P"];
if (isset($P) || ($P != "")) {
    ob_start();
    include_once "inc/session.php";
    session_id($P);
    session_start();
    session_write_close();
}
else {
    include_once "./auth.php";
}

여기에 주요 변수가 P를 요구, P는, 다음 세션을 가져가 비어 있지, 그렇지 않으면 auth.php 인증을 입력

$DEST_UID = $_POST["DEST_UID"];
$dataBack = array();
if (($DEST_UID != "") && !td_verify_ids($ids)) {
    $dataBack = array("status" => 0, "content" => "-ERR " . _("接收方ID无效"));
    echo json_encode(data2utf8($dataBack));
    exit();
}

if (strpos($DEST_UID, ",") !== false) {
}
else {
    $DEST_UID = intval($DEST_UID);
}

여기서, 라인 (20)은 32 DEST_UID 매개 변수를 여기에 일반적으로이 매개 변수의 요구가 0-9을 시작하는 모든 문자열이 될 것을 의미 td_verify_ids 여기에 참여 비워 둘 수 없습니다 필요 기술 된 줄 수 있습니다.

if ($DEST_UID == 0) {
    if ($UPLOAD_MODE != 2) {
        $dataBack = array("status" => 0, "content" => "-ERR " . _("接收方ID无效"));
        echo json_encode(data2utf8($dataBack));
        exit();
    }
}

DEST_UID가 0이면, 다음 UPLOAD_MODE 값 2, 또는 다른 에러이어야이 수단

그런 다음 아래로 계속

if (1 <= count($_FILES)) {

    $ATTACHMENTS = upload("ATTACHMENT", $MODULE, false);

    $ATTACHMENT_ID = substr($ATTACHMENTS["ID"], 0, -1);
    $ATTACHMENT_NAME = substr($ATTACHMENTS["NAME"], 0, -1);
}
else {
    $dataBack = array("status" => 0, "content" => "-ERR " . _("无文件上传"));
    echo json_encode(data2utf8($dataBack));
    exit();
}

당신은 파일 업로드 업로드를 입력해야하는 경우, 그렇지 않으면 오류가없는 파일 업로드

업로드 기능, 결과는 배열 첨부 파일을 반환 구현 utility_file.php 라인 1665에 업로드 기능에 따라

$ ATTACHMENTS 내부 [ "ID"는 상기 기능 add_attach로부터 반환되는 값이다.

라인 1854에 add_attach 기능을 수행

function add_attach($SOURCE_FILE, $ATTACH_NAME, $MODULE, $YM, $ATTACH_SIGN, $ATTACH_ID)
{
    $ATTACH_PARA_ARRAY = TD::get_cache("SYS_ATTACH_PARA");
    $ATTACH_POS_ACTIVE = $ATTACH_PARA_ARRAY["SYS_ATTACH_POS_ACTIVE"];
    $ATTACH_PATH_ACTIVE = $ATTACH_PARA_ARRAY["SYS_ATTACH_PATH_ACTIVE"];

    if (!file_exists($SOURCE_FILE)) {
        return false;
    }

    if ($MODULE == "") {
        $MODULE = attach_sub_dir();
    }

    if ($YM == "") {
        $YM = date("ym");
    }

    $PATH = $ATTACH_PATH_ACTIVE . $MODULE;
    if (!file_exists($PATH) || !is_dir($PATH)) {
        @mkdir($PATH, 448);
    }

    $PATH = $PATH . "/" . $YM;
    if (!file_exists($PATH) || !is_dir($PATH)) {
        @mkdir($PATH, 448);
    }

    $ATTACH_NAME = (is_default_charset($ATTACH_NAME) ? $ATTACH_NAME : iconv("utf-8", MYOA_CHARSET, $ATTACH_NAME));
    $EXT_NAME = substr($ATTACH_NAME, strrpos($ATTACH_NAME, "."));
    $ATTACH_NAME = str_replace($EXT_NAME, strtolower($EXT_NAME), $ATTACH_NAME);
    $ATTACH_FILE = (MYOA_ATTACH_NAME_FORMAT ? md5($ATTACH_NAME) . ".td" : $ATTACH_NAME);
    $ATTACH_ID = mt_rand();
    $FILENAME = $PATH . "/" . $ATTACH_ID . "." . $ATTACH_FILE;

    if (file_exists($FILENAME)) {
        $ATTACH_ID = mt_rand();
        $FILENAME = $PATH . "/" . $ATTACH_ID . "." . $ATTACH_FILE;
    }

    $AID = mysql_insert_id();
    $ATTACH_ID_NEW = $AID . "@" . $YM . "_" . $ATTACH_ID;
    return $ATTACH_ID_NEW;
}

우리는 반환 값 $ ATTACH_ID_NEW 세 부분으로 $ 원조를 볼 수 있습니다, $ YM, $ ATTACH_ID

다음은 파일 이름과 경로의 $ ATTACH_ID_NEW 부분 만주의. 전체 경로는 모든 백 $의 SYS_ATTACH_PATH_ACTIVE에 도달 한 후 $ YM 접합 첫 스플 라이스 $ 모듈 $ 경로를 볼 수 있습니다 $ PATH를,이다

utility_file.php 라인 403

정의 값 $ SYS_ATTACH_PATH_ACTIVE

$SYS_ATTACH_PATH_ACTIVE = MYOA_ATTACH_PATH2;

td_config.php 라인 (134)에 추적

define("MYOA_ATTACH_PATH2", $ATTACH_PATH2);

여기에 상수 MYOA_ATTACH_PATH2을 정의 내용은 $ ATTACH_PATH2입니다

3 행은 라인 (15)에 켜져

$ROOT_PATH = (isset($_SERVER["DOCUMENT_ROOT"]) ? $_SERVER["DOCUMENT_ROOT"] : "");

if ($ROOT_PATH == "") {
    $ROOT_PATH = str_replace("\\", "/", realpath(dirname(__FILE__) . "/../"));
}

if (substr($ROOT_PATH, -1) != "/") {
    $ROOT_PATH .= "/";
}
$ATTACH_PATH2 = realpath($ROOT_PATH . "../") . "/attach/";

지금 여기에 /inc/../../다음 바느질/attach/

단지 숫자 1, 2의 같은 그런 UPLOAD_MODE 값, 파일 이름 및 경로 부분을 반환 할 수 있습니다

파일에 포함될 취약점

이것은 쉬운 부분이다

if ($json) {
    $json = stripcslashes($json);
    $json = (array) json_decode($json);

    foreach ($json as $key => $val ) {
        if ($key == "data") {
            $val = (array) $val;

            foreach ($val as $keys => $value ) {
                $keys = $value;
            }
        }

        if ($key == "url") {
            $url = $val;
        }
    }

    if ($url != "") {
        if (substr($url, 0, 1) == "/") {
            $url = substr($url, 1);
        }

        if ((strpos($url, "general/") !== false) || (strpos($url, "ispirit/") !== false) || (strpos($url, "module/") !== false)) {
            include_once $url;
        }
    }

    exit();
}

$ JSON JSON 파라미터 값의 형식을 취하고, 다음 배열로 변환 키가 비어 URL이 없을 때 URL을 포함 include_once 문이며

마지막으로,
감사 페이로드 갱스터 공유가
부착 갱스터 GitHub의  https://github.com/jas502n/OA-tongda-RCE

추천

출처www.cnblogs.com/0daybug/p/12573941.html