20240509

mwaah·2024년 5월 9일
0
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.

0개의 댓글