본문 바로가기

SWUFORCE 워게임👊🏻

[Webhacking] old - 25

 

1. 접속화면이다.

주소 끝을 보면 /?file=hello -> hello world 인 것 같아서

다른 파일로 바꾸어 입력해보았다.

2. file=flag -> FLAG is in the code / file=index -> X

 

3. 소스코드를 보려고 index.php?source 를 입력해봤는데 file=hello로 로드된다.

이는 사용자가 입력한 값을 그대로 include에 넣고 있다는 것이다.

따라서 LFI(서버에 있는 "로컬 파일"을 사용자가 지정해서 불러오게 만드는 취약점)로 접근해야 함을 알 수 있다.

 

4. PHP는 stream wrapper를 허용한다. 따라서 php://filter가 사용 가능하다. 

또한 include는 "파일"이 아니라 "스트림"도 처리하기에 wrapper 우회가 가능하다.

 

정리를 해보자면

 

해당 웹페이지는 index.php에서 사용자가 전달한 file 파라미터 값을 그대로 include()에 넣는 구조로 되어 있다.

이 때문에 공격자는 서버 내부 파일을 마음대로 불러올 수 있는 LFI(Local File Inclusion) 취약점을 활용할 수 있다.

하지만 flag.php나 flag 파일을 그냥 불러오면 문제가 생긴다. PHP의 include()는 파일을 “읽는 것”이 아니라 “실행”하기 때문이다. 그래서 파일 안에 echo가 없거나, FLAG가 변수에만 저장되어 있으면 화면에는 아무것도 출력되지 않는다. 즉, 파일은 실행되지만  원하는 정보는 보이지 않는 상태가 된다.

 

이 문제를 해결하기 위해 php://filter를 사용하는데, php://filter는 PHP의 스트림 래퍼로, 파일을 실행하지 않고 특정 방식으로 가공해서 읽을 수 있게 해준다. 여기서는 convert.base64-encode 필터를 사용했기 때문에, 서버는 flag 파일의 내용을 그대로 읽은 뒤 그것을 base64로 인코딩해서 출력한다. 이 과정에서는 PHP 코드가 실행되지 않기 때문에, 원래 파일에 들어 있는 코드 전체를 안전하게 문자열 형태로 확인할 수 있다.

 

5. base64로 디코딩하면 flag를 확인할 수 있다.

 

해결 완!! 👊🏻