websec.fr level28 write up
레드벨벳 아이린 ~ ㅎㅎ @아육대
\(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($fp, filesize($_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 |