web_security/web info

파일 업로드(File-Upload) 취약점이란?

HawordFREAKEK 2019. 9. 21. 22:40

네 안녕하세요. Godhaword 입니다.

오늘 다뤄볼 주제는 파일 업로드 취약점입니다. 조사 및 정리를 하다보니 RFI, LFI랑 비슷했는데요. 개인적인 느낌이라면 LFI, RFI는 집을 털때 굴뚝으로 들어가는 느낌이고, 파일업로드 취약점은 문 뿌수고 들어가는 느낌이 옵니다.

목차는

1. 파일 업로드 취약점이란?

2. 파일 업로드 취약점이 생기는 이유

3. 파일 업로드 취약점을 공격하는 방법

4. 문제 예제

5. 파일 업로드 취약점을 예방하는 방법


이렇게 나가겠습니다. 문제는 3가지 문제를 예로 들텐데.. 마지막 한 문제 때문에 오래 걸렸습니다..



1. 파일 업로드 취약점이란?

파일 업로드 기능을 사용하여 공격자가 원하는 웹 쉘을 해당서버에 올려 저희가 원하는 행동을 취할 수 있게하는 취약점입니다.(또 습관적으로 인젝션이라 할 뻔..)



2. 파일 업로드 취약점이 생기는 이유

일단 게시판에 확장자가 .php나 .jsp, .asp 등의 확장자를 가진 파일을 업로드 하는 것을 서버에서 막지 않으면 파일 업로드 취약점이 발생하여 공격자가 원하는 공격을 할 수 있게 해줍니다. 서버에서 위와 같은 확장자를 막아놨다해도 공격자가 우회기법을 사용하여 파일을 올릴 수만 있으면 공격은 성공합니다.



3. 파일 업로드 취약점을 공격하는 방법

일단 공격할 php 파일을 만듭니다.
Q : 어.. 저 php 파일 만드는 법 모르는데요...
A :

1. txt 파일에 자기가 만들고 싶은 php문을 적는다.

( php함수나 간단한 페이로드는 인터넷에 많으니 참고)

2. 그 파일의 확장자를 php로 바꾼다


위에 나온 txt파일의 내용은 cmd 변수를 이용하여 제가 원하는 공격을 하는 코드문입니다. 조금만 검색하셔도 나오니... 여기선 모자이크 해두겠습니다.


이렇게  php파일을 만들었으면, 공격하고자 하는 서버에 올려봅니다.

필터링이 된다면 공격자가 아는 한 최대한 우회를 해보고 만약 파일이 올라갔다면 거기부턴, RFI와 공격방법이 매우 유사합니다.

문제로 바로 설명드리겠습니다.



4. 문제 예제

1.File upload - MIME type

일단 문제이름은 File upload - MIME type 입니다.

들어가자 upload 탭을 누르고 싶은 욕구가 강하게 듭니다.

 mime type이 인터넷 표준 포맷이라고 하더라고요. 확장자명 비슷한 역할을 해주는 것 같습니다.

삽을 많이 퍼서 위에 5개 파일이 있는데 원래 처음들어가면 하나도 없이 그냥 upload your file만 뜹니다.

드래그 해놓은 것과 같이 php파일을 올리면 content-type 쪽에 application/octet-stream 이 뜨고, 

그나마 사진 파일을 올리면 image/gif나 image/jpeg 가 뜹니다.

그러니 php파일을 사진파일처럼 속이기 위해 image/gif 로 바꿔봅니다


잘 업로드 되었습니다.

업로드 된 후에, 제가 삽입한 php파일이 cmd 값에 따라 파일이 실행되는 것이니 변수값으로 cmd를 주고 간단하게 whoami를 입력해 보았습니다.

잘 입력되네요.



마지막으로 문제가 passwd 쪽으로 접근하는게 문제이기 때문에 cat함수를 사용하여 passwd로 접근하면 이렇게 flag가 나옵니다.


2. File upload - Double extensions


1번 문제와 아주 유사합니다. 음... 바로 upload 들어가봅시다.

1번을 풀고나서 2번을 푸는거라 업로드 파일로 삽푸는 일이 적었습니다. 2test 파일 하나만 올라와있네요. 원래 들어가면 Upload your photo만 뜹니다.


