function getRandStr($length = 10) {
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$charactersLength = strlen($characters);
$randomString = '';
for ($i = 0; $i < $length; $i++) {
$randomString .= $characters[mt_rand(0, $charactersLength - 1)];
}
return $randomString;
}
require_once('flag.php');
error_reporting(0);
$id = getRandStr();
$pw = sha1("1");
// POST request
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$input_id = $_POST["input1"] ? $_POST["input1"] : ""; // 사용자에게 ID 받음.
$input_pw = $_POST["input2"] ? $_POST["input2"] : ""; // 사용자가에게 PW 받음.
sleep(1);
// 10자리 제한 있음. 사용자 아이디는 랜덤임.
if((int)$input_id == $id && strlen($input_id) === 10){
echo '<h4>ID pass.</h4><br>';
// 8자리 제한 있음. 사용자 비밀번호는 sha1
if((int)$input_pw == $pw && strlen($input_pw) === 8){
echo "<pre>FLAG\n";
echo $flag;
echo "</pre>";
}
} else{
echo '<h4>Try again.</h4><br>';
}
}else {
echo '<h3>Fail...</h3>';
}
$id = getRandStr();
$pw = sha1("1");
이 부분에서 id는 랜덤으로 저장된 String, pw는 sha1을 1로 해싱한 값임을 알 수 있다.
하지만 코드를 자세히 보게 되면 모든 해싱된 값이 들어가지 않는데,
sha1로 해싱된 값에서 앞자리 8자리가 패스워드가 된다.
if((int)$input_pw == $pw && strlen($input_pw) === 8){
echo "<pre>FLAG\n";
echo $flag;
echo "</pre>";
}
id의 경우 int로 되어 있는데, 첫 번째 글자가 숫자가 아니면 0으로 인식을 한다. 따라서 00000000.