duda sobre reto hacking en dvwa: stripslashes()

Iniciado por tecasoft, 15 Octubre 2016, 14:56 PM

0 Miembros y 1 Visitante están viendo este tema.

tecasoft

buenas no soy muy activo en este foro pero me gustaria aprender bastante mas de lo que se.

Estoy con un reto hacking de metasploitable2 en concreto en la parte a nivel web: sql injection me he saltado el nivel low y medium pero el high no.

En concreto me salto lo normal sin proteccion y el mysqli_real_escape_string, pero el nivel high me sale con mysqli_real_escape_string() y stripslashes() habria alguna forma de saltarse esto? es que llevo mas de 1 mes intentandolo pero nada

http://php.net/manual/es/function.mysql-real-escape-string.php

http://php.net/manual/es/function.stripslashes.php


Código (php) [Seleccionar]

<?php     

if (isset($_GET['Submit'])) { 

    
// Retrieve data 

    
$id $_GET['id']; 
    
$id stripslashes($id); 
    
$id mysql_real_escape_string($id); 

    if (
is_numeric($id)){ 

        
$getid "SELECT first_name, last_name FROM users WHERE user_id = '$id'"
        
$result mysql_query($getid) or die('<pre>' mysql_error() . '</pre>' ); 

        
$num mysql_numrows($result); 

        
$i=0

        while (
$i $num) { 

            
$first mysql_result($result,$i,"first_name"); 
            
$last mysql_result($result,$i,"last_name"); 
             
            echo 
'<pre>'
            echo 
'ID: ' $id '<br>First name: ' $first '<br>Surname: ' $last;
            echo 
'</pre>'

            
$i++; 
        } 
    } 

?>



alguien que me heche un cable? y si pudiera saltarme el phpids del dvwa tambien, pues os lo agradeceria. Gracias o guiarme un poco como lo hariais. Estamos en contacto por aqui
http://www.tecasoft.com Un ninja del hacking etico, programacion en html5, css3, javascript, jquery, php, python, c/c++, ensamblador, ingenieria reversa,a auditorias de seguridad, pentesting, exploits

Shell Root

Por eso no duermo, por si tras mi ventana hay un cuervo. Cuelgo de hilos sueltos sabiendo que hay veneno en el aire.

tecasoft

ya veo por lo que parece solo puede sacar la version de la base de datos no? otra pregunta que funciones o patrones soleis utilizar vosotros para protegeros de sql injection y demas ataques a nivel web.

por lo que he podido ver el: ctype_digit se puede utilizar para numeros[0-9], que es mejor que is_numeric que te detecta codigo hexadecimal sino me equivoco.


tambien utilizo mysqli_real_escape_string para filtrar sentencias sql injection.

alguna mas que recomendeis? patrones? algo porfa que hoy estoy motivado jejej
http://www.tecasoft.com Un ninja del hacking etico, programacion en html5, css3, javascript, jquery, php, python, c/c++, ensamblador, ingenieria reversa,a auditorias de seguridad, pentesting, exploits

sirdarckcat

No hay ninguna vulnerabilidad en ese código.

El stripslashes no importa mucho, lo que podrias saltarte es el mysql_real_escape_string en algunos casos (si el cliente cree que esta usando un charset y el servidor otro). Sin embargo, no creo eso es lo que pasa en ese nivel de dvwa.

Y de todas formas, incluso si la vulnerabilidad con el charset fuera explorable en ese servidor, no serviria porque verifican el $id con is_numeric(). No hay (segun yo) ninguna manera de saltarse eso.

tecasoft

ok, gracias otra cosa que funciones de php podria utilizar para proteger mis aplicaciones ante sql injection:

1. mysqli_real_escape_string

2. ctype_digit.

y cuales podria mas utilizar? patrones? o algo? que mis usuarios puedan dejar comentarios por ejemplo en una web
http://www.tecasoft.com Un ninja del hacking etico, programacion en html5, css3, javascript, jquery, php, python, c/c++, ensamblador, ingenieria reversa,a auditorias de seguridad, pentesting, exploits

.:UND3R:.

Cita de: tecasoft en 17 Noviembre 2016, 19:05 PM
ok, gracias otra cosa que funciones de php podria utilizar para proteger mis aplicaciones ante sql injection:

1. mysqli_real_escape_string

2. ctype_digit.

y cuales podria mas utilizar? patrones? o algo? que mis usuarios puedan dejar comentarios por ejemplo en una web

Podrías crear un universo de caracteres válidos, en donde el parámetro ingresado por el usuario es partido (split) para obtener cada uno de los caracteres y buscarlos en el arreglo (universo) de caracteres válidos, en caso de que se no se encuentre, no interactúa con la base de datos y logeas datos del atacante, saludos.

Solicitudes de crack, keygen, serial solo a través de mensajes privados (PM)

sirdarckcat


WHK

#7
Pues todo depende de como esté hecha la consulta sql, por ejemplo si usas mysql_real_escape_string mas stripslashes en una consulta donde el valor es numérico, puedes inyectar con espacios en blanco sin usar comillas usando valores dword en hexadecimal.

Por ejemplo:
<?php $query 'select * from users where id = '.mysql_real_escape_string(stripslashes($_GET['id']));

El valor numérico no está encerrado en comillas por lo cual puedes escapar así:
-1 union all select 1,2,@@version -- -

Y si te fijas, ninguno de los carácteres de la inyección necesitan ser escapados por lo cual te bypaseas todas las funciones juntas.

Pero como te dije antes, todo depende de la consulta sql, este es solo un posible escenario.

Otro escenario es que las funciones estén invertidas, por ejemplo:
<?php $query 'select * from users where id = '.stripslashes(mysql_real_escape_string($_GET['id']));

En este caso stripslashes puede invalidar la secuencia de escape de mysql "\", por ejemplo, cuando insertamos una comilla, mysql lo asigna con backslash \', de esta manera queda escapado, pero si le eliminas el backslash entonces mysql_real_escape:string es invalidado y la inyección debiera pasar de manera simple y sin mayores problemas.

En php puedes dar como segundo argumento al mysql_real_escape_string el handler de la conexión mysql, digamos que la conexión esté configurada de manera dinámica según la codificación de caracteres entre el navegador y el servidor, entonces le pasas una cabecera en utf-7 y te bypaseas el filtro usando comillas.

Hay muchas maneras de evadir mysql_real_escape_string(), todo depende de como esté implementado.

Saludos.

WHK

#8
Por otro lado:
https://github.com/ethicalhack3r/DVWA/blob/master/vulnerabilities/sqli/source/high.php

<?php
if( isset( $_SESSION 'id' ] ) ) {
// Get input
$id $_SESSION'id' ];
// Check database
$query  "SELECT first_name, last_name FROM users WHERE user_id = '$id' LIMIT 1;";
$result mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( '<pre>Something went wrong.</pre>' );
// Get results
while( $row mysqli_fetch_assoc$result ) ) {
// Get values
$first $row["first_name"];
$last  $row["last_name"];
// Feedback for end user
$html .= "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
}
((is_null($___mysqli_res mysqli_close($GLOBALS["___mysqli_ston"]))) ? false $___mysqli_res);
}
?>


