본문 바로가기
Hacking/DreamHack

[DreamHack] 드림핵 Type c-j

by st-og 2023. 11. 14.

 

올바른 id와 pw 값을 넣으면 flag값을 반환하는 문제이다.

 

소스코드

index.php

화면의 기본적인 출력을 담당하는 페이지며 로그인 기능을 구현하였다.

 

check.php

정해진 id와 pw값을 지정한 후 form을 통해 입력받은 데이터와 비교하여 맞을 경우 flag를 아닐 경우 에러를 출력한다.


풀이

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;

 

getRandStr이라는 함수는 characters변수에 나올 수 있는 값을 미리 저장한 후 랜덤 한 값을 10번 가져와 randomString에 저장한 후 리턴을 하는 함수이다.

 

$id = getRandStr();
$pw = sha1("1");

 

변수 id에 getRandStr을 통해 랜덤 한 문자열 10자리를 가져와 저장하고

변수 pw에 1이라는 문자열을 sha1함수를 통해 암호화 한 값을 넣어준다

 

// POST request
if ($_SERVER["REQUEST_METHOD"] == "POST") {
  $input_id = $_POST["input1"] ? $_POST["input1"] : "";
  $input_pw = $_POST["input2"] ? $_POST["input2"] : "";
  sleep(1);

 

input 받은 값들을 각 변수에 저장한다.

 

  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>";
      }

input_id 값이 랜덤 한 문자열과 동일하고 10자리라면 ID pass를 출력하고 그 후 

input_pw값이 sha1 암호화한 값의 8자리라면 flag를 출력한다.

 


id값을 알기 위해서 모든 값을 대입해 보는 브루트포스 공격을 사용할 것이다.

브루트포스를 통해 id를 찾으려 할 수 있겠지만 해당 문제는 php의 비교 연산자의 취약점에 대해 알려주는 문제였던 것이다.

 

여기서 중요하게 봐야 할 코드는 이 코드이다.

if((int)$input_id == $id

input_id를 가져와 비교할 때 int형으로 변환을 해준다. 이때 만약 input_id가 문자열로 시작한다면 해당 값은 0이 되고 숫자가 먼저 올 경우 먼저 온 숫자까지만 값으로 변환한다

 

예를 들어 아래의 코드가 실행된다면

 

결괏값은 이렇게 나오게 된다.

 

이렇듯 문자열이 먼저 올 모든 경우에는 0이 반환이 된다.

 

이때 좌항을 비교하던 id도 int형과 비교를 하기 때문에 id의 값 역시 int형으로 형 변환을 하여 비교하게 된다.

그러니 해당 id의 값은 서로 0이 되는 값을 넣기만 하면 되는 것이었다.

 

그럼 10자리를 모두 0으로 채워준다면 id는 해결이 된 것이다.

 

그 후 pw를 알기 위해 sha1암호화 방식으로 1을 암호화하게 된다면 356a192b7913b04c54574d18c28d46e6395428ab 라는 값이 나오는데 이 중 8자리만 필요하기에 356a192b를 비밀번호로 사용하게 된다면

 

 

성공적으로 flag를 확인할 수 있다.

'Hacking > DreamHack' 카테고리의 다른 글

[DreamHack] 드림핵 amocafe  (0) 2023.11.17
[DreamHack] 드림핵 random-test  (1) 2023.11.17
[DreamHack] 드림핵 baby-union  (1) 2023.11.14
[DreamHack] 드림핵 phpreg  (0) 2023.11.14
[DreamHack] 드림핵 Carve Party  (0) 2023.11.13