Tcsec安全研究院|postgreSQL与Mysql利用的一些差异
字数 1007 2025-08-11 22:57:18
PostgreSQL与MySQL利用的一些差异 - 安全特性分析
单引号的特性
PostgreSQL在处理字符串常量时有一个独特的特性:字符串可以用单引号和换行符分割。官方文档中记录了这一点,实际测试表明以下语法均被支持:
SELECT '字符串
常量';
SELECT '字符串' '常量';
SELECT '字符串'
'常量';
安全影响:
- 由于语法结构的特殊性,一些语义分析的WAF可能无法正常识别这种语法
- 可以利用该语法特性混淆绕过一些WAF的检测
双引号的特性
PostgreSQL中双引号用于解决关键字和用户定义的冲突问题。例如:
CREATE TABLE user (id int); -- 会报错,因为user是关键字
CREATE TABLE "user" (id int); -- 正确语法
双引号包裹的字符不是字符串,不能使用字符串的各种编码和函数。但官方文档中记录了一种内置的Unicode编码格式,支持双引号包裹的特殊类型:
CREATE TABLE U&"user" (id int); -- Unicode编码形式
支持三种Unicode格式:
\xxxx\+xxxxxx\uxxxx
安全利用:
- 可用于表名、字段名关键字的绕过
- 在需要绕过关键字检测时特别有用
数字的特性
测试发现一个有趣现象:数字+关键字的情况下,关键字依旧会高亮显示。进一步测试表明:
- 在语法结构支持出现数字的地方,如果后面有关键字,删除空格不会影响执行
- 必须是"数字+关键字"的顺序,不能调换
示例:
SELECT 1FROM users; -- 有效,数字和FROM之间无空格
SELECT FROM1 users; -- 无效
小结:
在语法正确的情况下,数字和关键字之间的空格可以删除(仅限数字在前的情况)
XML相关函数
PostgreSQL提供几个特殊的XML函数,在安全利用方面有特殊价值:
1. table_to_xml
- 功能:通过传入表名直接查询数据,返回XML格式
- 用法:
SELECT table_to_xml('users', true, true, '');
2. query_to_xml
- 功能:通过传入查询语句,返回XML格式数据
- 用法:
SELECT query_to_xml('SELECT * FROM users', true, true, '');
3. database_to_xml
- 功能:直接查询所有用户表的数据
- 用法:
SELECT database_to_xml(true, true, '');
安全利用点:
- 这些函数传入的参数都是字符串,支持各种字符串函数和编码格式
- 可用于绕过未过滤XML函数关键字的WAF检测
- 示例利用方式:
SELECT query_to_xml(CHR(83)||CHR(69)||CHR(76)||..., true, true, '');
总结
PostgreSQL与MySQL在安全利用方面存在多个重要差异:
- 字符串处理:PostgreSQL支持用单引号和换行符分割字符串,这为WAF绕过提供了可能
- 标识符引用:双引号和Unicode编码可用于关键字绕过
- 数字语法:数字与关键字间的空格可省略的特性可被利用
- XML函数:提供直接的数据导出功能,且参数支持多种编码方式
这些特性在渗透测试和漏洞利用中具有实际价值,特别是当面对WAF等防护措施时。安全研究人员和开发人员都应了解这些差异,以便更好地防护或测试PostgreSQL数据库。