El documento proporciona una introducción a las vulnerabilidades comunes en aplicaciones web, incluyendo inyección de comandos del sistema operativo, inclusión de archivos locales y remotos, inyección SQL e inyección SQL ciega, carga de archivos sin restricciones y scripting entre sitios. Explica cada vulnerabilidad y proporciona ejemplos de código vulnerable y soluciones para prevenir los ataques. También incluye demostraciones prácticas de las vulnerabilidades usando la aplicación vulnerable Damn Vulnerable Web Application.
5. OS COMMANDING
Ataque que permite la ejecución no
autorizada de comandos en el sistema
operativo del servidor web
Podemos realizar este ataque
<?php ingresando “;” o “|” (dependiendo del
passthru("/bin/ping " . $_GET[‘IP’]); sistema operativo)
?>
IP = 192.168.1.1 | ls
SOLUCIÓN:
Filtrar correctamente los parámetros recibidos por el cliente.
7. LOCAL FILE INCLUSION
Ataque que permite el enlace de archivos locales
debido a una mala filtración en las funciones propias de
PHP: include(), include_once(), requiere(),
requiere_once().
<?php
$pagina = $_GET[‘pagina'] ;
if (isset( $pagina) ) {
include( ‘paginas/’ . $pagina . '.php' );
} else {
include( ‘index.php' );
}
?>
8. LOCAL FILE INCLUSION
Ataque que permite el enlace de archivos locales
debido a una mala filtración en las funciones propias de
PHP: include(), include_once(), requiere(),
requiere_once().
<?php
$pagina = $_GET[‘pagina'] ;
if (isset( $pagina) ) {
include( ‘paginas/’ . $pagina . '.php' );
} else {
include( ‘index.php' );
}
?>
/vulnerable.php?pagina=../../../../../../../../etc/passwd%00
9. REMOTE FILE INCLUSION
Ataque que permite el enlace de archivos remotos
debido a una mala filtración en las funciones propias
de PHP: include(), include_once(), requiere(),
requiere_once()
Directivas activadas en la configuración de PHP:
allow_url_include
allow_url_fopen
10. REMOTE FILE INCLUSION
Ataque que permite el enlace de archivos remotos
debido a una mala filtración en las funciones propias
de PHP: include(), include_once(), requiere(),
requiere_once()
Directivas activadas en la configuración de PHP:
allow_url_include
allow_url_fopen
http://www.securityartwork.es/2010/12/
22/recopilacion-local-file-inclusion-lfi/
12. Soluciones:
•Filtrar los valores recibidos por el usuario
$pagina = preg_replace('/[^a-z^A-Z]*/', '', $_GET['pagina']);
IMPORTANTE: ¡¡Solo aceptar los caracteres necesarios!!
$pagina = str_replace('../', '', $_GET[‘pagina’]);
/vulnerable.php?pagina=..%2F..%2F..%2F..%2Fetc%2Fpasswd - OWNED!!
• Almacenar las distintas opciones válidas en un array y
comprobar si se encuentra en dicho array
$paginas = array('principal', ‘blog', 'contacto');
if(isset($_GET['pagina']) and in_array($_GET['pagina'], $paginas))
•Desactivar allow_url_include y allow_url_fopen
•No confiar nunca en el usuario, y, por lo tanto, no incluir nada
que un usuario pueda modificar.
14. SQL INJECTION & BSQL INJECTION
Ataque que permite manipular una consulta SQL por
un atacante con el fin de leer/modificar/eliminar datos
sensibles de la base de datos o del sistema.
mysql_query("SELECT * FROM ‘Usuarios’
WHERE Usuario=‘“ . $_GET[‘usuario'] . ”’
AND Password=‘“ . $_GET[‘password'] . “’;”);
15. SQL INJECTION & BSQL INJECTION
Ataque que permite manipular una consulta SQL por
un atacante con el fin de leer/modificar/eliminar datos
sensibles de la base de datos o del sistema.
mysql_query("SELECT * FROM ‘Usuarios’
WHERE Usuario=‘“ . $_GET[‘usuario'] . ”’
AND Password=‘“ . $_GET[‘password'] . “’;”);
Usuario = a’ or ‘1’=‘1
Password = a’ or ‘1’=‘1
16. SQL INJECTION & BSQL INJECTION
Ataque que permite manipular una consulta SQL por
un atacante con el fin de leer/modificar/eliminar datos
sensibles de la base de datos o del sistema.
mysql_query("SELECT * FROM ‘Usuarios’
WHERE Usuario=‘“ . $_GET[‘usuario'] . ”’
AND Password=‘“ . $_GET[‘password'] . “’;”);
Usuario = a’ or ‘1’=‘1
Password = a’ or ‘1’=‘1
mysql_query("SELECT * FROM ‘Usuarios’
WHERE Usuario=‘a’ or ‘1’=‘1’
AND Password=‘a’ or ‘1’=‘1’;”);
17. SQL INJECTION & BSQL INJECTION
Se considera BLIND SQL INJECTION cuando la respuesta
no esta directamente impresa en el documento HTML
/vulnerable.php?id=1
“SELECT Usuario FROM ‘Usuarios’ SELECT Usuario FROM ‘Usuarios’
WHERE id=“ . $_GET[‘id'] . ”;” WHERE id=1;
Mostraría en este caso, admin
18. SQL INJECTION & BSQL INJECTION
Se considera BLIND SQL INJECTION cuando la respuesta
no esta directamente impresa en el documento HTML
/vulnerable.php?id=1
“SELECT Usuario FROM ‘Usuarios’ SELECT Usuario FROM ‘Usuarios’
WHERE id=“ . $_GET[‘id'] . ”;” WHERE id=1;
/vulnerable.php?id=1 and 1=1
“SELECT Usuario FROM ‘Usuarios’
WHERE id=“ . $_GET[‘id'] . ”;” SELECT Usuario FROM ‘Usuarios’
WHERE id=1 and 1=1;
También mostraría admin
19. SQL INJECTION & BSQL INJECTION
Se considera BLIND SQL INJECTION cuando la respuesta
no esta directamente impresa en el documento HTML
/vulnerable.php?id=1
“SELECT Usuario FROM ‘Usuarios’ SELECT Usuario FROM ‘Usuarios’
WHERE id=“ . $_GET[‘id'] . ”;” WHERE id=1;
/vulnerable.php?id=1 and 1=1
“SELECT Usuario FROM ‘Usuarios’
WHERE id=“ . $_GET[‘id'] . ”;” SELECT Usuario FROM ‘Usuarios’
WHERE id=1 and 1=1;
/vulnerable.php?id=1 and 1=2
“SELECT Usuario FROM ‘Usuarios’
WHERE id=“ . $_GET[‘id'] . ”;” SELECT Usuario FROM ‘Usuarios’
WHERE id=1 and 1=2;
No mostraría nada
20. SQL INJECTION & BSQL INJECTION
Soluciones:
•Validar y filtrar los datos de entrada, en particular, los
caracteres especiales.
•Es muy recomendable utilizar prepared statements
para todas las consultas SQL
•Ocultar los mensajes explícitos de error que muestren
las consultas.
•Restringir al mínimo los privilegios de las cuentas que
se usan.
22. UNRESTRICTED FILE UPLOAD
Esta vulnerabilidad se produce cuando en una
aplicación que contiene un “file upload” no se hace una
validación estricta de los tipos de ficheros que se
pueden subir, provocando que un atacante pueda
ejecutar código en el servidor o tomar el control del
mismo.
Soluciones:
- Denegar permiso de ejecución en el directorio donde
se suben los archivos.
- Verificar MIME-TYPE.
- Verificar (correctamente) la extensión del archivo.
24. CROSS-SITE SCRIPTING (XSS)
Fallo que se produce cuando no se valida la entrada de
datos desde el cliente, provocando que se pueda
inyectar código HTML en el resultado de la página.
Existen 2 tipos de ataque XSS:
•No persistente
•Persistente
Por este ataque, se puede obtener del usuario:
•Predicción del Id de sesión.
•Robo de Cookies.
•Ejecución de código malicioso.
htmlentities - NO SIEMPRE ES LA SOLUCIÓN DEFINITIVA