Oracle数据库SQL注入环境搭建

本文详细介绍了如何使用Docker安装Oracle数据库,并配置镜像加速器,演示了如何启动Oracle容器,以及如何在PHP环境中实现SQL注入测试,包括环境搭建、安全漏洞模拟等步骤。

Oracle数据库SQL注入环境搭建

0x00 安装 Oracle

使用Docker进行安装

要下载的镜像较大, 建议 https://cr.console.aliyun.com/cn-qingdao/instances/mirrors

https://s2vfan7w.mirror.aliyuncs.com

1. 安装/升级Docker客户端
推荐安装1.10.0以上版本的Docker客户端,参考文档docker-ce

2. 配置镜像加速器
针对Docker客户端版本大于 1.10.0 的用户

您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://s2vfan7w.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

更换源之后,直接pull Oracle镜像, 这里选择 https://github.com/MaksymBilenko/docker-oracle-12c 镜像。

docker pull sath89/oracle-12c

0x01 启动 Oracle

docker run --name myoracle -d -p 8080:8080 -p 1521:1521 -e ORACLE_ALLOW_REMOTE=true -v /Users/hua/docker/Oracle:/u01/app/oracle sath89/oracle-12c
参数解释如下:

--name: 容器名字
-d:后台运行容器, 并返回容器ID
-p 本机端口:容器端口: 端口映射
-e ORACLE_ALLOW_REMOTE=true: 设置允许远程连接.
-v 本地目录:容器目录: 挂载本地目录, 将数据保留在本机来达到数据持久化的目的, 要不每次起的容器都是全新的.

运行完上面的命令之后,需要等待容器初始化,可以通过下面命令查看进度。

docker logs -f myoracle

当最底下出现Database ready to use. Enjoy! ;)后代表初始化成功。

不知道为什么用上述办法导致创建的容易一直会闪退出,刚运行起来就关闭了,总之我用了下述方法,简单粗暴。

docker run -it -d -p 8080:8080 -p 1521:1521 sath89/oracle-12c

接下来进入容器:

docker exec -it myoracle env LANG=C.UTF-8 /bin/bash

进入容器这里用的也是简单粗暴:

docker exec -it cranky_greider /bin/bash

先创建sqlplus的软链接:

ln -s $ORACLE_HOME/bin/sqlplus /usr/bin

然后切换到oracle账户:

su oracle

连接Oracle

sqlplus / as sysdba

接下来新建一个表测试一下:

create table student (
   xh number(4), -- 学号
   xm varchar2(20), -- 姓名
   sex char(2), -- 性别
   birthday date, -- 出生日期
   sal number(7,2) -- 奖学金
);

下面的一般测试持久化是由于会删除容器,我这里不删除所以不进行持久化了,至此, Oracle 安装完成!

0x02 apache-php-oracle

https://github.com/thomasbisignani/docker-apache-php-oracle

docker pull thomasbisignani/docker-apache-php-oracle

在本地新建一个测试php,其中的ip为本机的ip,端口为Oracle映射出来的端口。

<?php

$username = 'system';
$password = 'oracle';

$connectText = '//10.1.239.138:1521/XE';

$conn = oci_connect($username, $password, $connectText);
if (!$conn) {
    $e = oci_error();
    echo 'Oracle connect failed <br />';
    exit($e['message']);
}

echo 'Oracle connect ok'."<br>";
?>

0x03 测试

1、创建数据表空间

create tablespace pentest datafile '/u01/app/oracle/oradata/xe/pentest.dbf' size 100m;

2、创建用户并指定表空间

create user pentest identified by pentest default tablespace pentest;

3、给用户授予权限因为是测试注入所以给权限

grant connect,resource,dba to pentest;

4、exit退出并以pentest登录

$ORACLE_HOME/bin/sqlplus pentest/pentest

5、建表并插入数据

 CREATE TABLE users (
     id number,
     name varchar(500),
     surname varchar(1000)
 );

 INSERT INTO users (id, name, surname) VALUES (1, 'luther', 'blisset');
 INSERT INTO users (id, name, surname) VALUES (2, 'fluffy', 'bunny');
 INSERT INTO users (id, name, surname) VALUES (3, 'wu', 'ming');
 INSERT INTO users (id, name, surname) VALUES (4, 'sqlmap/1.0-dev (http://sqlmap.org)', 'user agent header');
 INSERT INTO users (id, name, surname) VALUES (5, NULL, 'nameisnull');
 commit;

这里我用的Navicat,连接Navicat的问题在文末有写,记得insert完要commit

6、然后修改php文件如下:

# 由于环境内没有vi和vim编辑器,只能通过docker cp进行传输文件
docker cp ./test.php 6ae0e91be12e:/var/www/html/
 <?php
 $username = 'pentest';
 $password = 'pentest';
 $connectText = '//10.1.239.138:1521/XE';
 $conn = oci_connect($username, $password, $connectText);
 if (!$conn) {
     $e = oci_error();
     echo 'Oracle connect failed <br />';
     exit($e['message']);
 }
 echo 'Oracle connect ok' . "<br>";
 // Prepare the statement
 if (!isset($_GET['id']) || $_GET['id'] == null) {
     echo "oracle sqlinjection test: oracle_test.php?id=1</br>";
     $stid = oci_parse($conn, "select * from USERS");
 } else {
     //SQL injection!!!!!!
     $stid = oci_parse($conn, "SELECT * FROM users where id=" . $_GET['id']);
 }
 if (!$stid) {
     $e = oci_error($conn);
     exit($e['message']);
 }
 // Perform the logic of the query
 $r = oci_execute($stid);
 if (!$r) {
     $e = oci_error($stid);
     exit($e['message']);
 }
 // Fetch the results of the query
 print "<table border='1'>\n";
 while ($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS)) {
     print "<tr>\n";
     foreach ($row as $item) {
         $item = ($item !== null ? mb_convert_encoding($item, 'utf-8', 'gbk') : " ");
         print "    <td>" . $item . "</td>\n";
     }
     print "</tr>\n";
 }
 print "</table>\n";
 oci_free_statement($stid);
 oci_close($conn);
 ?>

