해당 문제는 Race Condition과 관련된 문제이다.
1. !is_numeric($_COOKIE['PHPSESSID'])
: 그냥 로그인을 한 뒤 접근하게 되면 화면에 Access Denied가 뜨게 된다.
이는 위의 is_numeric 함수에 의한 것인데, 쿠키의 PHPSESSID 값이 숫자로만 이루어진 것이 아니라면 Access Denied가 뜬다.
해당 함수를 우회하기 위해 단순히 요청 상의 PHPSESSID 값을 숫자로 변경할 경우 로그인한 세션값이 바뀌게 되어 login_chk() 함수에서 걸리게 된다.
따라서 위의 함수를 우회하기 위해서는 로그인할 때부터 세션값을 숫자로 설정해주어야 한다.
나는 Set-Cookie 헤더를 이용하여 이를 우회하였다.
아래 사진과 같이 로그인 이후 응답 값 헤더에 Set-Cookie를 추가하고 설정할 PHPSESSID 값을 입력해주면 이후부터 해당 세션값을 가지고 통신을 하게 된다.
2. unlink
: 요청을 한 클라이언트가 로컬(127.0.01)이 아닐 경우 생성하는 txt 파일을 1초 후에 삭제하도록 되어있다.
sleep(1);
unlink("./readme/{$_SESSION['idx']}.txt");
}
여기서 중요한 포인트는 sleep(1) 이다.
즉, 로컬이 아닐 경우에도 1초 동안은 해당 txt 파일이 서버에 존재한다는 것이다.
이를 통해 해당 문제가 Race Condition 문제임을 예상할 수 있다.
내가 삽질한 것은 하나의 세션을 가지고 Race Condition을 하려한 점이다.
위키백과에 따르면 race condition이란 "공유 자원에 대해 여러 개의 프로세스가 동시에 접근을 시도할 때 접근의 타이밍이나 순서 등이 결과값에 영향을 줄 수 있는 상태"를 말한다.
여기서 여러 개의 프로세스가 동시에 접근을 해야하는데, 세션 값이 하나일 경우라면 한 txt 파일에 동시에 접근하는 것이 아니라 이전 접근이 끝날 때를 기다렸다가 접근하기 때문에 절대 문제를 풀 수가 없다.
따라서 다른 브라우저에서 로그인 후 동일한 idx를 가지는 세션 값을 하나 더 만들어 준뒤 동시에 접근하도록 하면 문제가 solve 된다.
(참고) https://ko.wikipedia.org/wiki/%EA%B2%BD%EC%9F%81_%EC%83%81%ED%83%9C
'Solve Problem > Webhacking.kr' 카테고리의 다른 글
webhacking.kr old-57 writeup (0) | 2020.04.13 |
---|---|
webhacking.kr old-59 writeup (0) | 2020.04.13 |
[Webhacking.kr] old-47 (0) | 2020.04.10 |
[webhacking.kr] old-09 Writeup (0) | 2020.04.01 |
4번 문제 (0) | 2020.04.01 |