Access Denied가 뜬다.
소스코드
<?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");
}
?>
idx라는 세션이 있고 숫자로 된 값이 아니면 Access Denied가 뜬다.
mode값이 auth면 파일을 읽어들이는데 이 값이 idx와 일치하면 문제를 해결할 수 있다.
client가 127.0.0.1이 아니면 sleep(1); 함수 실행 후 파일이 지워진다.
이 문제는 Race Condition을 이용한 문제이다.
레이스 컨디션은 공유 자원에 대해 여러 개의 프로세스가 동시에 접근하기 위해 경쟁하는 상태다.
프로세스들이 경쟁하는 것을 이용해 관리자 권한을 얻는다.
sleep함수로 1초 쉬는 것을 이용해 1초 안에 공격을 실행해야 한다.
이 공격을 위해 크롬과 웨일 두 가지 브라우저를 이용했다.
먼저 쿠키값을 숫자로 바꾸면 쿠키값이 바뀌었기 때문에 다시 로그인하라고 한다.
다시 로그인 한 뒤 접속해보면 쿠키값이 숫자기 때문에 Access Denied가 사라진 것을 볼 수 있다.
여기서 ?mode=auth를 입력하면 다음과 같이 Auth~가 뜨는 것을 볼 수 있다.
다른 브라우저도 쿠키값을 바꾸는데 숫자가 겹치지 않게 바꿔야 한다. 다른 프로세스로 인식시켜야 되기 때문이다.
아까 브라우저를 새로고침한뒤 이 브라우저에서 ?mode=auth로 1초 안에 접속하면 문제가 풀린다.
브라우저 모두 ?mode=auth를 입력해 아래와 같은 상태로 만들어서 풀었다.
그 다음 크롬 새로고침 -> 웨일 새로고침을 1초 안에 누르면 나중에 새로고침을 누른 쪽에서 문제가 풀릴 것이다.
'Web Hacking > Webhacking.kr' 카테고리의 다른 글
[Webhacking.kr] old-07 (Challenge 7) (0) | 2021.11.21 |
---|---|
[Webhacking.kr] old-11 / Challenge 11 (0) | 2021.11.07 |
[Webhacking.kr] old-53 / Challenge 53 (0) | 2021.11.07 |
[Webhacking.kr] old-38 / Challenge 38 (0) | 2021.10.10 |
[Webhakcing.kr] old-32 / Challenge 32 (0) | 2021.10.10 |