源码:
文件名:md5-sql.php
<?php
header("Content-Type:text/html;charset=gb2312");
error_reporting(0);
$link=mysql_connect('localhost:3306','root','');
if(!$link){
die('Could not connect to MySQL:'. mysql_error());
}
//选择数据库
$db=mysql_select_db("security",$link);
if(!$db)
{
echo 'select db error';
exit();
}
//执行sql
$password=$_GET['password'];
$sql="SELECT * FROM users WHERE password = '".md5($password,ture)."'";
var_dump($sql);
$result=mysql_query($sql) or die('<pre>'.mysql_error().'</pre>');
echo "id user password"."<br>";
while($row=mysql_fetch_array($result)){
echo $row[0]." ".$row[1]." ".$row[2]."<br>";
}
mysql_close($link);
?>
分析代码:
这里的sql语句是
$sql="SELECT * FROM users WHERE password = '".md5($password,ture)."'";
其中md5运算函数有一个true参数,它的作用是将md5后的hex转换成字符串,这里如果后的字符串有单引号之类的字符就可以注入了。
比如字符串:ffifdyop,md5后,276f722736c95d99e921722cf9ed621c
将其转成字符串的话就是**‘or’6蒥欓!r,b’’**。
可以看到起字符串类似于 ‘ or ‘6…………这样的字符串,其中’or’6是个永真的条件,如果把它放到查询中就可以where语句的判断,比如我们在url输入password=ffifdyop可以看到dump出的数据,只要or后面以非零数开头,都是永真条件,不管后面是什么
数据库的真实数据
构造payload:
?password=ffifdyop
成功获取数据库user里面的数据。