ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • File Upload [14주차]
    모의해킹스터디5기(feat.Normaltic) 2024. 2. 12. 16:28

     

     

     

    이제 슬슬 끝나가는 분위기다. 마지막 한 달은 모의해킹 프로젝트로 진행된다고 하셨고, 앞으로 배울 공격 기법도 얼마 남지 않은 것 같다. 이번 시간에는 파일 업로드에 대해 배웠다. 지금까지 컴퓨터를 다루면서 해킹 당하기에 가장 위험한 행동이 파일을 다운로드 받는 것이라고 들어왔는데 정작 정확한 원리에 대해서는 모르고 있었다. 그게 왜 위험한 행동인지 한 번 알아보겠다.


    File Upload 공격

    정의

    공격자가 원하는 임의의 파일을 업로드

     

    발생 원인

    파일을 업로드할 때 검사를 안 한다

     

    발생 위치

    파일을 업로드할 수 있는 곳

    - 이 부분은 Burp Suite으로 쉽게 확인 가능하다.

     

     

     

     

     

    File Upload 공격 시나리오

    - 만약 서버가 제한 없이 모든 파일을 받는다는 가정하에 - 

     

    1. 서버 측 실행 파일 넣기
      • 서버에 웹쉘과 같은 실행 파일을 넣는다면 그 서버에 원하는 명령을 내릴 수 있게 되고, 서버를 장악할 수 있다.
    2. Phising 유도
      • HTML 파일을 넣어 Phising 사이트로 더 쉽게 속일 수 있다. 상대 서버에 파일을 넣는 것이기 때문에 Phising 주소의 도메인은 진짜이기 때문. Phising이라는 의심을 쉽게 풀게 된다.
      • naver에 login.php 파일을 업로드  -->  ex) naver.com/login.php
    3. Deface 공격
      • deface 공격은 "외관을 훼손한다" 는 뜻으로 홈페이지 화면을 바꾸는 공격이다. deface 공격으로 인해 심각한 피해가 일어나는 것은 아니고 주로 정치적이나 실력 과시를 위해 행해진다.
      • index 파일을 넣어 덮어쓰는 방식이다.
    4. XSS
      • 서버 안에 파일을 넣을 수 있다는 것은 그 속에 스크립트도 넣을 수 있다는 말이다. 일반적인 페이지로 속여 그 속에 악성 스크립트를 넣어 공격이 가능하다. 이 경우는 Stored XSS에 속한다. 
    5. DoS
      • DoS 공격 중에서 서버 리소스를 소모하는 경우를 말한다. 대용량 파일을 넣어 서버의 업로드 공간을 다 채우면 다른 사용자들이 업로드를 못하게 하는 서비스 거부 공격이다.

     

     

     

     

     

    서버 측 실행 파일 : Web Shell

    앞서 말한 공격 시나리오 중 "서버 측에 실행 파일을 넣는다" 의 실행 파일은 여러가지가 될 수 있겠지만, 해킹이 목적이라면 웹쉘(Web Shell)이 될 것이다. 

     

    웹쉘이란 웹사이트를 통해 쉘을 열어 공격자가 원하는 명령어를 입력하는 공격이다. 

     

    웹쉘은 서버에서 사용하는 파일에 따라 코드는 다르지만 원리는 같다. php 파일에서의 웹쉘을 보자.

    <?php
         echo system($_GET['cmd']);
    ?>

     

    위의 코드는 "cmd" 라는 이름으로 들어온 GET method 파라미터 값을 서버의 shell에 입력한 후, 그 결과를 화면에 나타내는 코드다. 이 코드는 php 파일을 다루는 서버에서만 가능하다. 지금은 간단하게 결과를 화면에 띄우도록 했지만 shell의 결과를 어떻게 보여줄지 말지, 혹은 또 다르게 처리할지는 코드를 어떻게 작성하느냐에 따라 무궁무진하다. 

     

     

    웹쉘 공격의 핵심은 두 가지가 있다.

    1. 웹 서버 측에 실행 코드를 업로드하는 것

     

    당연히 웹쉘 파일을 업로드하는 것이 최우선이다. 그래야 공격이 가능하니까. 그리고 다음으로 중요한 것은

    2. 업로드된 파일의 경로를 알아내는 것

     

    웹쉘 파일은 업로드한다고 실행되는 것이 아니다. 서버에서 그 파일을 실행하게끔 만들어야 한다. 그 방법이 파일의 경로를 파악해 HTTP 요청으로 불러오는 것이다. 서버가 요청을 받게 되면 그 파일을 실행한 후 그 결과를 사용자에게 보여주는 것을 이용한 공격이다. 경로 확인은 파일을 다운로드 했을 때 Burp Suite로 확인해도 되고, 주소창을 확인해도 된다. 

     

     

     

     

     

     

    대응 방법

    1. 업로드되는 파일의 형식을 제한

     

    HTTP 요청 헤더 중에 content-type 이라는 값이 있다. 파일의 형식을 나타내는 값인데, 이걸 활용해서 서버는 파일의 형식이 text/php인 파일, 즉 서버에서 실행할 수 있는 파일의 형식을 제외하고 업로드를 승인하면 된다. 

    우회 방법 : Burp Suite 으로 업로드 요청 메시지에서 type을 변환하면 php코드도 전송이 가능하다.
    ex) text/php -> image/jpeg 

     

     

     

    2. 해당 경로의 파일들은 실행하지 않도록 설정

     

    파일이 업로드되더라도 결국 파일이 실행되지만 않으면 공격은 성공할 수 없다. 그래서 파일이 업로드되는 경로 안에 파일들은 실행되지 않도록 설정하면 공격을 막을 수 있다.

    우회 방법 : 업로드할 파일 이름을 설정하여 저장 경로를 변경할 수 있다. 지정된 실행 불가 경로를 우회하여 공격 가능.
    ex) file.php -> ../file.php 

     

     

     

    3. 특정 확장자를 사용할 수 없도록 설정

     

    웹쉘에 주로 쓰이는 서버 측 스크립트 코드들(php, jsp, ...)의 확장자 파일은 업로드 못하도록 설정할 수도 있다.

    우회 방법 : 대소문자 구분 (PhP, pHp, PHp, ...)
                      다른 이름의 확장자 사용 (php -> phtml, php3, php5, ... ) 

     

     

     

     

     

     

     

     


    참조

     

    What is a Web Shell Attack? ⚔️ How to detect and prevent it?

    Want to learn more on what a Web Shell Attack is or How to find a Webshell File? 📒 In this article we will tell you its meaning, examples.

    www.wallarm.com

     

Designed by Tistory.