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.
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.
Cambie la ip aquí a 0.0.0.0 y la
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.