File upload
공격자가 임의의 파일을 업로드할 수 있는 공격입니다.
<?php system($_GET['cmd']); ?>
서버에서 실행할 수 있는 파일을 업로드하는 것이기 때문에 정확한 경로를 알고 있어야 한다고 합니다.
파일 업로드할 때 파일 이름이 랜덤으로 들어가는 경우나 경로를 파악하기 힘든 경우에는 sql 인젝션이나 다른 경로를 통해서 알아내야 합니다.
이중확장자
image.php.jpg X
image.jpg.php O
만약 이렇게 업로드된다면 둘 다 개발을 잘 못 한 경우인데 아래의 경우 웹 셸 공격 가능합니다.
NULL Byte Injection
image.php.jpg 이 파일로 웹쉘 공격이 가능하려면 image.php%00.jpg 이렇게 해야 합니다.
서버에 저장되기 전에 파일처리단계에서는 맨 뒤부터 체크하기 때문에 jpg라고 인식하지만 실제로 처리단계가 끝나고 저장할 때 리눅스 같은 경우 %00 이 부분부터 잘려서 image.php로 저장된다고 합니다. 이런 경우 공격이 가능합니다.
웹 설정 파일
.htaccess를 업로드할 수 있다면 서버에서 실행할 확장자를 우회하여 공격할 수도 있습니다.
AddType application/xhttpd-php .todayabc
filename=”.htaccess”로 업로드할 때 위 내용을 집어넣습니다.
File Include
파라미터 값에 따라서 다른 페이지를 보여주는 경우 www.example.com/index.php?lang=ko.php
<?php include($GET['lang']); ?>
위처럼 동작하는 경우 include, include_once, require, require_once 이런 php 함수를 쓰는 것으로 추측할 수 있습니다.
../../login.php 파일 경로에 따라 ../값이 다르겠지만 www.example.com/index.php? lang=../login.php 이렇게 로그인 페이지가 불러와질 수도 있습니다.
그럼 최상위 경로에서 ../../../../../../../../etc/passwd라는 파일을 가져올 수도 있습니다. 그러므로 서버 안에 있는 원하는 임의의 파일을 가져올 수 있습니다.
그래서 소스코드를 가져오고 싶지만 php는 실행파일이기 때문에 가져올 수 없고 파일을 업로드했을 때 php를 막는다면 jpg나 txt 같은 여러 가지 파일 안에 웹쉘 cmd 코드를 올려서 File Include 취약점을 이용할 수 있습니다.
LFI (Local File Inclue) 취약점이라고도 합니다.
RFI (Remote File Inclue) 도 있는데 이것은 외부에 있는 NAS 같은 서버에서 내부에 있는 Inclue 취약점을 이용하는 것입니다.
File Include 취약점이 있는데 파일 업로드가 없는 경우 한 가지 방법
웹 로그가 Include로 불러와지는 것을 이용해서 GET 파라미터에 그러니까 그냥 주소창에 www.example.com/<?php system($_GET[‘cmd’]); ?> 이렇게 전송하면 로그에 기록이 남는 것을 이용해서 취약점을 이용할 수도 있습니다. ex) www.example.com/index.php?lang=../../../../../../../../var/log/apache2/access.log&cmd=ls
File upload 좋지 않은 대응 방안
1. 파일 이름 난독화를 해서 파일 경로를 추측하지 못하게 하는 경우 sql injection 같은 취약점이나 파일 경로가 노출되는 취약점이 나온다면 file upload 취약점도 같이 나오기 때문에 위험할 수도 있습니다.
2. 사용자가 업로드한 것을 서버에 직접 다운로드해서 저장하는 경우에는 db에서 유저 id 값을 가져와서 인증을 성공하면 접근 가능하게 하거나 php 코드에서 유저 확인 코드를 넣어서 확인된 인원만 접근할 수 있게 할 수도 있습니다.
3. 확장자 화이트 리스트 기반 필터링 %00 같은 거 쓰면 우회가 가능할 수 있습니다.
File upload 근본적인 대응 방안
1. DB에 파일을 저장합니다.
2. NAS 같은 파일 저장 서버를 사용합니다. 단 NAS 서버에는 php 같은 코드를 실행할 수 없는 환경을 만들어야 합니다.