hacking study/File Upload

정보보안 스터디 - 10주차 1일 - 파일 include, 파일 다운로드 취약점

wonder12 2022. 12. 16. 02:48

File Include 취약점 - 파일 업로드 취약점

 

.png 등 파일확장자를 써도 웹쉘 실행이 된다는 말을 들어 본 적이 있다면

정확히는 정상적인 방법으로는 실행은 안되지만 

include 취약점이 있다면 파일확장자가 어떤 것이 와도 업로드 후 실행이가 가능합니다.

 

LFI(Local File Include)

RFI 굳이 안쓰고 LFI를 씁니다.

 

includr는 하나의 수정사항이 생겼을 때 모든 사이트에 적용시키기 위해 나머지는 고정을하고 편하게 수정한 내용을 include 하여 적용시킵니다.

파일업로드 취약점은 서버에 임의의 파일을 업로드 시키는 공격입니다.

 

공격 과정

1. 일단 그림 파일을 업로드 해봅니다.

2. 경로는 어디에, 어떻게 저장되는지 확인합니다. wonder_1.jpg 또는 날짜로 저장되는 방식도 잇습니다.

3. burp suite의 intercept기능을 이용해 php 웹쉘을 등록해봅니다.

4. 되지 않는다면 파일 확장자만 jsp로 바꿔서 웹쉘 php코드를 등록해봅니다.

5. 등록이되고 파일이 업로드된 경로로 가서 실행해보면 php파일이 아니라면 php파일을 실행해주지 않기 때문에 코드는 실행이 안되는 것을 볼 수 있습니다.

6. 그러면 lang이 변수인 인삿말 페이지에서 include 취약점을 찾습니다.

?lang=ko.php 형식으로 php를 실행시켜 불러오는 것을 볼 수 있습니다. 

보통 이렇게 언어 변수에서 많이 include 취약점이 발견됩니다.

나머지는 고정하고 ko.php요소만 include한다는 것인데, 여기에 웹쉘 php를 불러와야합니다.

7. ../../ 상위디렉토리로 가서 파일 업로드 한곳에 cmd.jpg를 불러옵니다. 

?lang=/../../../cmd.jpg 실행이 되고 &cmd=ls 까지 붙여줘 명령어를 실행합니다.

서버가 php코드를 읽고 실행하는 것을 볼 수 있습니다.

WAS서버가 include를 하면서 php를 실행시켜 WAS에게 응답을 받아온것이기 때문입니다.

 

ls -al
find / -name flag*
또는 find / -name flag.txt
cat ~/flag.txt

로 중요 계정 정보를 확인합니다.

 

 

php를 실행시키는 것은 단점이자 장점이 될 수 있는데

파일다운로드에 비해 단점은 php소스코드를 확인하지 못하고 실행시켜버린다는 것이고

장점은 그렇기 때문에 오히려 임의의 코드를 실행을 시킬 수 있다는 점입니다.

 

 

파일 다운로드 취약점

여기서 파일다운로드 취약점이란 서버에 있는 임의의 파일을 다운로드하는 공격이며 파일 업로드의 반대입니다. 

 

파일 다운로드는 원하는 파일을 다운로드 받을 수 있기 때문에 계정 정보는 물론, 가장 위협적인 것은 소스코드를 가져오면 됩니다. 이유는

1. DB 계정 정보와 연결되어있기 때문이고
2. 그리고 주석을 보고 관련 설정의 설명을 확인할 수 있어서 어떻게 개발되었는지 확인할 수 있고 2차 취약점을 유발하기 수월합니다.

하지만 루트권한으로 서버를 모두 장악한 것은 아닙니다.

 

 

 

공격 과정

1. 그림을 업로드 시켜봅니다.
2. 그림의 어떻게 어디에 업로드되는지 확인하고 (링크 주소 복사나, intercept) 경로를 확인합니다.
http://normaltic.com:3184/download_1/download.php?filePath=/%EC%9D%B4%EC%A7%84%ED%98%95/2.jpg
다운로드를 직접 해서 다운로드도 응답을 burp suite에서 볼 수 있습니다.

3. 상위디렉토리로 가서 /etc/passwd를 실행시킵니다. 디렉토리가 아닌 txt파일이기 때문에 확인이 가능합니다.

(/../../../ 무조건 앞에 /붙여야 합니다.)

4. 소스코드를 탈취할 생각을 합니다.

download.php 등 현재 페이지의 소스코드 확인이 가능하고,

DB관련 계정 정보를 봐야하기 때문에 글 등록 또는 글 읽기의 MYSQL 정보를 확인합니다. (include될 경우 그 파일로 찾아가 확인합니다.)

> notice_read.php

 

계정아이디, 비밀번호, 현재 데이터베이스를 확인했으면

MYSQL의 기본 포트인 3306으로 들어가 로그인 후 DB정보를 탈취합니다.