[Solved in under 7 minutes]
ํ ๋ง ์๋ค. ๋ ์~
๊ฐ๋ณด์

์์ด ์ด๋ฆฐ๋ค ๋ฐ๋ก ์๋ฌด ๋๋ ํ ๋ฆฌ ๋ด ํ์ผ์ ๋ณด์

๋ญ ํ์ผ์ด ์ฌ๋ฌ๊ฐ๊ฐ ๋ณด์ธ๋ค
cat ๋ช
๋ น์ด๋ฅผ ํตํด ์๋ฌด๊ฑฐ๋ ๋ณด์

๋ณด์ํ๋ ์ฃผ์ด์ง ๋ช
๋ น์ด๋ง ์ณ์ผ ํ๋ค.
๋ง์ ๊ณฑ๊ฒ ๋ค์ผ๋ฉฐ api.php๋ฅผ ๋ณด์

<?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;
}
?>
TOCTOU ๋ฌธ์ ๋๋ค
์ฌ๊ธฐ์ ํฌ์ธํธ๋ valid check ํ๊ณ sleep(1) ๊ฐ ๊ฑธ๋ ค์์ผ๋ ๋จ๊ธฐ๊ฐ์์ ๋น ๋ฅธ ํ์ด๋ก๋๋ฅผ ์ง์ด๋ฃ์ผ๋ฉด ๋ช ๋ น์ด๊ฐ ๋จนํ์ง๋ ๋ชจ๋ฅธ๋ค.
์ฆ, 1์ด ์ฌ์ด์ ๊ฐ์ baby_toctou ์ฟ ํค๋ก ๋ค๋ฅธ ์์ฒญ์ ๋ณด๋ด์ ํ์ผ ๋ด์ฉ์ ์ํ๋ ๋ช ๋ น์ด๋ก ๋ฎ์ด์ฐ๋ ์๋ฆฌ
๋ ์ด์ค์ปจ๋์
์ผ๋ก ๋ฐ๋ก ํ์ด๋ณด์

๋ง์ ์์ ์๋ํ ๋๋ ์ธํธ๋ฃจ๋๋ฅผ ์ฌ์ฉํ๋๋ฐ sleep(1) ์ด๋ ์ด๊ฑธ๋ก๋ ๋ ๊ฒ ๊ฐ๋ค.
์ผ๋จ ์ธํฐ์
ํธ๋ถํฐ ํด๋ณด์
์ธํฐ์
ํธ ์ผ์ ํจํท ์กํ๊ฒ ํด๋๊ณ

์ฒ์์๋ ํ์ฉํ๋ ๋ฒ์์ ๋ช
๋ น์ด๋ฅผ ์
๋ ฅํ๊ณ
๊ทธ ์ดํ์ ๋ด๊ฐ ์ํ๋ ๋ช
๋ น์ด๊ฐ ์ฝ์
์ด ๋๊ฒ ํ๋ค.
์ธํฐ์
ํธ๋ก ์ก๊ณ ์์ด์ ์ฌ์ค์ ํจํท์ ์์ง ์ ๊ฐ ์ํ๋ค ๋ด๊ฐ ๋ถ์ก๊ณ ์๋ค๊ณ ์๊ฐํ๋ฉด ๋จ๋น

ํจํท์ด ๋๊ฐ ์กํ๊ณ
์ฒซ๋ฒ์งธ๋ ls, ๋๋ฒ์งธ๋ cat flag.php ๋ค

์ฌ๊ธฐ์ ์ธํฐ์
ํธ๋ฅผ ๊บผ์ฃผ๋ฉด?
์ธํฐ์ ํธ๊ฐ ์ผ์ ธ์๋ค๊ฐ ๋๋ฉด ํจํท๋ค์ด ์์๋๋ก ๋น ๋ฅด๊ฒ ์์ฒญ๋๋ค.
์ค๋ฌด์์๋ ํจํท 100๊ฐ๋ฅผ ํ๋ฒ์ ์๋ ๊ทธ๋ฐ ํ
์คํธ๋ฅผ ํ์ง๋ง ์ฌ๊ธฐ์๋ ์ํด๋ ๋ ๊ฒ ๊ฐ๋ค.

์? ๋ฐ๋ก ํ๋ ธ๋ค.
๊ฐ์ง๊ณ ๊ฐ๋ณด์ฅ

ใ
กใ
กใ
กใ
กใ
กใ
กใ
กใ
กใ
กใ
กใ
กใ
กใ
กใ
กใ
ก ๋ต ใ
กใ
กใ
กใ
กใ
กใ
กใ
กใ
กใ
กใ
กใ
กใ
กใ
กใ
กใ
ก
FLAG{Mama_i_know_how_toctou_works}
ใ
กใ
กใ
กใ
กใ
กใ
กใ
กใ
กใ
กใ
กใ
กใ
กใ
กใ
กใ
กใ
กใ
กใ
กใ
กใ
กใ
กใ
กใ
กใ
กใ
กใ
กใ
กใ
กใ
กใ
กใ
กใ
ก
์๋ง! ๋ TOCTOU๊ฐ ์ด๋ป๊ฒ ์๋ํ๋์ง ์๊ฒ ๋์์ด์!!
๋ ์ด์ค์ปจ๋์ ์ ๋ํด์ ์ค์ตํ๊ธฐ์ ์ข์ ๋ฌธ์ ์ธ ๊ฒ ๊ฐ๋ค.
Webhacking.kr Baby toctou๐ผ Write-up
์ด์ ๋ณด๊ณ ๋!