Vulnerabilidad en la subida de imagenes

Iniciado por 50l3r, 1 Septiembre 2009, 02:38 AM

0 Miembros y 4 Visitantes están viendo este tema.

50l3r

Veran, tengo una web dedicada al hosting de imagenes .gif .jpg y .png de maximo 5 megas

Segun mi cabeza, y aun asi ya visto en mi web, se puede subir a esta webshells c99 y demas con extension .jpg por ejemplo y dar ordenes desde estas

Como se repara este fallo de seguridad? aun nose si mi web es vulnerable, se algo de la vulnerabilidad pero no como protegerme

saludos

Og.

Cita de: 50l3r en  1 Septiembre 2009, 02:38 AM
Veran, tengo una web dedicada al hosting de imagenes .gif .jpg y .png de maximo 5 megas

Segun mi cabeza, y aun asi ya visto en mi web, se puede subir a esta webshells c99 y demas con extension .jpg por ejemplo y dar ordenes desde estas

Como se repara este fallo de seguridad? aun nose si mi web es vulnerable, se algo de la vulnerabilidad pero no como protegerme

saludos

esto va en nivel web, puedes poner el filtro que usas?
|-

50l3r

si te refieres al upload, claro aqui te lo dejo:

Código (php) [Seleccionar]
<html>
<head>
<title>Subiendo Imagen</title>
<link href="CSS/styles.css" rel="stylesheet" type="text/css" />
<style type="text/css">
.principal2_titulo{
        background: #202020 url("CSS/Images/back_title.jpg") bottom left repeat-x;
width:85%;
height:auto;
background-color:#000000;
border-style:solid;
border-width:0px;
border-color:#000000;
margin:0 5px 0 0px;
padding:4px;
}

.principal2{
width:85%;
height:auto;
background-color:#202020;
border-style:solid;
border-width:1px;
border-color:#000000;
margin:0 5px 0 0px;
padding:3px;
text-align:left;
}
</style>
</head>
<body>
<a href="index.html"><div id="imagen_fijada"><img src="Images/uploadmore.png" border=0 alt="Sube mas imagenes"></div></a>
<div class="header"><center><img src="Images/Titulo.png"></center>
<br><br>
<center><div class='principal2_titulo'>Imagen</div>
<div class='principal2'>
<?php
//tomo el valor de un elemento de tipo texto del formulario
$cadenatexto htmlentities($_POST["cadenatexto"]);
echo 
"<center><b>Hola " $cadenatexto " gracias por participar en este proyecto :)</b></center><br><br>";
//datos del arhivo
$nombre_archivo $_FILES['userfile']['name'];
$tipo_archivo $_FILES['userfile']['type'];
$tamano_archivo $_FILES['userfile']['size'];
$ruta "BlackBox/";
$aleatoriorand(0,50000);
//compruebo si las características del archivo son las que deseo
if (!((strpos($tipo_archivo"gif") || strpos($tipo_archivo"jpeg") || strpos($tipo_archivo"png")) && ($tamano_archivo 5000000))) {
    echo 
"La extensión o el tamaño de los archivos no es correcta:<br><br><table><tr><td><li>Se permiten archivos .gif, .jpg o .png<br><li>Se permiten archivos de 5MB máximo<br>Los nombres de imagenes deben tener estos caracteres: [a-z] [0-9] ^$.</td></tr></table>";
}else{
    if (
move_uploaded_file($_FILES['userfile']['tmp_name'], "$ruta $aleatorio $nombre_archivo")){
       echo 
"<center><img src='$ruta $aleatorio $nombre_archivo' alt='tu imagen' onload='if(this.width > 1024 || this.height >768) {this.width=1024; this.height=768;}'></center>";
   echo "<center><div style='color:#F8485D;'><i>" .$nombre_archivo"</i></div><br>Imagen cargada correctamente<br><br></center>";
       echo 
"<center><h3>Link Directo:</h3></center>";   
   echo "<center><h4>http://black-box.no-ip.info/$ruta$aleatorio$nombre_archivo</h4></center>";
    }else{
       echo 
"Ocurrió algún error al subir el fichero. No pudo guardarse";
    }
}
?>

</div></Center>
</body>
</html>


SUPUESTAMENTE, el filtro no deja pasar archivos que no sean png, jpg y gif de tamaño mayor a 5mb, pero por lo que vi si que se puede

Azielito

Se logra cambiando el tipo en las cabeceras cuando lo envias :xD

Se me ocurre que con GD resizes la imagen un pixcel, si no es imagen te dara error al hacer eso, si da error entonces mandas msg de error xD

Tambien podrias "vaciar" el contenido del archivo y buscar alguna cadena de las shells mas comunes y decir "HDP no se vale juakearme" :xD

Darioxhcx

