[Webhacking.kr] Challenge04(old) write-up

칩깡·2022년 5월 4일
0

CTF

목록 보기
1/1

📌 문제소개


📌 문제추리

다른 부분을 볼 필요가 없는 듯 하다. 중간쯤에 배치되어있는

<?php
  sleep(1); // anti brute force
  if((isset($_SESSION['chall4'])) && ($_POST['key'] == $_SESSION['chall4'])) solve(4);
  $hash = rand(10000000,99999999)."salt_for_you";
  $_SESSION['chall4'] = $hash;
  for($i=0;$i<500;$i++) $hash = sha1($hash);
?><br>

코드만 정확하게 해석해서 취약점을 유추하면 된다.

한 줄 한 줄 해석해보면 우선 첫 번째 줄에서 brute force 공격 방법을 통해서 session의 값을 무차별 대입하는 공격을 방지하기 위해서 sleep(1) 코드를 넣어주었다.

다음으로 등장하는 if문에서는 문제가 풀리는 로직을 적어두었다.

chall4 페이지의 session이 생긴 후, 그 session값과 POST 방식으로 보낸 key 값을 단순비교하여 같으면 문제가 풀리는 것이다.

그런데 비교하는 session의 값은 $hash 변수에 10000000부터 99999999 사이의 난수 값을 "salt_for_you" 문자열에 이어붙이고 이를 session값으로 한 이후에 해당 값을 500번 sha1 암호화한다. 즉, 화면에 표시되는 $hash값을 보고 $_SESSION['chall4']의 값을 맞추는 것이 핵심이다.

500회의 복호화 과정을 우리가 물론 일일이 돌려볼 수는 있겠지만, 이 문제를 통해서 알아두면 편한 개념이 있다.

레인보우 테이블(Rainbow Table)

레인보우 테이블이란, MD5, SHA-1, SHA-2 등 해시함수를 사용하여 만들 수 있는 값들을 모두 저장한 표이다.

그렇다면 우리는 이 레인보우 테이블을 이용하여 주어진 $hash를 통해 평문을 유추해야 하는데, 이는 python 프로그램을 작성하여 해결해 줄 수 있다.

이렇게 코드를 작성해 주었다. (key값을 블로그를 작성하면서 달라져서 지금 맞는 값으로 넣었다.)

이렇게 작성한 코드를 실행하여 flag 값을 찾아서 key 값에 대입해주면 문제가 해결된다.

profile
AU CyberSecurity 21

0개의 댓글