upload 창에 들어가서 파일을 올리면 저렇게 2test.php 라고 파일 명이 뜹니다. 1번 풀었던 것 처럼 image/gif로 바꾸면 에러가 뜨기에 다른 우회 방법이 필요하다 생각했습니다. 문제 이름이 double extensions 니까 확장자를 두개 넣어보도록 하겠습니다.

원래 이렇게 넣으면 안될 줄 알았습니다. 다른 자료 보면 %00쓰고 뒤에 jpg 를 써야한다 라고 적혀있어서.. 근데 이 문제는 그냥 .jpg 적어도 되더라고요.. 호오...

업로드가 잘 된 모습입니다. 만약 업로드만 잘되고 원하는 행동이 안될 시에는 %00 주고 뒤에 .jpg를 해보려 했습니다.

그리고 파일이 잘 업로드 되었다면 또 제가 올린 php파일이 잘 작동하나 확인해볼 시간입니다.

간단하게 whoami를 쳐보니 서버 이름이 뜹니다.

그리고 이게 좋은 방법인진 모르겠는데 저는 ls -a를 치고, 필요해보이는 파일이 뜰 때까지 ls -a../../반복).. 이렇게 쳐서 디렉토리를 찾아냅니다.

어.. 짱해커라면 다른 좋은 방법이 있겠죠..?

평소에는 그냥 ../ 네 번 치고 etc/passwd 쳐봅니다.

따란~

이 문제 또한 passwd를 찾는 문제이기 때문에 해당 디렉토리로 이동했습니다.


3. hackctf 가위바위보

갑자기 안풀려서.. 추후에 풀리면 적도록 하겠습니다..
왜 집에서만 안되지;; 인터넷 설정 때문인가..

일단 문제에 들어오시면 이렇게 가위바위보 게임과 개인 설정을 바꿀 수 있는 설정 탭이 있습니다.

flag 따는 방법이 가위바위보 게임에서 몇 회 이기면 flag 나오는 줄알고... 몇 일 삽 푸었던 기억이 있습니다.

추후에 파일 업로드 취약점이 있는 것을 알고 업로드 공격을 할 생각을 했습니다.

지금와서 확인해보니 .php.jpg나 mime type을 바꾸는 것으로는 문제가 풀리지 않습니다. 그래서 사진 뒤에 RCE문을 넣어보기로 했습니다.

제가 사용했던 rce문 궁금하셨던 분은 옆에 hex코드 해석하셔서 사용하시면 됩니다.

이처럼 이미지 hex 맨뒤에 rce문을 입력하여 악성 이미지 파일을 만들어 보았습니다.

어... 잘 들어간건가.. 잘 모르겠습니다. 주소 뒤에 cmd= ~~ 을 입력하여 잘 들어갔나 확인해봅시다.

ㅎㅎ

다른 사람이 넣었던 파일도 다 열람이 가능합니다.(와.. 정직하게 이미지 파일 넣은사람 몇명 안되네;;)

cmd 변수로 공격이 잘 되는 것을 확인했으니 cat flag.txt로 필요한 flag를 가져옵니다.

사실 flag.txt가 있는지를 ls를 통해서 몰랐는데, hackctf 에서 flag.txt에 flag많이 숨겨두길래.. 언인텐디드 약간 섞어서 푼 문제입니다.







5. 파일업로드 취약점 예방방법

일단 당연히 php 파일의 업로드를 막아야합니다. 하지만 그냥 업로드만 막으면 여러가지 우회 방법이 있기에 몇 가지 예방방법이 더 필요합니다.

업로드되는 파일의 저장경로를 외부에서 직접 접근이 안되게 하거나, 저장시에 파일명 확장자명을 바꾸거나 업로드 파일의 스크립트 실행 권한을 제거 하는 방법이 있습니다. 업로드 파일의 스크립트 실행 권한을 제거하면 그냥 텍스트 형식으로 읽힌다고 합니다. 또한 파일 이름을 난수화 하여 저장하는 방법도 있습니다.










'web_security > web info' 카테고리의 다른 글

[WebHacking] XSS (Cross Site Scripting) 란?(New)  (2) 2022.05.29
XSS (Cross Site Scripting) 란?  (0) 2019.09.27
RFI(Remote File Inclusion) 란?  (0) 2019.09.14
LFI(Local File Inclusion)란?  (3) 2019.09.13
SSTI란?  (0) 2019.09.04