renombrar el archivo al finalizar la subida...
creo que se podria hacer mucho , si no krackwar habia puesto un upload seguro...
pero nu se (?
saludos

50l3r

mmm renombrar el archivo puede ser una opcion pero se acabaria averiguando ya que la web da el mismo link de la imagen para poder indexarlo en foros y demas y no valdria no?

aun asi, yo ya lo renombro, pongo un numero aleatorio antes del nombre para que las imagenes que tengan el mismo nombre no se sobreescriban


Se logra cambiando el tipo en las cabeceras cuando lo envias :xD

Se me ocurre que con GD resizes la imagen un pixcel, si no es imagen te dara error al hacer eso, si da error entonces mandas msg de error xD

Tambien podrias "vaciar" el contenido del archivo y buscar alguna cadena de las shells mas comunes y decir "HDP no se vale juakearme" :xD


azielito, a que te refieres cambiando el tipo en las cabeceras?

WHK

#6
lo que debes hacer es verificar la extensión en el caso de que no tengas GD ya que por defecto no viene en php.

Código (php) [Seleccionar]
<?php
function verifica_extension($archivo$permitidos){
 if(!
eregi('.'$archivo)) return false// No tiene extension
 /* Separa extensión */
 
$extension explode('.'$archivo);
 
$extension $extension[count($extension) - 1];
 foreach(
$permitidos as $permitido){
  if(
strtolower($permitido) == strtolower($extension)){
   return 
true// Permitido
  
}
 }
 return 
false// No permitido
}

$permitidos = array('jpg','jpeg','png','gif','bmp','svg');
if(
verifica_extension($_FILES['userfile']['name'], $permitidos)){
 
mueve procesa y todo lo demás .....
}else{
 
muestra el mensaje de error que la extension no es valida ....
}
?>


Además puedes quitarle el permiso de ejecución al directorio por si las dudas.


Citarazielito, a que te refieres cambiando el tipo en las cabeceras?

CitarPOST /script.php HTTP/1.1
Host: 127.0.0.1
Connection: close
Content-Type: multipart/form-data; boundary=---------------------------00000000000001
Content-Length: 169

-----------------------------00000000000001
Content-Disposition: form-data; name="archivo"; filename="shell.php"
Content-Type: application/png

<?php phpinfo(); ?>

50l3r

#7
Bueno, ya comprendi el php aun sin saber medianamente el lenguaje

lo modifique un poco y en vez de usar funcion php lo acople directamente a lo que tenia

ya lo comprobe y cambiando las cabeceras aun asi no resulta

podria pasaros a alguno el enlace por mp y me decis si esta correcto? hice la prueba y esta bien pero nose si tendra algun agujerito por otro lado

si estais de acuerdo decirmelo por aqui y muchas gracias, abro de nuevo mi web :)

Azielito

Pone aqui la url, y su source para que los que saben mas intenten vulnerarlo y ver que fallas tienen :D

50l3r

pero 0% intencion spam:

black-box.es.gd

Código (php) [Seleccionar]
<html>
<head>
<title>Subiendo Imagen</title>
<link href="CSS/styles.css" rel="stylesheet" type="text/css" />
<LINK REL="SHORTCUT ICON" HREF="Images/blackico.ico">
<style type="text/css">
.principal2_titulo{
        background: #202020 url("CSS/Images/back_title.jpg") bottom left repeat-x;
width:85%;
height:auto;
background-color:#000000;
border-style:solid;
border-width:0px;
border-color:#000000;
margin:0 5px 0 0px;
padding:4px;
}

.principal2{
width:85%;
height:auto;
background-color:#202020;
border-style:solid;
border-width:1px;
border-color:#000000;
margin:0 5px 0 0px;
padding:3px;
text-align:left;
}
</style>
</head>
<body>
<a href="index.html"><div id="imagen_fijada"><img src="Images/uploadmore.png" border=0 alt="Sube mas imagenes"></div></a>
<div class="header"><center><img src="Images/Titulo.png"></center>
<br><br>
<center><div class='principal2_titulo'>Imagen</div>
<div class='principal2'>


<?php
//definiendo varaiables
$cadenatexto htmlentities($_POST["cadenatexto"]);
$chkcon = isset($_POST["chkcon"]);
$chkvis = isset($_POST["chkvis"]);
$chkwall = isset($_POST["chkwall"]);
$nombre_archivo $_FILES['userfile']['name'];
$tamano_archivo $_FILES['userfile']['size'];
$ruta "BlackBox/";
$ruta_concurso "Escritorios/";
$ruta_muro "Muro-pendiente/";
$ruta_invisible"no-visibles/";
$aleatoriorand(0,50000);
$permitidos = array('jpg','jpeg','png','gif','bmp','svg','ico');


