본문 바로가기

SWLUG/CTF

[CTF/ Dreamhack] Type c-j

 

Type c-j

Description php로 작성된 페이지입니다. 알맞은 Id과 Password를 입력하여 플래그를 획득하세요. 플래그의 형식은 DH{...} 입니다.

dreamhack.io

 

 

 

문제 확인

 

 

 

 

 

 

 

문제 풀이

 

 

서버 생성하여 접속한 화면이다.

 

 

다운로드 받은 파일 중 check.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>';
     }

 

 

 

 

우선 위 getRandStr() 함수를 통해 $id는 무작위 10자리 문자열을 생성하는 걸 알 수 있다.

 

$pw는 sha1("1")로 값을 저장하고 있는데, SHA-1 해시 값은 규칙을 설정하지 않는 경우 40자리의 16진수 문자열 확인할 수 있다. 이 값은 항상 "356a192b7913b04c54574d18c28d46e6395428ab"이다. 

 

출처 : http://host3.dreamhack.games:15217/check.php

 

 

 

 

sha1()

** php 단방향 암호화/ 해쉬함수; Secure Hash Algorithm 

  현재는 md5 와 같이 결함이 발견되어 보안용도로는 사용하지 않도록 권장하는 알고리즘이다.

 

- 사용방법

   sha1([문자열], [규칙]);

 

- sha1()의 인수 값      // 규칙
   TRUE - sha1 의 결과값이 20자리가 되어 출력
   FALSE - sha1 의 결과값이 40자리가 되어 출력되어 규칙을 설정하지 않는 경우 기본값

 

 

 

 

 

 

 

위의 코드에서 $input_pw의 길이를 8로 조건을 맞춰두었기에, "356a192b7913b04c54574d18c28d46e6395428ab"의 앞 8자리로 설정해준다. 즉, "356a192b"

 

 

$input_id 는 (int)로 형변환을 해주고 있는데, 이는 다음과 같은 규칙성을 가진다.

따라서 첫 번째 문자열이 문자이면 항상 0을 출력하므로 '0000000000'로 설정해준다.

 

 

출처 : https://dreamhack.io/forum/qna/4479/

 

 

 

 

 

따라서 해당 값을 대입하여 제출하면 플래그를 획득할 수 있다.

 

 

 

 

플래그 획득!

 

 

 

 

 

 

 

 

 

 

 

[출처]

 

PHP 단방향 암호화 사용하기 (sha1)

     - 단방향암호화 / 해쉬란?      암호화는 특정인에게만 정보를 ...

blog.naver.com

 

 

왜 1111111111 은 id로 쓸 수 없나요?

아무리 생각해봐도 모르겠습니다... id에 대한 조건을 만족시키는것 아닌가요?

dreamhack.io

 

'SWLUG > CTF' 카테고리의 다른 글

[WebHack][Webhacking.kr] old-52  (1) 2024.09.23
[WebHack][WebGoat] 환경세팅 & Hijack a session  (1) 2024.09.16
[CTF/ 써니나타스] Web -1  (0) 2024.05.23
[CTF/Dreamhack] easy-login  (0) 2024.05.21
[CTF/Dreamhack] web-misconf-1  (0) 2024.05.17