"오늘은 파일 업로드 취약점에 대하여 알아보겠습니다"
< 1. File upload vulnerabilites 란? >
파일 업로드 취약점은 공격자가 원하는 코드가 담긴 임의의 파일을 업로드 하는 취약점 입니다.
단순한 파일이 아닌 Server Side Script 를 사용하는 확장자의 파일을 업로드 하는것을 말합니다.
*Server Side Script ?
Server Side Script -> 서버에서 실행이 된다.(php,asp,jsp,python....)
Client Side Script -> 클라이언트 측에서 실행이 된다.(HTML , CSS, Javascript....)
1.예를 들어 공격자가 이런 PHP 코드가 담긴 attack.php 파일을 서버에 업로드했다고 생각해봅시다.
<?php echo system($_GET['id']); ?>
2. 서버에 이 파일을 업로드 한 후 이 파일이 있는 경로와 함께 id 라는 변수를 주소창에 적어줍니다.
3. PHP 는 서버측 에서 먼저 실행되기 때문에 서버컴퓨터로 system(id변수값) 함수가 호출됩니다.
4. system 함수는 쉽게 생각하면 도스창에 명령어를 입력하는 함수다. 즉 서버컴퓨터의 도스창에 원하는 명령어를 id값을 통해 GET 방식으로 넣음으로써 echo 함수를 통해 그 내용을 페이지를 통해 전달받습니다.
5. 즉! 서버의 컴퓨터를 장악할 수 있다는 뜻입니다.
*발생원인
> 파일을 업로드 받을때 검증 ,검사를 안하기 때문에 발생!
*발생위치
> 파일을 업로드 할 수 있는 곳.
*유발시킬 수 있는 공격
1. 서버측 실행 파일 (Web Shell) - <사실상 파일업로드 취약점=Web Shell 공격 >
2. Deface 공격(index page 바꾸기)
3. XSS(Stored XSS) 공격
4. DOS 공격
<2. 웹 쉘(Web Shell) 이란?>
해킹공부를 하다보면 흔히들 쉘을 땃다 라는 표현을 많이 들어보셨을겁니다.
대체 쉘이 뭐길래 이런 표현을 쓰는것일까요?
Shell 이란 PC와 대화를 주고받을수 있는 도구 혹은 권한 이라고 생각하시면 됩니다.
도스창에 깜빡이는 명령어 입력창이 쉘 이라고 볼수 있는것이죠! 그것을 통해 권한내에서 컴퓨터를 조작할 수 있으니!
그러니깐 쉘 을 땄다는건 도스창을 열어서 명령을 할 수 있게되었다! 라는 것을 의미하고, 루트(root)쉘을 땄다는말은 루트권한으로 명령어창에 명령을 내릴수 있다는 말입니다.
Shell(쉘)
< 3. 공격방법 >
공격방법은 Server-Side-Script 를 작성하여 파일을 업로드 한 후 , 그 파일이 저장된 경로로 주소를 검색(요청) 하게 되면 파일이 실행이 되면서 코드가 동작하게 됩니다.
"업로드 해줄 파일(.php)의 코드"
<?php echo system($_GET['id']); ?> //삽입할 코드
*** 웹 쉘 공격의 핵심 ***
- 웹 서버측 실행코드를 업로드 할 수 있어야함.
- 업로드된 파일의 경로를 알아야 함.
1. 웹 서버측 실행코드를 업로드 할 수 있어야 한다.
>당연히 그냥 서버측 스크립트 파일(PHP)을 업로드 하도록 놔두는 웹사이트는 없을 것 입니다.
<업로드를 제한 할 수 있는 방법이 몇가지 있습니다.>
- 업로드 되는 파일을 검사하자! (MIME Type)
Content-Type : image/jpg , image/png 같은 이미지 파일만 받게 하면 업로드 되는것을 막을수 있습니다.
그러나 php파일 업로드 요청할때 text/php -> image/jpg 로 바꿔주면 우회가 가능합니다.
- 파일이 업로드 되는 위치에 디렉토리의 권한을 없애자.
파일이 속한 Directory 에 권한을 제한하면 php 파일의 스크립트를 읽지 못할것 입니다.
이렇게 되면 저장한 php 파일에 접근할 시 php 코드가 실행이 안되고 HTML 코드로 그대로 보일것 입니다.
그러나 이 또한 파일이름 앞에다가 "../" 을 붙이는 방안이있습니다.
파일이름을 "../filename" 이런식으로 저장하면 원래 저장될 Dir 의 상위폴더에 저장이 되어 권한을 얻을수 있습니다.
이 방법도 이런식으로 우회가 가능합니다.
-php 확장자를 못쓰게 하자
php 확장자 자체를 필터링 하여서 아예 못쓰게 만드는 것이다.
하지만 이 방법 또한 확장자 이름을 "PHP, pHp , PhP" 이런식으로 필터링 우회가 가능합니다.
만약 이 우회법도 막힌다면 잘 안알려진 php 를 사용하는 확장자인 phtml , php3 ,php5 등등 다른 확장자를 사용하여 우회가 가능합니다.
<다른 유용한 확장자>
-
PHP: .php, .php2, .php3, .php4, .php5, .php6, .php7, .phps, .phps, .pht, .phtm, .phtml, .pgif, .shtml, .htaccess, .phar, .inc, .hphp, .ctp, .module
-
PHPv8에서 작동: .php, .php4, .php5, .phtml, .module, .inc, .hphp, .ctp
-
ASP: .asp, .aspx, .config, .ashx, .asmx, .aspq, .axd, .cshtm, .cshtml, .rem, .soap, .vbhtm, .vbhtml, .asa, .cer, .shtml
-
Jsp: .jsp, .jspx, .jsw, .jsv, .jspf, .wss, .do, .action
-
Coldfusion: .cfm, .cfml, .cfc, .dbm
-
Flash: .swf
-
Perl: .pl, .cgi
-
Erlang Yaws 웹 서버: .yaws
[출처 : https://book.hacktricks.xyz/v/kr/pentesting-web/file-upload]
- 만약 확장자 검사를 파일 내부 바이너리 검사를 통해 File Signature(파일 시그니처) 검사를 한다면?
우선 파일 시그니처란 파일의 데이터 맨앞 , 맨뒤에 확장자를 명시하는 정해진 16진수 규칙을 의미합니다.
파일 시그니처는 파일의 처음에만 존재하는 파일 포맷도 있지만 파일의 마지막에도 존재하는 포맷도 있습니다.
파일의 처음에 존재하는 시그니처는 보통 헤더(Header) 시그니처, 파일의 마지막에 존재하는 시그니처는 푸터(Footer or Tailer) 시그니처입니다.
이 시그니처는 파일 확장자를 바꾼다고 해도 그대로 남아있기 때문에 HEX Editor 를 통해 직접적으로 접근해야합니다.
<자주 사용되는 시그니처>
파일 형식 | 시그니처 | 식별 문자 |
PNG | 89 50 4E 47 0D 0A 1A 0A | ‰PNG |
JPG, JPEG | FF D8 FF DB | ÿØÿÛ |
FF D8 FF EE | ÿØÿî | |
FF D8 FF E0 | ÿØÿà | |
FF D8 FF E0 00 10 4A 46 49 46 00 01 | ÿØÿà JFIF | |
FF D8 FF E1 xx xx 45 78 69 66 00 00 | ÿØÿá Exif | |
FF D8 FF E8 xx xx 53 50 49 46 46 00 | ÿØÿè SPIFF | |
BMP | 42 4D | BM |
GIF | 47 49 46 38 37 61 47 49 46 38 39 61 |
GIF87a GIF89a |
MP3 | 49 44 33 | ID3 |
WAV | 52 49 46 46 xx xx xx xx 57 41 56 45 | RIFF WAVE |
AVI | 52 49 46 46 xx xx xx xx 41 56 49 20 | RIFF AVI |
25 50 44 46 2D | %PDF- | |
ZIP, docx, pptx, xlsx, jar, apk | 50 4B 03 04 | PK |
exe, dll, scr, sys | 4D 5A | MZ |
[출처 :https://taesam.tistory.com/21]
실제로 확장자를 바꿔도 시그니처가 안바뀌는지 제 컴퓨터에 있던 사진으로 확인해보았습니다.
컴퓨터에 있던 ' 닭!.png ' | 확장자를 jpg 로 바꾼 ' 닭!.jpg' |
이렇게 된다면 확장자를 바꿔서 요청을 하든 , 요청할 때 Burp 로 확장자를 바꾸든 소용이 없을것 입니다... 그렇다면 어떻게 해야하나?!
그래서 "이미지 웹쉘" 이란 것이 나왔습니다.
1. 만약 시그니처를 검사하는 것이라면 PHP 파일의 HEX 맨앞에 JPG 파일의 시그니처로 삽입해줍니다..
2. 시그니처 바로 뒤 , 아니면 hex 코드의 맨 마지막 부분의 쉘을 실행시키는 코드를 삽입해 줍니다.
3. 그러면 시그니처 검사도 통과하게 되면서 서버에서 코드가 동작하게 됩니다.
악성 스크립트가 삽입된 PHP 파일 | HEX Editor 로 조작한 PHP 파일 |
결국 서버에 저장되고 실행되는 것은 PHP 파일입니다!
JPG 파일을 업로드 해서 실행시킨 것이 아니라 PHP 파일인데 JPG 로 속인다음 업로드 하여 실행시킨것 입니다!
결국엔 서버에서 실행시켜야 하는 파일은 PHP 파일인것은 변함이 없습니다.
2. 업로드 된 경로를 알아야 한다.
사실 이 작업이 가장 번거로울 수 있습니다...
파일을 업로드 하더라도 파일이 출력되는 곳이 어디인지 찾아야 합니다.
이건 따로 방법이 있는게 아니라 , 업로드한 파일이 출력되는 곳부터 차근차근 확인해 나아가야 합니다!..
<기본적으로 경로를 알아낼 수 있는 방법을 알려드리자면....>
파일이 업로드 된 후 그 파일의 링크를 복사한 후 주소창에 입력하면 파일의 경로가 나옵니다.
이 방식으로 경로를 알아낼 수 있습니다.
긴 글 읽어주셔서 감사합니다!
'웹해킹' 카테고리의 다른 글
Authentication&Athorization (인증/인가 취약점)이란? (0) | 2024.08.03 |
---|---|
CSRF(Cross Site Request Forgery)공격 (0) | 2024.07.04 |
XSS 공격 대응방안 (0) | 2024.06.30 |
XSS(Cross-site scripting)기법 (0) | 2024.06.24 |
SQL Injection(SQLi) (0) | 2024.05.27 |