一个id参数引发的数据库沦陷
三垣网安
2026年10月8日 17:59
湖南
在小说阅读器读本章
去阅读
在公众号小说中沉浸阅读
面向白帽学习者的合规复盘:
记录思路要点及其PgSQL注入技巧
合规说明:本文仅面向合法授权的白帽网络安全学习与安全防护研究。未经授权,不要对任何真实系统进行漏洞验证或测试。
前言
SQL注入是Web安全最经典的漏洞类型,但很多白帽初学者对SQL注入的认知仅仅停留在MySQL这一种数据库。实际上,不同数据库系统的注入技巧存在显著差异——PostgreSQL、MSSQL、Oracle各个数据库的函数库和语法特性,闭合方式、注释符、内置函数都存在不同之处。
本文是某大学edu资产的SQL注入实战案例:从URL中的id参数发现注入点,到通过报错信息识别出PostgreSQL数据库并泄露表名列名,再到构造布尔条件进行盲注提取数据库名称。涵盖了闭合方式判断、数据库类型识别、布尔盲注Payload构造等技能,对白帽初学者理解PgSQL注入和盲注技术有一定学习参考价值。
一、漏洞资产与目标信息
案例演示的是某高校的生物科研数据系统。漏洞URL如下:
https://[目标域名].edu.cn/XXXX/feature\_page.php?id=61423
URL结构分析:
feature\_page.php —— PHP动态页面,通过id参数进行查询操作
id=61423 —— 数字型参数,可尝试拼接SQL查询语句
通过ICP备案查询确认资产归属为某大学。
资产证明如下:
二、漏洞复现过程
1.注入点发现与闭合方式判断
正常访问 id=61423 时,功能正常,说明id参数被服务端接收并用于数据库查询。
对id参数进行注入测试的第一步是判断闭合方式。依次尝试以下测试:
id=61423 (正常值)—— 页面正常显示
id=61423' (加单引号)—— 页面报错,返回数据库错误信息
id=61423'' (加两个单引号)—— 页面恢复正常显示
单引号触发报错、双单引号恢复正常,典型的字符串型单引号闭合。
后端SQL语句的结构大致为:
SELECT ... FROM \"XXXX\_info\" WHERE ta\_id = '[用户输入]'
报错信息中直接泄露了关键数据库结构信息。
2.数据库类型识别
报错内容是判断数据库类型的重要依据。本例中报错信息如下:
Query failed 42: 错误: 未终止的字符串常量在 \"0\" 或附近的
LINE 1: ...rom \"XXXX\_info\" taptair where \"XXXX\_info\".taptair.ta\_id = '0' ^ A
错误代码42,双引号包裹表名和列名(\"XXXX\_info\")—— PostgreSQL的特征,可以确认数据库为PostgreSQL。
这一步至关重要——PostgreSQL的注入函数和语法与MySQL有显著差异,后续Payload构造必须基于PostgreSQL的函数库。
3.布尔条件测试与盲注确认
确认闭合方式后,尝试构造布尔条件判断是否存在布尔盲注。分别构造永真条件和永假条件进行对比测试:
Payload 1: id=0 or '1 —— 永真条件('1' 被解析为TRUE)
Payload 2: id=0 or '0 —— 永假条件('0' 被解析为FALSE)
测试结果:
id=0 or '1 —— 页面无回显,请求被卡住。原因可能是永真条件导致全表扫描返回大量数据,触发超时
id=0 or '0 —— 页面正常回显,等价于 id=0 的查询结果
两种Payload产生不同的页面响应,说明构造的SQL语句被执行。
4.盲注Payload构造与数据库名提取
确认布尔盲注可行后,接下来的目标是提取当前数据库名称,从而佐证漏洞存在并且证明漏洞危害。
此处采用爆破的方式来获得数据库名。
爆破得到首字母为T,结合站点搜集到的信息,猜测数据库名为TXXX开头
后续检验布尔盲注成功,确认数据库名前四个字符为TXXX
三、技术拓展
1.PostgreSQL注入与MySQL注入的差异
PostgreSQL和MySQL是Web应用中最常见的两种开源数据库,但注入技巧存在显著差异。白帽初学者如果只熟悉MySQL注入,在遇到PgSQL时容易踩坑。
以下对比关键差异:
最关键的差异是报错注入:MySQL的extractvalue()和updatexml()可以在报错信息中回显查询结果,而PostgreSQL没有等价函数,报错信息不会直接回显注入的数据。
2.PostgreSQL特有利用技巧
PostgreSQL作为功能强大的企业级数据库,提供了一些MySQL没有的特殊功能,在渗透测试中可以利用这些特性进行深入测试:
COPY TO/FROM——PostgreSQL的COPY命令可以在数据库和文件系统之间传输数据。如果当前用户具有足够权限,可通过COPY TO将查询结果写入文件,或通过COPY FROM读取文件内容到表中,实现任意文件读写。
PostgreSQL文件读取(需超级用户权限)id=0' or 1=(SELECT pg\_read\_file('/etc/passwd'))--
写文件到Web目录id=0'; COPY (SELECT '') TO '/var/www/html/shell.php'--
pg\_read\_file()——PostgreSQL内置的服务器端文件读取函数,参数为文件路径。仅超级用户可调用。可用于读取配置文件、SSH密钥等敏感文件。
pg\_sleep()——时间盲注的核心函数,参数为秒数(支持小数)。当布尔盲注不可行时,可切换为时间盲注——通过页面响应时间判断条件真假。
四、总结
本Edu实战案例完整复现了一次针对PostgreSQL的SQL注入测试过程:从URL参数发现注入点,到通过报错信息识别数据库类型和表结构,再到构造布尔条件进行盲注提取数据库名称。
对白帽初学者而言,需要记住的是:不同数据库的注入技巧存在显著差异,要想真正学会SQL注入,必须了解PostgreSQL函数库和语法的特征,保证遇到时能够辨别。
—关注三垣网安,学习更多网安小技巧—
三垣网安公众号会持续分享Web安全领域的漏洞复现与技术分析文章,覆盖SQL注入、XSS、SSRF、文件上传、信息收集等渗透测试常见方向的网络安全实战方法。
有疑问或不同见解欢迎各位白帽在评论区交流讨论,共同进步。
如果这篇文章对你有帮助,欢迎点赞、收藏、关注!
SQL注入 #PostgreSQL #布尔盲注 #渗透测试 #漏洞复现 #Web安全 #网络安全
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论