index.php 에서 LFI 취약점이 발생해서 index.php의 코드를 가져와본다.
81~83번째 줄에서 LFI 취약점이 발생하고 .php가 붙어서 php 파일 말고는 실행할 수 없다.
위 코드가 index.php의 핵심이 되는 코드인데 debug_mode라는게 존재해서 이를 통해 변수들을 출력할 수 있다.
이외에도 주석으로 phpinfo.php라는 페이지가 있는데 phpinfo() 함수를 통해 웹서버의 서버 설정들을 보여준다.
설정중에 파일 업로드 기능이 활성화 되어있어 php 페이지로 파일을 던지면 http 통신이 끊어지기 전까지
/tmp 디렉토리에 php[A-Za-z0-9]{6}의 형식으로 난수파일명으로 변환되어 일시적으로 파일이 저장된다.
(실제로 테스트 해본결과 http 통신이 끊어져도 바로 삭제되지는 않는다.)
아무튼 좋다. 일단 서버에 파일업로드를 하는것 까지는 했는데 문제는 서버에 올라간 코드를 어떻게 실행할것이냐?
문제는 파일명이 난수화 되어 업로드 되서 확장자가 날라간다는 점이다.
이를 해결할 수 있는 방법은 zip wrapper를 통해 압축 파일을 서버에 올려 실행하는 방법이다.
zip wrapper는 압축파일 속에 있는 파일을 띄워주는 역할을 하는데
LFI 취약점이 존재하므로 zip안에 php 코드가 있다면 LFI 취약점을 통해 내가 올린 파일을 실행할 수 있다.
위 코드를 압축해서 zip 파일로 만든다.
이렇게 만든 파일을 index.php?page=index&debug_mode=31337로 던지면 debug_mode 덕분에
내가 던진 파일이 /tmp 디렉토리에 어떠한 난수값으로 업로드 되었는지 알 수 있고 include 하는 페이지가
index.php이기 때문에 무한루프에 빠져 http 통신이 안끊어지도록 하여 레이스컨디션 공격이 가능하다.
이러한 방식으로 무한루프에 빠져 변수정보가 계속 출력이 되고 여기서 /tmp/php5HKDtk라는 파일명을 뽑을수있다.
index.php?page=zip:///tmp/php5HKDtk%23a 로 접속을 시도하면 실질적으로
index.php?page=zip:///tmp/php5HKDtk#a.php 로 접속하는 꼴이 되어 /tmp/php5HKDtk 파일의 압축을 해제하여
그 안에 있는 a.php를 include 한다 라는 뜻이 된다.
이러한 방식으로 remote code execution을 성공했고 마찬가지 방식으로 flag를 출력할 수 있다.
'문제 > CTF' 카테고리의 다른 글
CODEGATE 2017 Prequals RamG-thunder (0) | 2017.02.15 |
---|