아래와 같은 소스가 있다.
<?php
if (isset($_GET['view-source'])) {
show_source(__FILE__);
exit();
}
if(isset($_POST['ps'])){
sleep(1);
mysql_connect("localhost","md5_password","md5_password_pz");
mysql_select_db("md5_password");
mysql_query("set names utf8");
/*
create table admin_password(
password char(64) unique
);
*/
include "../lib.php"; // include for auth_code function.
$key=auth_code("md5 password");
$ps = mysql_real_escape_string($_POST['ps']);
$row=@mysql_fetch_array(mysql_query("select * from admin_password where password='".md5($ps,true)."'"));
if(isset($row[0])){
echo "hello admin!"."<br />";
echo "Password : ".$key;
}else{
echo "wrong..";
}
}
?>
지금 보면 md5함수에 true 인자값이 보일 것이다.
이 인자는 원래 md5함수가 32byte 해쉬를 가지는데 true를 해주면 16byte로 변경해준다.
만약 해쉬가 ~~'=' 을가지면 유니코드를 인식을 하는 mysql은 auto typecasting에 의해서 0으로 변환되고
0='' 이기때문에 로그인에 성공한다.