bWAPP - AulaLinux/Ethical-Hacking GitHub Wiki
bWAPP, or a buggy web application, is a free and open source deliberately insecure web application.
It helps security enthusiasts, developers and students to discover and to prevent web vulnerabilities. bWAPP prepares one to conduct successful penetration testing and ethical hacking projects. What makes bWAPP so unique? Well, it has over 100 web vulnerabilities!
It covers all major known web bugs, including all risks from the OWASP Top 10 project.
bWAPP is a PHP application that uses a MySQL database. It can be hosted on Linux, Windows and Mac with Apache/IIS and MySQL. It can also be installed with WAMP or XAMPP.
bWAPP is for educational purposes. Education, the most powerful weapon which we can use to change the world. Have fun with this free and open source project!
Cheers, Malik Mesellem
$ docker run -d -p 80:80 raesene/bwapp
Abrir el navegador e ir a
localhost/install.php
y a locahost/login.php
Finalmente deberíamos ver algo así en login.php:
Para acceder a los ejercicios, tendremos que loguearnos en la bWAPP con las credenciales
Usuario: bee
Password: bug
En la parte superior derecha veremos un desplegable de ejercicios y otro para determinar el nivel de dificultad.
La idea de insertar HTML es tan sencilla como introducir un trozo de código de HTML en un campo de texto, esta vulnerabilidad permite reflejar el código HTML como si fuera de la propia página. En este ejercicio, bWAPP nos sugiere que introduzcamos unas credenciales pero como la entrada de datos no está saneada los datos que introduzcamos pueden ser tags de HTML:
<h1>HTML Injection</h1>
<h2>Aula Linux</h2>
Es extraño encontrar algún campo que permite ejecutar directamente un comando de terminal por razones evidentes de seguridad, pero en caso de que exista esto puede ser una entrada muy peligrosa para comandos no esperados.
El ejemplo que nos ofrece bWAPP es un campo donde se ejecuta un nslookup
de su contenido,
pero nosotros utilizaremos la concatenación de comandos para inyectarle nuestros propios comandos.
www.nsa.gov; ls -l /
Después del nslookup
podemos listar todos los archivos del directorio raíz... Y lo que se nos ocurra
www.nsa.gov; cat /etc/passwd
La inserción de código funciona de manera muy similar a la anterior, simplemente en este caso en vez de introducir código HTML por un formulario introduciremos un comando PHP por la URL. Si nos fijamos, la página nos da la siguiente pista:
This is just a test page, reflecting back your message...
Pues establecemos la variable por URL de la siguiente forma
http://localhost/phpi.php?message=necesita_saneamiento
Y veremos el resultado reflejado en la misma página
Pero podemos ser más creativos y explotar aún más esta vulnerabilidad.
phpinfo()
es un comando muy útil y sencillo para mostrar qué configuración de PHP y otros programas tiene
el webserver. Si lo introducimos en la URL de la siguiente forma:
http://localhost/phpi.php?message=phpinfo()
Estos datos pueden exponer información útil para elaborar una estrategia de ataque a una página web. Por ejemplo sabiendo qué versión de PHP o de apache utiliza podemos ir a buscar las vulnerabilidades de estas versiones y explotarlas.
El ataque consiste en insertar una porción de una query maliciosa en SQL sobre un input no validado. El usuario introduce esa porción en una query legı́tima y como consecuencia el sistema de gestión de la base de datos la ejecuta, a este proceso se la denomina una inyección SQL o SQL Injection.
En un ataque exitoso de inyección SQL el atacante podría tener acceso a la base de datos de la aplicación, por ejemplo una query muy popular en una base de datos es cualquier select para consultar los datos que nos ofrece la web
select id, name, email from user where name = ’John’ ;
Esta select nos devolvería la id, el nombre y el mail del usuario cuyo nombre es John
. La web, por lo general,
recogerá los resultados de la select, los tratará y mostrará resultados en pantalla para interactuar con el usuario.
Generalmente en el where pondremos lo que hayamos capturado de la web en un input, por ejemplo un campo llamado ”Nombre”, es decir ”Nombre: John”.
Pongamos ahora el siguiente ejemplo:
select id, name, email from user where name = ’O ’ Brian ’ ;
Esta sentencia SQL no está bien formada, en un sistema de bases de datos como mysql esperará a que cerremos comillas para efectuar la select o nos devolverá un error. En cualquier caso podrı́amos hacer algo como lo siguiente:
Nombre: O ’; <sentencia SQL>;
Como podemos observar tenemos un acceso directo a la BD desde un simple input y ejecutar comando tan peligrosos como:
’ and 1= 0 union select 1, database(), version(), user(), information schema(), 7, 8 −− −
select password from user;
drop table user;
drop database;
...
Hay muchas variantes de esta vulnerabilidad y existen varios vectores de ataque, cualquiera que haga una petición directa a la BD.
Este tipo de vulnerabilidad efectivamente se corrige saneando los datos de entrada de la BD, estableciendo una polı́tica de permisos estricta y consistente o utilizando ORMs, aunque lo más aconsejable serı́a hacer una combinación de todos estos mecanismos.