万能密码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";
输出结果
也就是在原来基础上转成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