https://dreamhack.io/wargame/challenges/960
들어가면 이렇게 뜬다.



admin 입력 시 다시 시도하라고 뜬다.
주어진 코드를 확인해보았다.
<?php
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"] : "";
$input_pw = $_POST["input2"] ? $_POST["input2"] : "";
sleep(1);
if((int)$input_id == $id && strlen($input_id) === 10){
echo '<h4>ID pass.</h4><br>';
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는 랜덤으로 생성되어있고, pw는 sha1을 1로 해싱한 값이 저장되어있다.
if((int)$input_pw == $pw && strlen($input_pw) === 8){
echo "<pre>FLAG\n";
echo $flag;
echo "</pre>";
}
해싱된 값은 8자리로 제한을 받는다. 즉, 10자리 문자열이 들어가면 앞의 8자리만 들어가게된다.
해싱된 값을 찾기 위해서 https://www.strerr.com/ko/sha1.html 이 사이트를 이용해 구해보았다.

해싱된 값은 356a192b7913b04c54574d18c28d46e6395428ab이다.
그러므로 356a192b가 pw가 된다.
id는 랜덤으로 생성되는데
if((int)$input_id == $id && strlen($input_id) === 10){
echo '<h4>ID pass.</h4><br>';
int는 첫번째 글자가 숫자가 아니면 0으로 인식한다.
그래서 id는 0000000000이 된다.
