File Upload 개요
▶ File upload 취약점?
공격자가 원하는 임의의 파일을 업로드할 수 있는 취약점, 파일을 업로드 하는 곳: 프사, 서류 등 다양한 곳에서 발생
▶ 공격 시나리오
(1) 서버 측 실행파일 업로드 -> RCE -> 서버 장악(webshell)
※Shell이란? 컴퓨터와 사람이 소통하기 위해서는 OS가 필요하다. OS와 사용자는 Shell을 통해 소통한다. Web Shell 을 올려버리면 서버에 임의의 명령을 내릴 수 있게 만들 수 있다.
(2) Deface 공격 -> 웹 루트에서 메인페이지 변조
(3) 디도스 -> 예를 들자면, 용량제한 없을 때 엄청 큰 용량을 올려서 다른사람이 업데이트 못하게끔 만들어버릴수 있음
▶ 웹 쉘(Web Shell)
(1) 한줄 웹 쉘 : <?php echo system($_GET['cmd']); ?> // system함수 : command(ls,id,ifconfig..)를 실행할 수 있게 만든다.
(2) 웹 쉘 올리는 방법?:
1. 우선 test파일을 올린다.
2. F12 눌러서 불러오는 주소 확인 // 마우스 오른쪽 누르고 이미지 주소 복사 => ex) /files/avatars/ssss.sss
3. 웹쉘 업데이트 후, 이미지 주소 복사로 접속=>?cmd=ls,ifconfig....
※ 주의! php로 실행되어야 함! 끝이 .php 여야~
▶ How to Bypass?
(1) 파일 검증 우회 :
1. Content Type MIME : Content-Type으로 구분 -> ex) Content-Type : image/jpeg 변경!
2. 확장자 검증(까다로움, 제대로 안되어 있기를 기도!)
- '.php' 만 검증하는 경우 : .phtml, .php3, .php5 로 실행가능// .PHP('대소문자'로 우회하는 경우도 있음.. 안될수도)
- '.jsp' 만 검증하는 경우 : .jspx ('webshell.jspx' 검색!)
- '.php%00.jpg' : 윈도우즈 서버에서는 먹힐수도. null뒤는 날려버리는 원리, 그러나 실행까지 되는 경우는 거의 없었다..
3. 서버측 파일 override
.htaccess 中 'Add Type application/x-httpd-php .@@@' 으로 수정해버리면 @@@로 수정한 확장자를 php로 실행함.
4. File Signature
"HxD(헥스에디터)"로 내가 올린 파일을 보면 jpg의 경우 "FF D8 FF EO ~"로 시작한다. 이는 옆에 헥스값 에디터에서 출력되는 값으로 "ÿØÿà" 값으로 출력된다. 끝에 <?php ~~~ ?> 넣어주면 실행.
5. 파일 업로드 다른 Method
요청에서 GET/POST/PUT 설정 후, 요청 Body부분에 <?php ~~ ?> 작성
(2) 개발자의 실수+클라이언트측 검증(필터링 첫번째는 클라이언트/서버 체크!)
1. 클라이언트 체크하는 경우 -> 'intercept' 걸어버리면 그만!
2. 파일업로드 코드가 앞에있고, 파일이 php인지 확인 -> '업로드되지 않는 것 같지만, 사실 업로드 되는중!'
※ 로그인하는 경우도 마찬가지이다. 예를 들어, 세션을 먼저 발급하고 ID/PASS를 검증하는 경우, JS측 코드를 조금만 수정해서 로그인이 되어버리는 경우도 있다.