<?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");
}
?>
코드 설명을 해보자면
1. 세션 idx가 echo되고 만약 phpsessid가 숫자가 아니면 access denied를 출력한다.
(is_numeric : 숫자인지 확인함)
2. mode가 auth이면 readme/session[idx].txt와 sessin[idx]가 match되는지 확인한 후 match되면 solve()를 호출한다.
3. readme/sesson[idx].txt 파일에다가 session[idx]를 작성한 후 파일을 닫는다.
4. remote_addr이 127.0.0.1이 아니면 readme/session[idx]파일을 삭제한다.
이 문제를 풀려면 session[idx]와 readme/session[idx]가 매치되어야 하는데
맨 아래의 if문을 보면 remote_addr이 127.0.0.1이 아닐시 파일을 삭제한다.
기본적으로 remote_addr은 127.0.0.1이 아니고 이 값은 변조할수도 없으므로 저 sleep(1)동안에 다른 프로세스로 접속해야 session[idx].txt가 삭제되지 않은 상태에서 확인 할 수 있다.
이렇게 다른 프로세스로 공격하는 방법을 레이스 컨디션 공격이라 한다.
https://isc9511.tistory.com/120
다른 프로세스로 공격하기 위해선 phpsessid 쿠키값도 달라야 한다. 만약 쿠키값이 같으면 같은 프로세스로 인식하기 때문이다.
그래서 phpsessid를 숫자로 바꾸고 각각
https://webhacking.kr/challenge/web-37/
https://webhacking.kr/challenge/web-37/?mode=auth
그냥 페이지를 호출하고 mode=auth 페이지를 1초 이내에 호출하면 풀리게 될 것이다.
이를 위해 크롬 창 두개를 띄우고 했지만 먼저 호출된 페이지의 쿠키값이 그다음 호출한 페이지의 쿠키값에 복사가 되어 들어가 같은 프로세스로 계속 인식했다.
그래서 버추얼 박스를 이용해 하나는 파이어폭스로 하나는 크롬으로 접속하게 되면
풀리게 된다.
'Web Hacking > Webhacking.kr' 카테고리의 다른 글
Webhacking.kr old-04 풀이 (0) | 2024.01.07 |
---|---|
Webhacking.kr old-05 풀이 (0) | 2024.01.06 |
Webhacking.kr old-7 풀이 (0) | 2024.01.05 |
Webhacking.kr old-49 풀이 (0) | 2024.01.04 |
Webhacking.kr old-11 풀이 (0) | 2023.12.31 |