Webhacking.kr
Prob60
60번 문제입니다. 들어가자마자 Access Denied를 뱉어내면서 우릴 밀어냅니다.
소스를 한번 확인해보도록 하죠.
PHPSESSID 값에 숫자가 들어있을 때 해당 문구를 뱉으면서 종료시키는 소스였네요.
그리고 아래 부분을 보면 세션id의 이름으로 파일을 하나 생성하는데, 내용 역시 세션id입니다.
그런데 접속하는 주소가 127.0.0.1일 경우 1초간 슬립 후 해당 파일을 삭제시킵니다.
중요한 점은 가운데 if문인데, mode 변수가 auth로 들어올 경우 해당 파일을 읽어 이름과 내용의 일치 여부 파악 후 일치할 경우 클리어 되는 부분입니다.
하지만 파일은 만들어지고 1초 뒤에 삭제가 되기 때문에 그 사이에 파일을 읽어줄 필요가 있습니다.
이 때 알아야 되는 개념이 레이스 컨디션입니다.
레이스 컨디션이란 말 그대로 경주, 경쟁자 상태를 말합니다. 서로 경쟁하는 사람들처럼 2개 이상의 프로그램이 동시에 돌아가며 서로 영향을 끼치는 상태를 의미합니다.
웹 해킹에서의 레이스 컨디션 뿐만 아니라 시스템 해킹에서도 사용되는 개념입니다.
그럼 차례대로 문제를 해결해보도록 하겠습니다.
크롬의 확장프로그램인 EditThisCookie를 이용하여 PHPSESSID를 변조시키겠습니다. 현재 PHPSESSID의 값에는 숫자가 포함되어있기 때문에 이를 없애줘야합니다.
숫자만 제거하고 영문은 그대로 놔두고 적용시키겠습니다.
세션에 해당하는 쿠키 값을 변조했기 때문에 이 바꾼 쿠키 값을 서버에 다시 저장해줄 필요가 있습니다. 다시 로그인 해 줍시다.
숫자를 제거한 세션ID로 로그인 되었습니다. Access Denied 메시지가 뜨지 않고 정상적으로 웹페이지에 접속 된 것을 확인 할 수 있습니다.
문제를 해결하기 위해 mode 변수를 auth로 GET요청을 통해 날려줍시다. 하지만 앞서 말했듯이, 1초 뒤에 파일은 삭제되기 때문에 레이스컨디션을 이용해 동시에 접속할 필요가 있습니다. 이를 위해 시크릿모드로 새 세션을 열어주었습니다.
새 세션에서도 위와 동일하게 쿠키 값을 바꾼 후 로그인 해줍니다. 그 후 두 윈도우에서 연속으로 refresh를 해주면 생성되는 파일을 read하면서 문제가 클리어됩니다.
이번 문제는 레이스컨디션에 대한 사전지식이 없을 경우 풀이하기 어려움이 있었던 문제입니다.
레이스컨디션에 대한 상세한 정보는 구글링을 통해 알아보시면 될 것 같습니다.