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