0x04 SQL注入环境

2.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>User Query</title>
</head>
<body>
  <h1>User Query</h1>
  <form action="query.php" method="post">
    Enter User ID: <input type="text" name="user_id" required>
    <input type="submit" value="Query">
  </form>
</body>
</html>
query.php

<?php
// 获取用户输入的 ID
$user_id = $_POST['user_id'];

// 连接到 Oracle 数据库
$conn = oci_connect('pentest', 'pentest', '//10.1.239.138:1521/xe');

// 查询用户信息
$query = "SELECT * FROM users WHERE id = $user_id";
$stid = oci_parse($conn, $query);
oci_execute($stid);

// 显示查询结果
while ($row = oci_fetch_assoc($stid)) {
    echo "User ID: " . $row['USER_ID'] . "<br>";
    echo "Name: " . $row['NAME'] . "<br>";
    echo "SURNAME: " . $row['SURNAME'] . "<br>";
    // 添加其他用户信息字段
}

// 关闭连接
oci_free_statement($stid);
oci_close($conn);
?>

# 如果访问2.html显示403错误,原因可能是文件权限没有设置可读
chmod 644 2.html
root@6ae0e91be12e:/var/www/html# ls -l
total 20
-rw-r--r-- 1 root root    4 Dec 12 07:50 1.html
-rw-r--r-- 1 root root 1240 Dec 12 08:25 1.php
-rw-r--r-- 1 1000 1000  389 Dec 12 07:46 2.html
-rw-r--r-- 1 1000 1000  628 Dec 12 08:33 query.php
-rw-r--r-- 1 root root  292 Dec 12 09:05 test.php

输入user_id = 1 or 1=1 时显示所有数据

sqlmap

# 所有数据库
python3 sqlmap.py -r 1.txt -dbs

在这里插入图片描述

select * from USERS where id = 1 UNION ALL SELECT NULL,CHR(113)||CHR(107)||CHR(106)||CHR(113)||CHR(113)||CHR(99)||CHR(84)||CHR(90)||CHR(117)||CHR(89)||CHR(104)||CHR(71)||CHR(89)||CHR(100)||CHR(115)||CHR(81)||CHR(115)||CHR(73)||CHR(110)||CHR(111)||CHR(70)||CHR(81)||CHR(102)||CHR(101)||CHR(66)||CHR(65)||CHR(83)||CHR(84)||CHR(110)||CHR(121)||CHR(105)||CHR(85)||CHR(121)||CHR(75)||CHR(78)||CHR(74)||CHR(116)||CHR(66)||CHR(80)||CHR(111)||CHR(100)||CHR(70)||CHR(105)||CHR(79)||CHR(80)||CHR(113)||CHR(112)||CHR(113)||CHR(98)||CHR(113),NULL FROM DUAL-- YGEl

在这里插入图片描述

在这里插入图片描述

Navicat中为10秒

select * from USERS where id = 1 AND 2228=DBMS_PIPE.RECEIVE_MESSAGE(CHR(116)||CHR(102)||CHR(67)||CHR(65),5)

在这里插入图片描述

0x05 小结

# 启动 Oracle
docker run -it -d -p 8080:8080 -p 1521:1521 sath89/oracle-12c

# 启动 php
docker run -p 8090:80 -d -v /Users/hua/docker/sample:/var/www/html thomasbisignani/docker-apache-php-oracle

# 进入 Oracle 容器里面
docker exec -it cranky_greider /bin/bash
# 以 pentest身份 进入 Oracle 命令行
$ORACLE_HOME/bin/sqlplus pentest/pentest

# 浏览器访问
本机 ip:8090

PS:使用Navicat连接Oracle

映射出来的是1521端口,为Oracle数据库的连接端口

1、连接时出现 cannot create oci handles

因为所使用的oci.dll的环境与服务器的Oracle版本不符。

在这里插入图片描述

我这里的版本是12.1.0,去Navicat目录下查看版本,我这里已经修改过了,之前是11.1.0

在这里插入图片描述

可以去Oracle官网下载对应版本。

https://www.oracle.com/database/technologies/instant-client/winx64-64-downloads.html

解压后将文件夹放在Navicat根目录下即可,然后引用这个版本的oci.dll环境,保存重启即可。

2、连接时出现 ORA-12514:TNS:listener does not currently know of service requested in connect descriptor

这里是由于使用的服务名对应不上,Navicat连接Oracle的默认服务名为ORCL

  • 使用Oracle身份进入sql界面sqlplus / as sysdba
  • 执行show parameter names,显示的service_names对应的values就是navicat对应的服务名


连接成功。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值