[드림핵] Type c-j

SONG's 보안·2024년 5월 26일

드림핵

목록 보기
33/33

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이다.

그러므로 356a192bpw가 된다.

id는 랜덤으로 생성되는데

if((int)$input_id == $id && strlen($input_id) === 10){
    echo '<h4>ID pass.</h4><br>';

int는 첫번째 글자가 숫자가 아니면 0으로 인식한다.
그래서 id0000000000이 된다.

profile
前) SWLUG 27기

0개의 댓글