보안을 그리다, 훈이

[2021 INCOGNITO CTF] Web - Do you know Hashes Write Up 본문

Capture The Flag/CTF 풀이

[2021 INCOGNITO CTF] Web - Do you know Hashes Write Up

HooNeee 2021. 9. 12. 18:37
[Web] Do you know Hashes
해시 좀 쳐보셨나요?
http://3.37.81.93:20929/

 

링크에 접속하면 다음과 같은 페이지가 나타난다.

 

 

PHP 코드로 작성되어 있는데,

$keys[1]의 md5 hash와 $keys[2]의 crc32 hash가 일치해야 하고 $keys[2]의 crc32 hash와 $keys[3]의 md4 hash가 일치해야 하며 $keys[1]의 md5 hash와 $keys[3]의 md4 hash가 서로 일치하게 되면 {flag}를 alert 창으로 띄워준다고 한다.

 

따라서 이는 PHP magic hash에 대한 문제인 것을 알 수 있다.

 

PHP magic hash는 PHP에서 == 연산자로 비교 시, 문자열의 형식이 ^0+e\d*$로 되어있을 때 이를 숫자형 데이터와 비교하게 되면 0으로 인식하게 되는 현상을 이용한 것인데 0의 n제곱은 항상 0이기 때문에 이러한 현상이 나타나게 된다.

 

Hash Type Magic Number / String Magic Hash
md5 240610708 0e462097431906509019562988736854
crc32 2332 0e684322
md4 48291204 0e266546927425668450445617970135

 

Magic Number를 차례대로 넣어봤다.

 

 

Run Code로 코드를 돌리자마자 플래그가 튀어나왔다.

 

저 Magic Number String을 사용하지 않아도 가능한 방법은 많은데, 아래 사이트에 작성되어 있는 Magic hash라면 다 가능하다.

 

GitHub - spaze/hashes: Magic hashes – PHP hash "collisions"

Magic hashes – PHP hash "collisions". Contribute to spaze/hashes development by creating an account on GitHub.

github.com

 

<?php
   $keys = [
      NULL,
      "QLTHNDT",
      "HFS_uPqtIQPl",
      "gH0nAdHk"
   ];

   if(hash('md5', $keys[1]) == hash('crc32', $keys[2])){
      if(hash('crc32', $keys[2]) == hash('md4', $keys[3])){
         if(hash('md5', $keys[1]) == hash('md4', $keys[3])){
            echo "<script>alert('[Verified Success]\\nCongrats! {flag}');</script>";
         }else fail();
      }else fail();
   }else fail();

   function fail() {
     echo "<script>alert('Failed to verify!');</script>";
   }
?>

 

따라서 이런것도 가능.

끝.

 

flag : INCO{L0L_YoU_H1t_Ha5hes_50_MuCH!!}
Comments