Foro de elhacker.net

Seguridad Informática => Nivel Web => Mensaje iniciado por: tecasoft en 15 Octubre 2016, 14:56 pm



Título: duda sobre reto hacking en dvwa: stripslashes()
Publicado por: tecasoft en 15 Octubre 2016, 14:56 pm
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
  1. <?php    
  2.  
  3. if (isset($_GET['Submit'])) {
  4.  
  5.    // Retrieve data
  6.  
  7.    $id = $_GET['id'];
  8.    $id = stripslashes($id);
  9.    $id = mysql_real_escape_string($id);
  10.  
  11.    if (is_numeric($id)){
  12.  
  13.        $getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id'";
  14.        $result = mysql_query($getid) or die('<pre>' . mysql_error() . '</pre>' );
  15.  
  16.        $num = mysql_numrows($result);
  17.  
  18.        $i=0;
  19.  
  20.        while ($i < $num) {
  21.  
  22.            $first = mysql_result($result,$i,"first_name");
  23.            $last = mysql_result($result,$i,"last_name");
  24.  
  25.            echo '<pre>';
  26.            echo 'ID: ' . $id . '<br>First name: ' . $first . '<br>Surname: ' . $last;
  27.            echo '</pre>';
  28.  
  29.            $i++;
  30.        }
  31.    }
  32. }
  33. ?>
  34.  

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


Título: Re: duda sobre reto hacking en dvwa: stripslashes()
Publicado por: Shell Root en 19 Octubre 2016, 14:54 pm
Buenas, aquí tuve una pregunta casi similiar a la que haces

:http://www.hackingwithphp.com/4/7/12/automatically-escaping-strings
:http://foro.elhacker.net/nivel_web/duda_con_reto_de_isql-t431291.0.html;msg2000724
:http://zeroknock.blogspot.com.co/2011/08/sql-injection-php-escaping-and-like.html


Título: Re: duda sobre reto hacking en dvwa: stripslashes()
Publicado por: tecasoft en 16 Noviembre 2016, 23:55 pm
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


Título: Re: duda sobre reto hacking en dvwa: stripslashes()
Publicado por: sirdarckcat en 17 Noviembre 2016, 02:38 am
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.


Título: Re: duda sobre reto hacking en dvwa: stripslashes()
Publicado por: 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


Título: Re: duda sobre reto hacking en dvwa: stripslashes()
Publicado por: .:UND3R:. en 17 Noviembre 2016, 19:30 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.


Título: Re: duda sobre reto hacking en dvwa: stripslashes()
Publicado por: sirdarckcat en 21 Noviembre 2016, 09:18 am
Prepared Statements

http://www.w3schools.com/php/php_mysql_prepared_statements.asp

 


Título: Re: duda sobre reto hacking en dvwa: stripslashes()
Publicado por: WHK en 4 Diciembre 2016, 05:54 am
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:
Código:
<?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í:
Código:
-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:
Código:
<?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.


Título: Re: duda sobre reto hacking en dvwa: stripslashes()
Publicado por: WHK en 4 Diciembre 2016, 06:18 am
Por otro lado:
https://github.com/ethicalhack3r/DVWA/blob/master/vulnerabilities/sqli/source/high.php

Código:
<?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

Código:
<?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.