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
参数解释如下:
--name
: 容器名字-d
:后台运行容器, 并返回容器ID-p 本机端口:容器端口
: 端口映射-e ORACLE_ALLOW_REMOTE=true
: 设置允许远程连接.-v 本地目录:容器目录
: 挂载本地目录, 将数据保留在本机来达到数据持久化的目的, 要不每次起的容器都是全新的.
运行完上面的命令之后, 需要等待容器初始化. 可以通过下面命令查看进度.
docker logs -f myoracle
当最底下出现 Database ready to use. Enjoy! ;)
后代表初始化成功
接下来进入容器:
docker exec -it myoracle env LANG=C.UTF-8 /bin/bash
参数解释如下:
-it
: 为容器重新分配一个伪输入终端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 简单的测试(为以后注入做准备)
-
创建数据表空间
create tablespace pentest datafile '/u01/app/oracle/oradata/xe/pentest.dbf' size 100m;
-
创建用户并指定表空间
create user pentest identified by pentest default tablespace pentest;
-
给用户授予权限(因为是测试注入, 所以给dba权限)
grant connect,resource,dba to pentest;
-
exit
退出并以pentest
登录$ORACLE_HOME/bin/sqlplus pentest/pentest
-
建表并插入数据
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
-
然后修改 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/
版权属于:江南小虫虫
本文链接:https://fengwenhua.top/index.php/archives/39/
转载时须注明出处及本声明
1 条评论
yyds