write-ups/websec.fr

websec.fr level28 write up

2018. 6. 28. 15:27




레드벨벳 아이린 ~ ㅎㅎ @아육대

\(For my blog foreign visitors! she's name is Irene who is a leader of girl group, RedVelvet)


 문제 소스를 처음 봤을 때는 crc32() 를 우회해야하는 줄 알았지만, sleep(1) 함수를 보자마자 exploit 방법이 생각났다.  


  $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);


 해당 코드를 통해서 fread()로 읽은 업로드한 파일의 내용을 md5(ip).php 에 저장한다. 그리고 분기문을 통해 다음 값을 확인한다. 


  md5_file($filename) === md5_file('flag.php')

  $_POST['checksum'] == crc32($_POST['checksum'])


 crc32 같은 경우는 다음과 같이 우회할 수 있다. 



 해당 스크립트를 실행시키면 pwnpwnpwn이 출력된다. 이유는 Loose compare 때문이다. 



이렇게 해서 우회했더라도 md5_file($filename) === md5_file('flag.php') 가 막막한 상황이다. 하지만 우리는 sleep(1)을 볼 수 있다. 


  $flag "Nope, $filename is not the right file, sorry.";
  sleep(1);  // Deter bruteforce


 근데 잘 생각해보면 unlink() 로 파일을 remove 하기 전에 sleep(1) 을 하기 때문에 우리는 약간의 race condition 취약점을 이용할 수 있게 된다. 그럼 sleep(1) 동안 md5(ip).php로 접근할 수 있기 때문에 우리는 웹쉘을 업로드했고, 쉘을 딸 수 있는 것이다. (주석으로 페이크를 이렇게 치는구나ㅋㅋ) 



 물론 아직 풀어보진 않았고, 그냥 내 생각일 뿐이다. 문제 해결법을 생각하고 문제를 진짜 잘내구나.. 라는 생각만 들었다. 


 [*] the write up code : https://github.com/ch4n3-yoon/write-ups/tree/master/websec.fr/level28 


'write-ups > websec.fr' 카테고리의 다른 글

websec.fr level10 write up  (0) 2018.07.03
websec.fr level25 write up  (0) 2018.07.03
websec.fr level14 solving  (0) 2018.03.24
websec.fr level15 write up  (0) 2018.03.21
websec.fr level06 write up  (0) 2017.12.11