SQL注入攻击:列出Oracle数据库内容 — PortSwigger
作者:RayofHope
5分钟阅读·2025年4月11日
大家好,我是Rayofhope。我拥有超过5年的安全经验,目前在一家四大会计师事务所担任安全顾问。
这是我连续第6天发布PortSwigger实验室的完整解析,不仅提供解决方案,还会详细解释每个步骤背后的原理。因为一旦理解了"为什么",“怎么做"就会变得简单。
开始之前
在阅读本文前,建议先阅读之前的博客:
- 第四篇博客链接:https://arayofhope7.medium.com/sql-injection-attack-listing-the-database-contents-on-non-oracle-databases-portswigg-42fae517cc6e
视频演练 — 你可以选择观看视频或阅读博客。但个人建议先看视频,再阅读博客来串联所有知识点。
Oracle数据库基础
Oracle数据库是由Oracle公司开发的关系型数据库管理系统(RDBMS)。它将数据存储在表中,并使用SQL(结构化查询语言)进行查询。
Oracle系统表基础
- USER_TABLES:当前用户拥有的表
- ALL_TABLES:当前用户可访问的表
- DBA_TABLES:数据库中的所有表(需要DBA权限)
- V$VERSION:显示Oracle版本信息
- V$INSTANCE:提供实例特定信息
常用Oracle命令
|
|
攻击过程详解
1. 漏洞探测
应用程序存在参数,我们测试其是否易受SQL注入攻击。通过修改参数值观察响应变化或是否抛出内部服务器错误。
发现参数值会反映在响应中,可能存在UNION注入漏洞。
2. 漏洞确认
使用Burp拦截HTTP请求并转发到Repeater模块。
在输入中使用单引号(’),导致500内部服务器错误,表明引号可能破坏了SQL查询。
3. 确定列数
确认应用存在SQL注入漏洞后,使用UNION SELECT负载确定列数。测试3列时出现错误,表明原始SQL查询列数少于3列。
使用ORDER BY 2返回200 OK响应,确认查询至少包含2列。
4. 确定数据类型
确定列数后,需要识别每列的数据类型,这对构造成功的UNION SELECT负载至关重要。
使用' UNION SELECT 'ray', 'ray'--返回错误,表明在Oracle数据库中SELECT语句必须引用表。
使用' UNION SELECT 'ray', 'ray' FROM dual--返回200 OK响应,确认列接受CHAR类型数据。DUAL是Oracle数据库中默认可用的特殊单行单列虚拟表。
5. 提取表信息
使用' UNION SELECT table_name, 'ray' FROM all_tables--返回200 OK响应,表明注入成功。table_name是all_tables视图中的默认列,包含用户可访问的所有表的元数据。
成功查询后,我们从数据库中提取了用户表信息。
6. 提取列信息
使用' UNION SELECT column_name, 'ray' FROM all_tab_columns WHERE table_name = 'USERS_VHVEBS'--返回200 OK响应。column_name是Oracle中的默认列,all_tab_columns视图返回指定表的所有列。
响应显示列名USERNAME_SGSWAR和PASSWORD_RXEPJO,表明USERS_VHVEBS表存储敏感用户凭证(用户名和密码)。
7. 提取用户数据
使用' UNION SELECT USERNAME_SGSWAR, PASSWORD_RXEPJO FROM USERS_VHVEBS--返回USERS_VHVEBS表中的所有用户信息。
成功获取管理员账户和密码,并使用提取的凭证登录实验室。
Boom!实验室已解决。 如果你在这个过程中学到了东西并且没有头疼,那就是双赢!
Happy Hunting — 点赞关注获取更多优质内容
社交链接
- LinkedIn: https://www.linkedin.com/in/ray-of-hope/
- YouTube频道: www.youtube.com/@arayofhope7
- Twitter: https://x.com/ray_of_hope7
- Instagram: https://www.instagram.com/a_rayofhope7/
#漏洞赏金 #网络安全培训 #道德黑客 #渗透测试 #Web渗透测试