반응형
문제
<?php
include "../../config.php";
if($_GET['view_source']) view_source();
login_chk();
echo "Your idx is {$_SESSION['idx']}<hr>";
if(!is_numeric($_COOKIE['PHPSESSID'])) exit("Access Denied<br><a href=./?view_source=1>view-source</a>");
sleep(1);
if($_GET['mode']=="auth"){
echo("Auth~<br>");
$result = file_get_contents("./readme/{$_SESSION['idx']}.txt");
if(preg_match("/{$_SESSION['idx']}/",$result)){
echo("Done!");
unlink("./readme/{$_SESSION['idx']}.txt");
solve(60);
exit();
}
}
$p = fopen("./readme/{$_SESSION['idx']}.txt","w");
fwrite($p,$_SESSION['idx']);
fclose($p);
if($_SERVER['REMOTE_ADDR']!="127.0.0.1"){
sleep(1);
unlink("./readme/{$_SESSION['idx']}.txt");
}
?>
<html><head><title>Challenge 60</title></head><body><a href=./?view_source=1>view-source</a></body></html>
idx 세션 값이 result 변수에 존재해야 문제가 해결된다.
이 때 result 변수에는 readme 폴더의 {$_SESSION[‘idx’]}.txt 파일의 내용이 들어가 있다.
문제풀이
전제조건은 쿠키 값이 숫자이면서, mode 파라미터 값은 auth가 되어야 한다.
readme 디렉토리에 {$_SESSION['idx']}.txt 파일을 생성하고, 파일 내용으로 $_SESSION['idx']를 생성한다.
문제 해결 조건이 만족하여 문제 해결이 가능하다.
주소가 127.0.0.1이 아닐 때, sleep(1) 후에 unlink 함수를 이용해 파일을 삭제하기 때문에 파일이 삭제되기 전에 접근하여 파일을 읽어야 한다.
세션이 같으면 같은 프로세스로 인식하기 때문에 두개의 웹브라우저를 이용해야 한다.
레이스컨디션(race condition)
한정된 자원을 동시에 이용하려는 여러 프로세스가 자원의 이용을 위해 경쟁을 벌이는 현상
프로세스, 스레드에서 사용되는 자원이 공유된 상태일 경우 자주 발생하기 때문에 공유된 자원을 동시에 사용하지 않게 해야 한다.
데이터 손상, 권한 상승 등 취약점이 발생될 수 있으며, 다양한 언어, 웹 서비스에서 발생한다.
위 문제는 하나의 프로세스는 파일 생성하고, 다른 프로세스는 auth를 요청해 파일이 삭제되기 전에 파일을 읽는다.
반응형
'write-up(web) > webhacking.kr' 카테고리의 다른 글
[Webhacking.kr] BABY (0) | 2023.01.16 |
---|---|
[Webhacking.kr] old-61 (0) | 2023.01.15 |
[Webhacking.kr] old-59 (0) | 2023.01.14 |
[Webhacking.kr] old-57 (0) | 2023.01.11 |
[Webhacking.kr] old-56 (0) | 2023.01.10 |