La inyección va en el id de sesión, supongo que en algún lado tendrás que modificar tu id de sesión para lanzar la inyección, pero por lo menos en ningún lado utiliza mysql_real_escape_string.

https://github.com/ethicalhack3r/DVWA/blob/master/vulnerabilities/sqli/session-input.php

<?php
define
'DVWA_WEB_PAGE_TO_ROOT''../../' );
require_once 
DVWA_WEB_PAGE_TO_ROOT 'dvwa/includes/dvwaPage.inc.php';
dvwaPageStartup( array( 'authenticated''phpids' ) );
$page dvwaPageNewGrab();
$page'title' ] = 'SQL Injection Session Input' $page'title_separator' ].$page'title' ];
if( isset( 
$_POST'id' ] ) ) {
$_SESSION'id' ] =  $_POST'id' ];
//$page[ 'body' ] .= "Session ID set!<br /><br /><br />";
$page'body' ] .= "Session ID: {$_SESSION'id' ]}<br /><br /><br />";
$page'body' ] .= "<script>window.opener.location.reload(true);</script>";
}
$page'body' ] .= "
<form action=\"#\" method=\"POST\">
<input type=\"text\" size=\"15\" name=\"id\">
<input type=\"submit\" name=\"Submit\" value=\"Submit\">
</form>
<hr />
<br />
<button onclick=\"self.close();\">Close</button>"
;
dvwaSourceHtmlEcho$page );
?>


Basta con enviar vía post data el id con inyección sql y listo.