0x00 安装 Oracle

人生苦短, 我用 Docker

要下载的镜像较大, 建议更换阿里源

然后将该源添加到 docker 的配置文件中.

{
  "registry-mirrors": [
    "https://bai7u4sr.mirror.aliyuncs.com"
  ]
}

更换源之后, 直接 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

参数解释如下:

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

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

docker logs -f myoracle

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

接下来进入容器:

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

参数解释如下:

  1. -it: 为容器重新分配一个伪输入终端
  2. env LANG=C.UTF-8: 为了能够正常处理中文

先创建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) -- 奖学金
);

执行三次exit退出容器后, 停止并删除容器:

docker stop myoracle
docker rm myoracle

接下来再起一次:

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

此时再查看

docker logs -f myoracle

会显示:

没有再初始化了. 进入数据库看看:

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

证明数据已经可以持久化, 至此, 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 = '//192.168.31.80: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>";
?>

然后运行下面命令, 将/Users/hua/docker/sample当做容器里面的/var/www/html, 映射到本地的8090端口

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

访问一下 http://192.168.31.80:8090/ 测试能够成功连接 Oracle

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. 给用户授予权限(因为是测试注入, 所以给dba权限)

     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;

    记得 insert 完要 commit

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

     <?php
     $username = 'pentest';
     $password = 'pentest';
     $connectText = '//192.168.31.80: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 小结

最后小结一下, 对于我来说, 以后我要启动环境, 只需要以下命令:

# 启动 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

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

# 进入 Oracle 容器里面
docker exec -it myoracle env LANG=C.UTF-8 /bin/bash
# 以 pentest身份 进入 Oracle 命令行
$ORACLE_HOME/bin/sqlplus pentest/pentest

# 修改 php
修改 /Users/hua/docker/sample 下的 php

# 浏览器访问
本机 ip:8090

最后, 用完记得停止并删除容器

docker stop myoracle
docker rm myoracle
docker stop focused_einstein
docker rm focused_einstein

0x05 参考链接

http://www.cocoli.top/index.php/archives/534/

https://www.tr0y.wang/2019/04/16/%E7%94%A8Docker%E5%AE%89%E8%A3%85Oracle/

最后修改:2020 年 06 月 28 日 06 : 30 PM
如果觉得我的文章对你有用,请随意赞赏