레이스 컨디션(Race Condition)과 세션에 관한 문제
소스보기
<?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>
일단 PHPSESSID를 변경해봐야겠다.
1.
아예 코드를 우회해보고자
123"))exit("hello");//
로 변경해보니 다시 값이 초기화됌
2.
숫자값으로는 재설정이 됌
(다시 로그인 필요)
레이스 컨디션 기법을 이용해, 하나는 '생성' 요청, 하나는 '확인' 요청을 통해 두 요청의 시간을 적절히 구상하여 문제를 풀 수 있을 것 같다.
세션이 같으면 같은 프로세스로 인식되므로(서버에서 하나의 유저로 인식) 두 요청의 세션값을 달리 해줘야한다.
한 계정으로도 세션값 쿠키가 여러개 존재할 수 있다는 걸 알게 됐다. (세션은 ‘연결 상태’니까 어찌보면 당연한.. 다른 곳곳에서 로그인될 때 각자 같은 프로세스를 가지면 안되니까..!)
다만 세션에 대해 주의할 점이 있다.
‘연결 상태’를 뜻한다는게, Session Hijacking이란 무서운 공격이 있듯이, A 계정으로 로그인된 상태의 Session 쿠키값 1 이 있고 B 상태의 계정으로 로그인된 Session 쿠키값 2가 있을 때, B의 Session 쿠키값을 A의 Session 쿠키값인 1로 바꿔주면 A로 바로 로그인되는 Session Hijacking 공격의 위험성을 알고 있어야 함..
이 문제를 풀기 위해 계정은 같고 세션값은 다른 두 개의 연결이 필요하므로 두 브라우저를 사용했다.
1. 크롬 브라우저
크롬 브라우저에서 기존 계정으로 로그인한 뒤, 세션 쿠키값을 임의의 숫자로 만들어준다.
(그리고 새로고침한 뒤 재로그인해주면 세션 쿠키값이 숫자값으로 잘 적용되어 있을 것이다.)
2. 파이어 폭스 브라우저
파이어 폭스 브라우저에서 기존 계정으로 로그인하면, 세션값이 당연히 1과는 다른 임의의 값으로 설정되어 있을 것이다.
이 값 또한 마찬가지로 숫자값으로 변경해준 뒤에 재로그인해주면 세션 쿠키값이 숫자값으로 잘 적용되어 있을 것이다.
참고로 1번 2번의 세션 쿠키값이 다르게 설정되어야만한다..!
그리고 1번에서는 일반 요청, 2번에서는 mode=auth를 적용하여 1번을 새로고침하자마 2번을 새로고침해준다.
'[보안] > [Webhacking.kr]' 카테고리의 다른 글
[Webhacking.kr] 웹케알을 끝내며 (0) | 2020.11.29 |
---|---|
[Webhacking.kr] 61번 (0) | 2020.11.29 |
[Webhacking.kr] 59번 + 멀티 바이트 취약점 정리 (0) | 2020.11.28 |
[Webhacking.kr] 58번 (0) | 2020.11.27 |
[Webhacking.kr] 57번 (0) | 2020.11.26 |