万能密码ffifdyop原理

为什么在填密码的时候ffifdyop能被当做万能密码执行呢?

首先我们来看一个sql语句

select * from 'admin' where password=md5($pass,true)

在php中md5中的第二个参数不填默认是no,也可以填入yes

当第二个参数为no时返回的是一个十六进制字符串

当第二个参数为yes时返回的是二进制字符串(也就是16字符串转ascii码字符串)

接下来看一个实验

$data = "Hello, world!";

// 计算 MD5 哈希值,不带 true 参数
$hashHex = md5($data);
echo "MD5 哈希(十六进制字符串): " . $hashHex . "\n";

// 计算 MD5 哈希值,带 true 参数
$hashBinary = md5($data, true);
echo "MD5 哈希(原始二进制数据): " . $hashBinary . "\n";

输出结果

image-20231205222835639image-20231205222923403也就是在原来基础上转成ascii码

回到原来的mysql语句

select * from 'admin' where password=md5($pass,true)

在这里sql会将传入的$pass在进行md5哈希后 在‘admin’表中匹配是否有与其相等的值

这时我们传入ffifdyop

ffifdyop在md5后会变成

276f722736c95d99e921722cf9ed621c

而在mysql中它会将hex当成ascii执行,也就是当成字符串执行

将276f722736c95d99e921722cf9ed621c转ascii后会变成

'or'6É]™é!r,ùíb

总的来说它的变化过程如下

ffifdyop->276f722736c95d99e921722cf9ed621c->'or'6É]™é!r,ùíb

而在将结果拼接后最终语句是这样的

select * from admin where password=''or'6<乱码> 

相当于

select * from admin where password=''or 1

从而实现sql注入

相同的值有

129581926211651571912466741651878684928

posted @ 2023-12-05 22:19  redfish999  阅读(300)  评论(0编辑  收藏  举报