[Copa Wangding 2020 Xuanwu Group] SSRFMe

Prefacio

Un tema SSRF muy familiar. La auditoría de código inicial ahora se ha convertido en un ejemplo de cómo omitir el filtrado 127.0.0.1 en muchos tutoriales SSRF, pero la replicación maestro-esclavo de Redis detrás de este tema es algo que no sé. Sucedió que hoy un maestro y yo discutimos esta pregunta, así que hice esta pregunta por cierto y aprendí sobre la SSRF de la replicación maestro-esclavo de redis.

WP

La primera es la conocida auditoría de código:

<?php
function check_inner_ip($url)
{
    
    
    $match_result=preg_match('/^(http|https|gopher|dict)?:\/\/.*(\/)?.*$/',$url);
    if (!$match_result)
    {
    
    
        die('url fomat error');
    }
    try
    {
    
    
        $url_parse=parse_url($url);
    }
    catch(Exception $e)
    {
    
    
        die('url fomat error');
        return false;
    }
    $hostname=$url_parse['host'];
    $ip=gethostbyname($hostname);
    $int_ip=ip2long($ip);
    return ip2long('127.0.0.0')>>24 == $int_ip>>24 || ip2long('10.0.0.0')>>24 == $int_ip>>24 || ip2long('172.16.0.0')>>20 == $int_ip>>20 || ip2long('192.168.0.0')>>16 == $int_ip>>16;
}

function safe_request_url($url)
{
    
    

    if (check_inner_ip($url))
    {
    
    
        echo $url.' is inner ip';
    }
    else
    {
    
    
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        $output = curl_exec($ch);
        $result_info = curl_getinfo($ch);
        if ($result_info['redirect_url'])
        {
    
    
            safe_request_url($result_info['redirect_url']);
        }
        curl_close($ch);
        var_dump($output);
    }

}
if(isset($_GET['url'])){
    
    
    $url = $_GET['url'];
    if(!empty($url)){
    
    
        safe_request_url($url);
    }
}
else{
    
    
    highlight_file(__FILE__);
}
// Please visit hint.php locally.
?>

Encuentre una manera de visitar hint.php con SSRF. La más simple es usar 0.0.0.0 para omitir, o puede usar la diferencia en los resultados obtenidos por el análisis de host para omitir. Aquí utilizo 0.0.0.0 para omitir.
El siguiente paso es una pista, php:

<?php
if($_SERVER['REMOTE_ADDR']==="127.0.0.1"){
    
    
  highlight_file(__FILE__);
}
if(isset($_POST['file'])){
    
    
  file_put_contents($_POST['file'],"<?php echo 'redispass is root';exit();".$_POST['file']);
}

Mi primera reacción fue probar la escritura de file_put_contents para escapar de la salida. Acabo de reproducir este material hace unos días. Sostuve varias posturas en mi mano y lo pensé durante unos segundos. Luego me di cuenta de que no podía llamarlo. Debería ser un problema de permisos, sin permiso para escribir archivos.
Pero dada la contraseña de redis, debería ser redis. Esta pregunta examina la replicación maestro-esclavo de redis.
Artículo de referencia:
Replicación maestro-esclavo de
Redis El estudio de seguridad de Redis señala el
análisis del uso de SSRF en Redis

La operación específica es la siguiente. Descargue estos dos proyectos primero:
Redis Rogue Server
redis-ssrf
usa principalmente los archivos 2 py en redis-ssrf y el archivo .so en redis-rogue. Copie el archivo .so en el directorio redis-ssrf.
Entonces haz un cambio mágico. Inserte la descripción de la imagen aquí
Complete la ip de su VPS para lhost y el puerto para lport.Este puerto es el mismo que el puerto abierto en rogue-server.py. comando Complete el comando a ejecutar.
Inserte la descripción de la imagen aquí
Cambie la ip aquí a 0.0.0.0 y la
Inserte la descripción de la imagen aquí
contraseña es root.
Luego ejecute ssrf-redis.py para generar la carga útil. Luego abra rogue-server.py, luego use la carga útil generada por ssrf-redis.py para codificarlo en URL una vez y luego presione.
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/rfrder/article/details/113651337
Recomendado
Clasificación