문제에 들어가서 소스를 보면 다음과 같다.


<?php
if(isset($_POST['submit'])) {
  if (
$_FILES['flag_file']['size'] > 4096) {
    die(
'Your file is too heavy.');
  }
  
$filename md5($_SERVER['REMOTE_ADDR']) . '.php';

  
$fp fopen($_FILES['flag_file']['tmp_name'], 'r');
  
$flagfilecontent fread($fpfilesize($_FILES['flag_file']['tmp_name']));
  @
fclose($fp);

    
file_put_contents($filename$flagfilecontent);
  if (
md5_file($filename) === md5_file('flag.php') && $_POST['checksum'] == crc32($_POST['checksum'])) {
    include(
$filename);  // it contains the `$flag` variable
    
} else {
        
$flag "Nope, $filename is not the right file, sorry.";
        
sleep(1);  // Deter bruteforce
    
}

  
unlink($filename);
}
?>


파일 업로드 후 해당 파일의 md5값과 flag 파일의 md5 값 비교 및 내가 입력한 checksum 값과 해당 값을 crc32한 값이 같으면 플래그를 뿌려주고 해당 조건을 통과 못하면 파일을 삭제한다.


일단 플래그를 뿌려주는 조건과 같은 경우에는 crc32는 느슨한 비교를 하고 있어 아무 값도 주지 않을 경우 우회가 가능하지만 md5부분은 도저히 우회할 방법이 없었다.


근데 잘 보면 파일 업로드 후 삭제루틴을 탈 때 중간에 sleep 함수가 존재한다. 주석에는 브루트포싱을 하지 말라고 적어져있지만 보통 파일 업로드 삭제 사이에 시간관련 함수가 존재할 경우에는 Race Condition이 가능하다. 위와 같은 경우에는 시간이 1초나 주어져있기 때문에 성공확률도 매우 높다.


파이썬으로 코드짜기 귀찮아서 그냥 버프 인트루더를 아래와 같이 돌렸다.









'Wargame > websec.fr' 카테고리의 다른 글

websec.fr easy level 13  (0) 2019.08.22
websec.fr easy level20  (0) 2019.08.22
Websec.fr babysteps level 25  (0) 2018.12.12
Websec.kr easy level 15  (0) 2018.03.08
Websec.fr easy level 11  (0) 2018.03.08
블로그 이미지

JeonYoungSin

메모 기록용 공간

,