본문 바로가기

보안지식

LFI,RFI 정리

음.. FILE 업로드의 상위 공격이라고 보시면 돼요

 

-LFI(Local File Inclusion) ?

 

저희가 웹 사이트를 만들 때 가끔 include을 쓰는 경우가 있습니다.

중복되는 함수 코드를 따로 만들고 include 이용해서  포함시키는 경우가 많잖아요.

 

이 include 성질을 이용하는 겁니다. include는 단순히 코드에 포함시킨다 보단

실행시킨다라고 생각하시면 됩니다.

 

만약 웹 사이트 측에서 include을 하는데 페이지 경로가 적절히 필터링이 되어 있지 않으면

디렉터리 변경 명령어 입력을 허용하게 되어서 문제점이 발생하게 됩니다.

 

 

간단하게 실습을 해볼게요

 

 

봐보실게요

 

페이지는 이러하고요 버프 스위트 통해 봐 보시면

 

GET 방식 보이시나요?

 

page에 file1.php을 가져오는 겁니다. 여기서 include을 이용해서 php문을 포함한 거죠.

 

그럼 저희는 이 file1.php 말고 ../../../../../../etc/passwd 가져오라고 해보겠습니다.

 

짜잔

 

이렇게../은 상위 폴더로 가라는 명령어입니다.

계속 상위 폴더로 가서 최상위에 etc/passwd 파일을 가져올 수 있죠.

 

-이걸 통해 php이 담긴 소스 코드를 가져올 수 있겠네요!

할 수 있어요. 그런데 include은 php문을 실행하다 보니 웹 사이트가 나오기만 하지

php문 코드는 안 보여줍니다.

 

파일 실행하는 개념이라 php이 안 보여요

 

그래서 파일 업로드를 이용하겠습니다.

 

대충 아무 이미지 파일을 올리고 intercept로 막아서 yoya 빼고 나머지 지운 뒤 코드 작성하겠습니다.

 

바꾸기 전

 

이렇게 바꾸고 올리겠습니다.

 

get 방식으로 명령어를 넣을 수 있는 코드입니다.

 

그러고 나면

 

원래는 저렇게 파일 위치 안 보여줘요

 

저 파일 위치 복사 하고 방금 include 한 페이지에 실행해보겠습니다.

&로 cmd=ls 까지 붙여서 실행하겠습니다.

 

 

이렇게 파일 내용이 보이죠?

 

그럼 코드 보기 위해 cat문을 섞어서 해보겠습니다.

 

 

이렇게

 

이렇게 php문 까지 있는 소스코드를 볼 수 있습니다.

 

 

이게 LFI의 대표적인 공격입니다. 이미지 업로드 취약점이 바로 이 공격을 뜻합니다!

이론적으로 이미지 실행하는 공격은 없습니다.

 

 

 

또 LFI 공격을 이용해서 파일을 업로드 안 해도 공격할 수 있습니다.

이미지 파일도 올릴 필요 없습니다. include가 파일을 실행하는 거잖아요?

 

그러니 서버의 error.log 또는 access.log 이용해 서버에 무슨 일이 벌어졌는지 적어두는 log을 보는 겁니다.

 

이 서버에 링크 다 지우고 명령어를 간단하게 적어보겠습니다.

 

이렇게 적고 보내면?

 

서버 log 기록에 저 명령어가 실행 됐다는 글이 작성되겠죠. 당연히 저 링크는 없으니 400 에러코드가 나고요

 

그리고 난 뒤에 저희가 이 서버의 log의 위치 찾아서 확인해보겠습니다.

 

../../../../../../../var/log/apache2/access_log&cmd=ls

 

이렇게 하면 나와야 합니다.

 

지금 제 서버가 맛 가서.. 일단 대체 사진으로 해드릴게요

 

이렇게 나옵니다.

 

그러니깐 log에 저 한 줄 웹 쉘 코드가 작성이 되고 이제 그 로그 파일을 불러오면서 get 방식으로 cmd 명령을 내리면

그 웹 쉘 코드 덕분에 실행하게 됩니다

 

access_log 파일은 각각 운영체제 또는 서버마다 기본 위치가 다릅니다. 그런 건 검색하면 찾을 수 있고요

아니면 정보 누출로 알아내는 방법 있습니다!

 

 

 

다음으로 RFI 설명드릴게요

이 공격은 진짜 간단해요

 

만약 페이지 내에 include로 다른 사이트를 가져로는 경우가 있습니다.

그럼 그 include 할 때 그 사이트 말고 제 서버에 있는 악성 코드 또는 웹 쉘 코드를 실행시키면 되겠죠!

 

만약 이렇게 사이트 가져오면

 

이렇게 제 서버에 있는 파일 실행 시키면 됩니다

 

이게 바로 RFL(Remote File Inclusion) 공격입니다.

 

 

 

* 대응 방법

 

파일 업로드랑 같아요! 파일을 DB로 저장을 하게 합니다.

 

또는 include 받을 때 필터링을 하거나 강제적으로 idx=2처럼 값을 붙여서 본래 값에서 벗어나지 못하게 합니다.

 

가장 좋은 것은 파일을 DB에 저장을 하는 게 좋습니다.

힘들면 NFS 즉 파일 전용 서버를 만드는 것이 좋습니다