subir archivos y el uso de archivos arbitrarios dominio OA que contienen plomo para el análisis de código remoto vulnerabilidad de ejecución

prefacio

En la primera presentación, novato auditoría de código, hay problemas Bigwigs proceso de análisis de una gran cantidad de orientación

En esta vulnerabilidad, los patrones de uso son básicamente dos tipos de archivos de registro contienen un archivo subido a evitar la autenticación y luego se incluye en el archivo. La primera patrones de uso nada que decir, sin pasar por la segunda vía de la autenticación y después subir los archivos una media de bits, escribir un artículo sobre el registro.

carga de archivos

Entrada del archivo /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";
}

A continuación, los principales parámetros requeridos P, P no está vacía a continuación, obtener la sesión, de lo contrario entrar auth.php autenticación

$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);
}

Aquí, la línea 20 a la línea 32, los parámetros de DEST_UID descritos en este documento no necesitan ser vacía, involucrados aquí td_verify_ids, generalmente lo que significa que esta necesidades parámetro a cualquier cadena que comienza 0-9.

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

Esto significa que si DEST_UID es 0, entonces el valor UPLOAD_MODE debe ser 2, o bien un error

Y después continúa por

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();
}

Si tiene que introducir la carga de carga de archivos, de lo contrario una carga de archivos sin errores

Siga función de carga, de acuerdo utility_file.php 1665, que implementa una función de carga, el resultado devuelve un array ADJUNTOS

Dentro $ ADJUNTOS [ "id"] es el valor devuelto por la función add_attach.

Siga add_attach función en la línea 1854

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;
}

Podemos ver el valor de retorno $ ATTACH_ID_NEW de tres partes $ AID, YM $, $ attach_id

Aquí en cuenta, sólo $ ATTACH_ID_NEW parte del nombre de archivo y la ruta. La ruta completa es de $ PATH, donde se puede ver el empalme primera MÓDULO $ $ PATH luego empalmado $ YM, llegando a todos de vuelta $ SYS_ATTACH_PATH_ACTIVE

línea utility_file.php 403

valor definido $ SYS_ATTACH_PATH_ACTIVE

$SYS_ATTACH_PATH_ACTIVE = MYOA_ATTACH_PATH2;

Seguimiento a la línea 134 td_config.php

define("MYOA_ATTACH_PATH2", $ATTACH_PATH2);

Aquí definir constantes MYOA_ATTACH_PATH2, el contenido es $ ATTACH_PATH2

3ª fila se presentó a la línea 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/";

Aquí ahora a /inc/../../la costura a continuación,/attach/

valor UPLOAD_MODE A continuación, sólo como cualquiera de un número 1, 2, puede devolver el nombre del archivo y la sección de trayectoria

Las vulnerabilidades de inclusión de archivos

Esta es la parte más fácil

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();
}

parámetro $ Json json toma un formato de valor, y luego se convierte en una matriz, y cuando la llave no es url vacía es include_once comprende url

Por último,
la carga útil del gángster gracias compartir
adjuntar Gangster GitHub  https://github.com/jas502n/OA-tongda-RCE

Supongo que te gusta

Origin www.cnblogs.com/0daybug/p/12573941.html
Recomendado
Clasificación