<?php
// system($_GET['q']);
if(!preg_match('/^[a-f0-9]+$/',$_COOKIE['baby_toctou'])){ $newCookie = uniqid().rand(1,999999999); setcookie("baby_toctou",$newCookie); $_COOKIE['baby_toctou'] = $newCookie; }
$cmd = $_GET['q'];
$myfile = fopen("user/{$_COOKIE['baby_toctou']}.sh", "w") or die("Unable to open file!");
fwrite($myfile, $cmd);
fclose($myfile);
if(($cmd === "ls") || ($cmd === "cat api.php") || ($cmd === "cat index.php")){ // valid check
sleep(1); // my server is small and weak
system("sh ./user/{$_COOKIE['baby_toctou']}.sh");
}
else{
echo <<<HELP
only "ls", "cat api.php", "cat index.php" allowed
HELP;
}
?>
cat api.php를 한 결과입니다.
입력한 명령어가 파일에 fwrite 함수로 저장되며
명령어를 검사한 뒤 system 함수로 수행해 줍니다.
if문으로 검사를 진행한 뒤 sleep(1)을 수행하는데
이 부분에서 레이스 컨디션이 발생합니다.
아래와 같이 탭 2개를 열어
하나의 탭에서 ls를 수행한 뒤
1초 안에 바로 cat flag.php를 입력하면
ls 명령어의 결과가 cat flag.php가 됩니다.
끝!
'write-up(web) > webhacking.kr' 카테고리의 다른 글
[Webhacking.kr] Challenge old-52 write-up (2) | 2023.09.20 |
---|---|
[Webhacking.kr] sliping beauty write-up (0) | 2023.09.08 |
[Webhacking.kr] Challenge old-60 write-up (0) | 2023.04.05 |
[Webhacking.kr] Challenge old-13 write-up (0) | 2023.03.26 |
[Webhacking.kr] Challenge old-40 write-up (1) | 2023.01.19 |