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在安全利用方面存在多个重要差异:

  1. 字符串处理:PostgreSQL支持用单引号和换行符分割字符串,这为WAF绕过提供了可能
  2. 标识符引用:双引号和Unicode编码可用于关键字绕过
  3. 数字语法:数字与关键字间的空格可省略的特性可被利用
  4. XML函数:提供直接的数据导出功能,且参数支持多种编码方式

这些特性在渗透测试和漏洞利用中具有实际价值,特别是当面对WAF等防护措施时。安全研究人员和开发人员都应了解这些差异,以便更好地防护或测试PostgreSQL数据库。

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