Oracle注入简单挖掘

  • A+

注入类攻击作为OWASP top10的常客广为人知,其中SQL注入首当其冲。但是由于数据库繁多,MySQL、Oracle、DB2、SqlServer…..,各个数据库的特性不尽相同,导致各种注入利用手法也五花八门。本文从Oracle数据库展开,对其注入点判断的手法进行探究。

挖掘思路:

随着安全的不断发展,现有的一些安全防护设备对我们常用的and 1=1并不太友好,但是最简单的总是最好用的。先看几个Oracle数据库的SQL语句:

数字类型支持算数表达式:

查询USER_ID等于1的用户信息:
select * from TB_USER where USER_ID=1;
查询结果如下:

image.png
可以看到USER_ID的类型应该是Integer整型的,那么此时可以使用算数表达式,进行相关的查询,例如1-0,1+0,1/1…..:
Example:
select * from TB_USER where USER_ID=1-0;
查询结果跟上面应该是一致的:

image.png
那么也就是说,当注入点为数字型的时候,可以考虑利用算数表达式,执行一个简单的加减乘除,达到判断注入点的目的。

’||’连接符:

Oracle使用’||’进行字符串的连接,例如tksw’||’iftytkswifty。
查询USER_NAME为tkswifty的用户:
select * from TB_USER where USER_NAME='tkswifty';
查询结果:

image.png
那么按照’||’的用法,tksw’||’ifty的查询结果应该是与上面的结果是一致的,tksw’||’test查询结果应该为null(拼接后的结果为tkswtest,数据库中没有对应的用户),利用这一点,也可以快速的定位SQL注入问题。
此外,在使用拼接符的时候,两个字符间可以使用expression表达式。这时候就更灵活了,还是上面的这个例子,可以使用如下语句进行查询,与直接查询tkswifty结果是一样的:
select * from TB_USER where USER_NAME='tksw'||(select 'i' from dual)||'fty';
那么结合类似case when等逻辑判断可以进一步进行SQL注入的利用。

有趣的1/0:

Mysql数据库中1/0是warning,还是可以成功返回内容的:

image.png
但是在Oracle数据库中,1/0会触发error,并不能返回查询结果:

image.png
利用这一点就可以对前面(1)(2)进行对应的优化了,例如无论如何构造,都不能查询到内容(可能数据库记录为null),那么这时候针对数字型注入,可以考虑1/1,1/0,来触发报错进行注入点的判断,字符型注入也是一样,应该两个字符间可以使用expression表达式,那么’||1/1||’跟’||1/0||’很明显能达到我们想要的效果。
同理,针对Order By注入,可以考虑以Order By Name,1/0的方式,来触发报错,进行注入点的判断利用。

实战挖掘:

结合自己搭建的环境,以下是相关的漏洞验证:

字符型注入:

正常查询如下

image.png
按照上面的思路,如果name参数存在SQL注入,使用’||’进行拼接,查询tksw’||’ifty跟tksw’||’test的结果应该是不一致的:

image.png

image.png
到这里基本可以判断这里存在字符型注入了,可以用sqlmap进行二次验证:

image.png

数字型注入:

正常查询id=1的结果如下:

image.png
这里使用1/0进行简单的注入判断,可以看到1/0成功执行并展示报错信息,当然可能有些程序做了通用的报错页面,那么也可以通过状态码或者错误页的跳转来判断:

image.png
同样是sqlmap的验证:

image.png

Order by注入:

正常情况下以USER_NAME排序的结果如下:

image.png
这里利用1/0来进行验证,同样的可以看到1/0成功执行并展示报错信息,当然可能有些程序做了通用的报错页面,那么也可以通过状态码或者错误页的跳转来判断:

image.png
那么后续可以通过修改1/0的结构,加入对应的逻辑判断语句,进行更深入的SQL注入利用。

总结:

最简单的也是最好用的,判断出注入点后,即使使用工具无法进行进一步的深入,也可以结合注入点尝试脚本交互的方式进行相关的利用,同时也避免了类似and 1=1等常见的waf规则。

image.png

相关推荐: Spring 自动绑定漏洞

Spring 自动绑定漏洞 0x01:自动绑定 自动绑定功能在很多框架中都有实现,主要功能是允许软件框架自动将HTTP请求中的参数绑定到程序变量或对象中以便于开发者访问。 而自动绑定漏洞的漏洞点在于,攻击者可能将额外的HTTP请求参数绑定到一个对象上,使用这种…