본문 바로가기
해킹 공부/웹해킹

레이스 컨디션 (race condition) 공격이란?

by zzzmilky 2021. 1. 27.

 

60번 문제. 300점.

 

이젠 webhacking.kr에서 300점 문제도 엄청 어렵진 않다~최근에 푼 문제중에 가장 빨리 풀었다ㅋㅋ이번 문제는 버프 슈트로 레이스 컨디션 공격을 해서 풀었다! 일단 view-source를 클릭해보자.

 

 

 

 

 

view-source

 

앞에 나와있는 페이지에는 Your idx is 33434라는 문구와 함께, Access Denied가 적힌걸로 보아 is_numeric($_COOKIE['PHPSESSID']) 함수를 만족하지 못해서 그런 것 같다. PHPSESSID 쿠키 값에 숫자가 아닌게 포함되어 있어서 그렇단 말인데, EditThisCookie를 열어 직접 쿠키 값을 확인해보니, 알파벳도 섞여 있었다. 그래서 임의의 숫자로만 이루어진 쿠키값으로 바꿔주고, 새로고침후 다시 로그인을 해보았다. 

 

 

 

 

 

 

is_numeric 함수의 값이 true가 되도록 쿠키값 바꿈

 

 

 

 

버프슈트로 옮겨 작업해 보았다. 

 

 

 

버프 슈트로 request

 

 

 

Cookie 부분에 PHPSESSID를 위에 내가 입력해준 쿠키값으로 바꿔준다.

 

위에 대한response

 

response를 확인해보면, Access Denied라는 문구는 없어졌음을 확인가능하다. 그렇다면, $p 부분부터의 코드..readme/{$_SESSION['idx']}.text라는 파일을 만들고, 열어서 해당 파일에 write 하는 등의 작업까지 마쳤을 것이다.

 

 

 

 

그래서 한번 /mode=auth 로 들어가보았다.

 

request

 

그랬더니 다음과 같은 response가 왔다.

 

위에 대한 response

 

 

 

 

 

 

 

원래 제대로 write 되었더라면, Done! 과 함께 문제가 solve 되어야 하는데, 그 작업이 제대로 되지 않은 것 같다. 그래서 다시 코드를 읽어보니, 밑에 다음과 같은 조건문이 있었다.

 

 

접속 ip가 127.0.0.1이 아니면 생성한 파일이 삭제된다는 내용이다. 1초 후에 삭제된다는 뜻인데, 그 사이에 아마 auth 권한으로 접속해야 문제가 solve 될 것이다.

 

 

 

 

따라서 창을 하나 더 켜 새로 로그인을 하고, 숫자로만 이루어진 다른 쿠키값을 지정해주었다.

 

다른 쿠키 값 지정

 

 

 

 

 

 

 

그러고선, Repeater 기능으로 한 탭에는 이전 쿠키값 지정해준대로 request 날려주었다. response는 이전과 동일. 파일을 만들고 파일에 write했을 것이다.

 

 

 

 

 

 

 

 

삭제 되기 이전, 1초만에 문제를 풀기 위해 대기 해놓은 Repeater 두번째 탭에 두번째 쿠키값을 지정해주고 request를 ?mode=auth에 날려주었다. 

 

request

 

 

 

response

 

문제가 풀렸다는 response와 함께 문제 solve~

 

문제를 풀고 다른 풀이들을 살펴보다가, 이 문제가 "race condition" 공격과 조금은 연관이 있는 문제라는 것을 알게 되었다.

 

 

 


Race condition이란?

"한정된 자원을 동시에 이용하려는 여러 프로세스가 자원의 이용을 위해 경쟁을 벌이는 현상"

프로세스 혹은 스레드간 자원 관리 실수로 인해 발생하는 사애다.

서로 다른 스레드에서 뮤텍스가 걸려있지 않아 공유 메모리에 접근하는 경우 프로그램의 가정을 파괴할 수 있다.

단일 스레드에서는 취약점이 발생하지 않더라도 두개 이상의 스레드가 자원을 동시에 참조할 수 있다면 취약점이 발생할 수 있는 것이다.

 

아 그리고, 나는 문제를 풀면서 직관적으로 쿠키값을 다르게 설정해야한다고 생각해서 했는데, 이게 정확한 이유는 같은 쿠키값을 이용해 프로그램을 동시에 실행한다면 서버에서 하나의 유저로 인식해 첫번째 프로세스의 request에 대한 response를 두번째 프로세스가 받아버리는 경우가 생기기 때문에 이를 막기 위해 서로 다른 쿠키값 2개를 사용해야한다고 한다.

댓글