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对应的服务名


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

被折叠的 条评论
为什么被折叠?