if (
$nombre_archivo=="" || $cadenatexto==""){
echo 
"<center><div style='color:#ec2929;'>Ups¡¡ ha ocurrido un error :/ puede deberse a:</div><br></center>";
echo 
"<li>No has escrito tu nombre";
echo 
"<li>No has especificado la imagen a enviar";}else{

echo 
"<center><b>Hola " $cadenatexto " gracias por participar en este proyecto :)</b></center><br><br>";

if (
eregi('.',$nombre_archivo)) {
$extension explode('.'$nombre_archivo);
$extension $extension[count($extension) -1];

foreach(
$permitidos as $permitido){
if (strtolower($permitido) == strtolower($extension)&& tamano_archivo 20000000){

if ($chkcon==1) {
if (copy($_FILES['userfile']['tmp_name'], "$ruta_concurso$aleatorio$nombre_archivo")){
   echo "<div style='color:#bcea64;'><li>Su imagen esta puesta en el desfile de escritorios, si su escritorio tiene estilo podra estar en el album de la Caja Negra</div><br><br>";
}else{
   echo "<table>La extensióncita o el tamaño de los archivos no es correcta:<br><br><tr><li>Se permiten archivos .gif, .jpg/.jpeg, .png, .bmp y .svg<br><li>Se permiten archivos de 2MB máximo</tr></table>";}}

if ($chkwall==1){  
if (copy($_FILES['userfile']['tmp_name'], "$ruta_muro$aleatorio$nombre_archivo")){
   echo "<div style='color:#f1283f;'><li>Su imagen sera insertada en el muro, espere hasta que se valide</div><br><br>";
}else{
   echo "<table>La extensión o el tamaño de los archivos no es correcta:<br><br><tr><li>Se permiten archivos .gif, .jpg/.jpeg, .png, .bmp y .svg<br><li>Se permiten archivos de 2MB máximo</tr></table>";}}   
   
   
if ($chkvis==1){
if (copy($_FILES['userfile']['tmp_name'], "$ruta$aleatorio$nombre_archivo")){
       echo 
"<center><img src='$ruta$aleatorio$nombre_archivo' alt='tu imagen' onload='if(this.width > 1024 || this.height >768) {this.width=1024; this.height=768;}'></center>";
   echo "<center><div style='color:#7fbbcc;'><i>" .$nombre_archivo"</i></div><br>Estado de visibilidad de tu imagen:<br><img src='Images/visible.png' title='Imagen cargada como visible' alt='Imagen cargada y visible en la portada'><br><br></center>";
       echo 
"<hr>";
   echo "<center><h3><div style='color:#bcea64;'>Link Directo:</div></h3></center>";   
   echo "<center><h4>http://black-box.no-ip.info/$ruta$aleatorio$nombre_archivo</h4></center><br>";
   echo "<hr>";
   echo "<center><h3><div style='color:#f1283f;'>BBCODE:</div></h3></center>";   
   echo "<center><h4>[img]http://black-box.no-ip.info/$ruta$aleatorio$nombre_archivo&#38;#91&#38;#47img&#38;#93</h4></center><br>";
   echo "<hr>";
   echo "<center><h3><div style='color:#7fbbcc;;'>HTML:</div></h3></center>";   
   echo "<center><h4>&#38;#60img src=&#38;#34http://black-box.no-ip.info/$ruta$aleatorio$nombre_archivo&#38;#34&#38;#62</h4></center><br>";
}else{
   echo "<table>La extensión o el tamañito de los archivos no es correcta:<br><br><tr><li>Se permiten archivos .gif, .jpg/.jpeg, .png, .bmp y .svg<br><li>Se permiten archivos de 2MB máximo</tr></table>";
   }}else{
   
   if (copy($_FILES['userfile']['tmp_name'], "$ruta_invisible$aleatorio$nombre_archivo")){
       echo 
"<center><img src='$ruta_invisible$aleatorio$nombre_archivo' alt='tu imagen' onload='if(this.width > 1024 || this.height >768) {this.width=1024; this.height=768;}'></center>";
   echo "<center><div style='color:#f1d27d;'><i>" .$nombre_archivo"</i></div><br><img src='Images/invisible.jpg' title='Imagen cargada como invisible' alt='Imagen cargada como invisible'><br><br></center>";
       echo 
"<hr>";
   echo "<center><h3><div style='color:#bcea64;'>Link Directo:</div></h3></center>";   
   echo "<center><h4>http://black-box.no-ip.info/$ruta$aleatorio$nombre_archivo</h4></center><br>";
   echo "<hr>";
   echo "<center><h3><div style='color:#f1283f;'>BBCODE:</div></h3></center>";   
   echo "<center><h4>[img]http://black-box.no-ip.info/$ruta$aleatorio$nombre_archivo&#38;#91&#38;#47img&#38;#93</h4></center><br>";
   echo "<hr>";
   echo "<center><h3><div style='color:#7fbbcc;;'>HTML:</div></h3></center>";   
   echo "<center><h4>&#38;#60img src=&#38;#34http://black-box.no-ip.info/$ruta$aleatorio$nombre_archivo&#38;#34&#38;#62</h4></center><br>";
}else{
   echo "<table>La extensión o el tamaño de los archivos no es correcta:<br><br><tr><li>Se permiten archivos .gif, .jpg/.jpeg, .png, .bmp y .svg<br><li>Se permiten archivos de 2MB máximo</tr></table>";}

}
}
}
}
}
exit;
?>



</div></Center>
</body>
</html>