[ 파일 업로드 공격이란? ]
파일이 업로드 되는 페이지(게시판, SNS 등)에 주로 웹쉘과 같은 악성파일을 업로드하는 것
- 웹쉘 : 웹을 통해 시스템 명령어를 실행할 수 있는 웹 페이지
이미지를 업로드하는 페이지가 있다. 해커는 이때 이미지 파일 대신 웹쉘을 업로드 한다. 이를 막기 위해서 웹 어플리케이션은 업로드 된 파일이 이미지 파일인지 검사해야하는데 제대로 하지 않으면 그대로 저장하게 된다. 다음으로 해커가 웹쉘에 접근하게 되면 웹쉘이 실행된다. 그 이후 웹쉘을 통해 해커가 원하는 대로 시스템 명령을 실행할 수 있다.
실습하려고 리눅스 켰는데 네트워크가 또 말썽이라 firefox 작동이 아예 안되서 이번 실습은 인터넷과 강사님의 실습 화면으로 대체하고자 한다.... 도대체 리눅스는 언제쯤 정상적으로 될지.....
[ 파일 업로드 공격 실습 ]
로우 단계)
보안 단계를 low로 변경한 후 File Upload 에 들어간다. 이미지 파일을 업로드하는 곳에 웹쉘 파일을 업로드 할 것이다.
강사님이 올려주신 깃허브 링크에 있는 webshell.php 파일을 열고 RAW 버튼을 누른 후, 링크를 복사하고 터미널의 root 디렉토리 밑에 wget 명령어를 사용하여 다운로드 한다.
다운로드 한 후 gedit로 webshell.php 의 내용을 살펴보자
이 프로그램은 정말 간단한 프로그램으로 초반부에는 command (명령어)를 입력하라는 내용과 사용자 입력을 받기 위한 폼을 표시하는 html을 출력한다. 뒷부분은 cmd 파라미터의 값이 설정되어 있으면 이를 system 함수로 실행해주는 내용임을 확인할 수 있다.
폼에 내용을 입력하면 cmd 파라미터에 설정이 된다. 따라서 사용자가 입력한 것을 시스템 명령으로 실행하게 된다.
dvwa로 돌아와서 다운로드 한 웹쉘을 업로드 해준다.
위 이미지와 같이 업로드가 성공적으로 된 것을 확인할 수 있었다. 이미지의 빨간색 글씨를 보면 ../../ 와 같은 부분이 있는데 이는 ../가 두번 있으므로 상위 디렉토리로 두번 이동했음을 나타낸다.
http://localhost/dvwa/vulnerabilities/upload/# ▶ http://localhost/dvwa/hackable/uploads/webshell.php |
따라서 다음과 같이 주소창을 수정해주고 이동하면 간단한 페이지가 하나 나온다.
이 페이지에는 command 입력창이 있고 이 입력창을 통해 시스템 명령어를 실행할 수 있다.
command 입력창에 cat /etc/passwd 를 입력하니 오른쪽 사진과 같이 시스템 명령어가 실행되는 것을 확인할 수 있다.
이처럼 시스템 명령어를 실행할 수 있는 페이지를 웹쉘이라고 한다.
미디엄 단계)
보안 단계를 미디엄 단계로 변경한 후, 로우 단계에서 했던 방법과 동일하게 php 파일을 업로드 하였더니 jpeg나 png 파일만 업로드 할 수 있다는 문구와 함께 업로드에 실패한 화면을 볼 수 있었다.
버프스위트의 Proxy 탭의 Intercept 부분에서 Intercept on 으로 변경하고 다시 파일 업로드를 진행 해보자.
업로드 요청이 인터셉트되어 왼쪽 화면과 같이 나온것을 확인할 수 있다. 이때 Content-Type을 확인해보면 application/x-php 라고 설정되어있다. php 파일을 업로드 했기 때문에 ~php로 작성되었지만 이 부분을 이미지 파일로 조작해보자
Content-Type에 적혀있던 application/x-php 대신 image/jpeg 로 변경 후 버프스위트의 Forward를 클릭하면 왼쪽 화면과 같이 파일 업로드에 성공한 것을 확인할 수 있다.
따라서 content 타입의 검사만으로 해킹에 성공할 수 있음을 알 수 있다.
하이 단계)
우선 보안 단계를 high로 변경한 후 소스코드를 살펴보자.
high 단계에서는 클라이언트에서 자동으로 설정되는 업로드 타입을 보는 것이 아닌 실제 파일명의 확장자가 jpg, jpeg, png인지를 검사하고 있다. 또한, getimagesize 함수를 통해 실제로 파일의 내용이 이미지인지 검사하고 있다.
미디엄 단계보다 강화되었지만, 우회하여 공격할 수 있는 방안이 있다.
버프스위트를 열어 미디엄 단계에서 했던것과 같이 다시 파일 업로드를 해주고 인터셉트를 켜보자.
이번에는 Content-Type을 변경해주는 것이 아닌 Content-Disposition의 filename 부분을 webshell.php.jpg 로 수정해준다. 그리고 getimagesize 함수를 우회하기 위해 파일 내용 부분에 GIF89a 라고 입력해준다.
GIF89a는 GIF 이미지 파일 표준에 정의된 값이다. 따라서 이것을 파일 내용 앞에 입력하게 되면, 이미지 파일인 것처럼 속일 수 있다.
변경 후 Forward를 클릭하면 파일 업로드에 성공한 것을 확인할 수 있었다.
▶ 파일 업로드 공격과 파일 인클루젼 공격의 조합
주소창에 http://localhost/dvwa/hackable/uploads/webshell.php.jpg 을 입력하여 high 단계로 업로드한 파일을 실행시켜보자.
이때 파일이 jpg로 저장되었기 때문에 프로그램이 실행되지 않는다.
만약, 파일 인클루젼 공격이 가능한 경우 업로드된 jpg 파일을 파일 인클루젼 공격으로 인클루드 시키면 파일명은 jpg 이지만 파일 내용은 웹쉘 코드이기 때문에 파일에 삽입되어 있던 웹쉘 코드를 인클루드하여 실행할 수 있다.
주소창의 page 파라미터 부분에 주소를 입력해준다. 이때, 파일 인클루젼 공격 루틴도 우회해 주어야한다. 따라서 file/ 를 작성하고 패스 트래버설 공격을 이용하여 경로를 지정해주어야 한다.
정확히 주소를 입력했다면 jpg 파일로 업로드 되었음에도 불구하고 파일 인클루젼 공격을 통해 웹쉘을 실행할 수 있었다.
하지만 여기서 나온 입력칸에 명령어를 입력할 경우에는 오른쪽 이미지와 같이 에러가 발생한다.
따라서 위 이미지와 같이 주소창에 바로 cmd 파라미터 값을 넘겨주어야 한다.
[ 파일 업로드 공격 대응 ]
이번에는 impossible 단계로 변경 후 소스코드를 살펴보자.
업로드 된 파일 확장자가 이미지 파일인 것을 확인한 후, 업로드 된 내용으로 이미지 파일을 다시 생성하여 가짜 이미지 파일이 업로드 되는 것을 완전히 차단해준다.
이외 다른 방법으로는 업로드 된 파일의 이름을 랜덤하게 바꾸어서 해커가 자신이 업로드한 파일에 접근하지 못하도록 하는 방법이 있다. 또한, 업로드 되는 서버를 웹 서버와 분리하는 방법도 있다.
[참고자료] 인프런_화이트해커가 되기 위한 8가지 웹 해킹 기술
'Security > Web hacking' 카테고리의 다른 글
SQL 인젝션 공격 (1) (0) | 2023.01.09 |
---|---|
CAPTCHA 공격 (0) | 2023.01.09 |
파일인클루젼 공격 (0) | 2023.01.07 |
CSRF 공격 (0) | 2023.01.02 |
커맨드인젝션 공격 (0) | 2023.01.02 |