【漏洞预警】PHP 发的补丁里,藏着一个未授权sql注入漏洞(POC脚本已公开)
YGnight
YGnight
night安全
2026年8月15日 10:11
四川
在小说阅读器读本章
去阅读
一、漏洞描述
CVE-2026-17543 是 PHP 扩展 ext/pgsql 的一个 SQL 注入漏洞,CWE-89,CVSS 9.8。pg\_insert、pg\_select、pg\_update、pg\_delete、pg\_convert 五个函数将字符串值统一交由 php\_pgsql\_convert 处理:先经 libpq 的 PQescapeStringConn 转义,再由 php\_pgsql\_add\_quotes 以 E'...' 转义字符串常量包裹。E'...' 中反斜杠为转义字符,攻击者在值中插入反斜杠加单引号即可突破引号翻倍转义,使字符串字面量提前闭合,后续内容以原始 SQL 执行。
| CVE 编号 | CVE-2026-17543 |
| 漏洞类型 | SQL 注入 CWE-89 |
| 影响组件 | PHP 扩展 ext/pgsql 的 php\_pgsql\_convert 处理路径 |
| 受影响版本 | 8.2 < 8.2.33;8.3 < 8.3.33;8.4 < 8.4.24;8.5 < 8.5.9 |
| 修复版本 | 8.2.33;8.3.33;8.4.24;8.5.9 |
| CVSS 评分 | 9.8 Critical |
| 披露信息 | GHSA-7qpv-r5mr-78m4;修复 commit ab048bd83b57 |
| 不受影响路径 | pg\_query\_params、PDO\_PGSQL 预处理语句 |
这个漏洞是利用依赖业务代码将输入的内容传入到上面提到的五个函数中。standard\_conforming\_strings 在 PostgreSQL 9.1 版本后就默认开启了,默认配置就直接满足触发的条件。
CVE-2026-17543漏洞为未授权远程 SQL 注入,CVSS 9.8。风险集中于直接使用 pg\_insert、pg\_select 等函数拼装查询的代码路径,采用参数绑定或者是预处理语句的代码是不受影响的。
二、漏洞原理
漏洞产生的主要原因是转义与包裹采用了两套不兼容的规则。 PostgreSQL 中 '...' 为普通字符串字面量,内部单引号以翻倍方式转义;E'...' 为转义字符串常量,反斜杠为转义字符。PQescapeStringConn是按照普通字符串的标准进行处理,单引号翻倍、反斜杠是原样保留的,php\_pgsql\_add\_quotes 随后以 E'...' 包裹。转义依据与包裹语义不一致,从而导致了可被反斜杠利用的问题。漏洞修复之前的ext/pgsql/pgsql.c 原码:
static zend_string *php_pgsql_add_quotes(zend_string *src)
{
\treturn zend_string_concat3(\"E'\", strlen(\"E'\"),
\t\tZSTR_VAL(src), ZSTR_LEN(src), \"'\", strlen(\"'\"));
}
注入机制。 值 zzz\' OR 1=1 -- 经转义与包裹后生成以下语句,反斜杠使第一个引号变成普通字符,第二个引号提前闭合字符串,OR 1=1 -- 作为原始 SQL 执行:
SELECT * FROM \"users\" WHERE \"name\"=E'zzz\\'' OR 1=1 --'
提前闭合前端拼接的字符串的值,把值构造为 eve\', true) --,经 pg\_insert 生成以下语句,字符串闭合后注入 admin=true,原来的admin 赋值被注释吞掉:
INSERT INTO \"users\" (\"name\",\"admin\") VALUES (E'eve\\'', true) --','f')
修复后包裹改为 '...',反斜杠无特殊含义,payload 整体落入字符串,不产生注入。
POC复现
三、修复建议
升级到修复版本 8.2.33、8.3.33、8.4.24、8.5.9。
代码层改用参数绑定:插入用参数化 INSERT,查询用 pg\_query\_params 或 PDO 预处理。
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。











评论