>백엔드 개발 >PHP 튜토리얼 >웹 보안 파일 업로드 취약점 공격 및 예방 방법

웹 보안 파일 업로드 취약점 공격 및 예방 방법

步履不停
步履不停원래의
2019-06-06 15:00:225339검색

웹 보안 파일 업로드 취약점 공격 및 예방 방법

1. 파일 업로드 취약점과 WebShell의 관계

파일 업로드 취약점은 네트워크 공격자가 실행 파일을 서버에 업로드하여 실행하는 것을 의미합니다. 여기에 업로드되는 파일은 트로이 목마, 바이러스, 악성 스크립트 또는 WebShell 등일 수 있습니다. 이 공격 방법은 가장 직접적이고 효과적입니다. 일부 파일 업로드 취약점을 악용하기 위한 기술적 임계값은 매우 낮으므로 공격자가 쉽게 구현할 수 있습니다.

파일 업로드 취약점 자체는 매우 유해한 취약점이며, WebShell은 이 취약점의 활용 범위를 무한히 확대할 것입니다. 대부분의 업로드 취약점이 악용된 후 공격자는 시스템에 대한 후속 진입을 용이하게 하기 위해 WebShell을 종료합니다. 공격자는 영향을 받는 시스템에 WebShell을 배치하거나 삽입한 후 WebShell을 사용하여 서비스에서 원하는 모든 작업을 보다 쉽고 은밀하게 수행할 수 있습니다.

여기서 주목해야 할 점은 업로드 취약점 악용에는 WebShell을 사용하는 경우가 많고 WebShell의 이식은 파일 업로드 이상의 의미를 갖는다는 점입니다.

1 Webshell 소개

WebShell은 asp, php, jsp, cgi 등의 웹 파일 형태로 존재하는 명령 실행 환경으로 웹 백도어라고도 합니다. 공격자는 일반적으로 웹사이트에 침입한 후 이러한 ASP 또는 PHP 백도어 파일을 웹사이트 서버의 웹 디렉터리에 있는 일반 웹페이지 파일과 혼합한 후 브라우저를 사용하여 이러한 백도어에 접근하고 명령 실행 환경을 확보하여 웹사이트를 제어합니다. 서버의 목적(파일 업로드, 다운로드 또는 수정, 데이터베이스 작동, 임의 명령 실행 등).

WebShell 백도어는 은폐성이 뛰어나 방화벽을 쉽게 통과할 수 있습니다. WebShell에 접속하면 시스템 로그는 남지 않고 웹 사이트의 웹 로그에 일부 데이터 제출 기록만 남게 됩니다. 강요. 공격자는 일반 파일에서 WebShell을 숨기고 파일 시간을 수정하여 은폐성을 강화할 수도 있습니다. 또한 일부 기능을 사용하여 WebShell을 인코딩하거나 연결하여 탐지를 피할 수도 있습니다. 또한 한 문장으로 구성된 트로이 목마 포니를 통해 더욱 강력한 악성 코드를 제출하면 애플리케이션 자체의 탐지를 더 쉽게 통과할 수 있습니다. 는 가장 일반적이고 독창적인 포니이며, 이를 기반으로 하는 <script>eval($ _POST[ a]);</script>등.

2 파일 업로드 취약점의 원리

대부분의 웹사이트와 응용 프로그램 시스템에는 업로드 기능이 있습니다. 일부 파일 업로드 기능 구현 코드는 사용자가 업로드하는 파일 접미사 및 파일 유형을 엄격하게 제한하지 않으므로 공격자가 임의의 PHP 파일을 업로드하여 다음을 수행할 수 있습니다. 웹에서 액세스할 수 있는 디렉터리를 만들고 이러한 파일을 PHP 인터프리터에 전달할 수 있으므로 원격 서버에서 임의의 PHP 스크립트를 실행할 수 있습니다.

시스템에 파일 업로드 취약점이 있는 경우 공격자는 바이러스, 트로이 목마, WebShell, 기타 악성 스크립트 또는 스크립트가 포함된 이미지를 서버에 업로드할 수 있으며 이러한 파일은 공격자의 후속 공격을 용이하게 합니다. 특정 취약점에 따라 여기에 업로드되는 스크립트는 일반 접미사가 포함된 PHP, ASP 및 JSP 스크립트이거나 변조된 접미사가 포함된 이러한 유형의 스크립트일 수 있습니다.

업로드된 파일이 바이러스 또는 트로이 목마인 경우 주로 사용자나 관리자를 속여 다운로드하여 실행하거나 직접 자동으로 실행하도록 하는 데 사용됩니다.

업로드된 파일이

WebShell인 경우 공격자는 이러한 웹 백도어를 통해 명령을 실행하고 서버를 제어할 수 있습니다 업로드된 파일이

다른 악성 스크립트

인 경우 공격자는 직접 스크립트를 실행하여 업로드된 파일이 악성 이미지

일 수 있습니다. ,

이미지에 스크립트가 포함될 수 있습니다. 이를 로드하거나 클릭하세요. 사진을 업로드하면 스크립트가 자동으로 실행됩니다 . 업로드된 파일이 일반 접미사로 위장한 악성 스크립트 인 경우 공격자는 로컬

을 사용할 수 있습니다. 파일을 실행하는 파일 포함 취약점

. 예를 들어 bad.php 파일 이름을 bad.doc로 변경하고 서버에 업로드한 후, PHP의 include, include_once, require, require_once 등의 함수를 통해 include하고 실행하면 됩니다. 여기에 악성 파일이 업로드되는 세 가지 주요 이유는 다음과 같습니다.

파일 업로드 시 확인이 손실됩니다. 파일 형식 검사는 수행되지 않습니다. 일부 응용 프로그램은 클라이언트 측에서만 검사되지만 전문 공격자의 눈에는 거의 모든 클라이언트 측 검사가 검사가 없는 것과 같습니다. 공격자는 NC 및 Fiddler와 같은 중단점 업로드 도구를 통해 클라이언트 측 검사를 쉽게 우회할 수 있습니다. 일부 애플리케이션은 서버 측에서 블랙리스트 검사를 수행하지만 대소문자를 무시할 수 있습니다. 예를 들어, .php를 .Php로 변경하면 일부 애플리케이션은 서버 측에서 화이트리스트 검사를 수행하지만 원래 애플리케이션인 경우 %00 잘림 문자를 무시합니다. jpg 이미지 업로드만 허용하는 경우 파일 이름은 xxx.php%00.jpg로 구성될 수 있습니다. 여기서 %00은 16진수 0x00 문자입니다. 그러나 서버의 경우에는 다음과 같은 이유로 인해 오류가 발생합니다. %00 문자가 잘리면 최종 업로드된 파일은 xxx.php가 됩니다.

업로드 후 파일명 수정 처리가 부적절합니다. 일부 응용 프로그램에는 서버 측에 완전한 블랙리스트 및 화이트리스트 필터링 기능이 있지만 업로드된 파일의 파일 이름을 수정할 때는 매우 주의하여 사용자가 파일 접미사를 수정할 수 있도록 허용합니다. 애플리케이션이 .doc 파일만 업로드할 수 있는 경우 공격자는 먼저 .php 파일 접미사를 .doc로 변경할 수 있으며, 업로드 성공 후 파일 이름을 수정할 때 접미사를 다시 .php로 변경할 수 있습니다.

타사 플러그인을 사용할 때 도입되었습니다. 많은 애플리케이션은 파일 업로드 기능이 있는 타사 플러그인을 사용합니다. 이러한 플러그인의 파일 업로드 기능에는 허점이 있을 수 있으며 공격자는 이러한 허점을 이용하여 파일 업로드 공격을 수행할 수 있습니다. 예를 들어, 유명한 블로그 플랫폼인 WordPress에는 풍부한 플러그인이 있으며, 이러한 플러그인에서 매년 수많은 파일 업로드 취약점이 발견됩니다.

3 파일 업로드 공격 예시

앞서 언급한 것처럼 파일 업로드 취약점이 발생하는 데는 여러 가지 이유가 있습니다. 두 번째를 예로 들어 LibrettoCMS 파일 업로드 취약점(취약점 익스플로잇-db 번호는 60560)을 선택하여 자세한 내용을 살펴보겠습니다. 설명 전체 취약점 악용 프로세스입니다.

Libretto는 PHP 언어와 MySQL 언어를 사용하여 개발된 콘텐츠 관리 시스템입니다. LibrettoCMS 버전 2.2.2에서는 확인되지 않은 사용자가 파일을 업로드하고 업로드된 파일의 접미사 이름을 수정할 수 있습니다. 시스템에서는 사용자가 doc 및 pdf 형식의 파일만 업로드하도록 제한하고 있지만, 파일명 수정 시 처리 오류가 발생하여 사용자가 파일 접미사를 수정할 수 있게 되었습니다. 공격자는 악성 파일의 접미사를 doc 또는 pdf로 변경할 수 있으며, 업로드가 성공적으로 실행된 후에는 접미사를 php로 변경할 수 있습니다.

l doc 접미사가 포함된 WebShell을 업로드하세요

시스템의 파일 관리 페이지/plugins/pgrfilemanager/PGRFileManager.php를 방문하여 일반 doc 파일을 업로드하고 업로드가 성공할 수 있는지 확인하세요. PHP 언어로 WebShell 백도어를 작성하려면 인터넷에서 기존 WebShell을 다운로드하고 WebShell 파일의 접미사를 doc로 변경할 수도 있습니다. 여기서 myshell.php 백도어를 myshell.doc로 변경합니다.

WebShell을 준비한 후 PGRFileManager.php 파일 관리 페이지를 방문하여 myshell.doc를 서버에 업로드하세요. 그림 1과 같이 doc 접미사가 붙은 myshell이 ​​성공적으로 업로드되었습니다. 이때 브라우저를 통해 doc 형식에 접근하는 myshell은 정상적으로 실행될 수 없습니다.

웹 보안 파일 업로드 취약점 공격 및 예방 방법

그림 1 mybshell.doc가 성공적으로 업로드되었습니다

l WebShell 접미사를 php

로 변경합니다. 파일 관리 페이지에서 mybshell.doc를 마우스 오른쪽 버튼으로 클릭하고 이름 바꾸기를 선택하여 파일 이름 수정 페이지로 들어가 mybshell을 변경합니다. doc를 mybshell .php로 복사하고 확인 버튼을 클릭하여 수정 결과를 제출합니다(그림 2 참조). 이때 myshell 파일의 접미사가 php로 수정되었습니다. 애플리케이션 인코딩 구현으로 인해 파일 관리 페이지에서는 myshell.php 파일을 읽을 수 없지만, 파일 업로드 디렉터리에서 수정된 파일을 볼 수 있습니다. 3)에 표시된 시스템 서버(그림 참조).

웹 보안 파일 업로드 취약점 공격 및 예방 방법

그림 2 mybshell.doc를 mybshell.php

웹 보안 파일 업로드 취약점 공격 및 예방 방법

그림 3 서버의 myshell 접미사가 php

l로 변경되었습니다. Webshell을 실행

이때, 서버 업로드 디렉토리는 이미 php 접미사이므로 서버 환경은 브라우저를 통해 직접 파일에 액세스할 수 있습니다: http://192.168.20.174/vlun/Mylibretto/userfiles/myshell.php에서 설정한 비밀번호를 입력하세요. WebShell을 사용하여 파일에 로그인합니다(그림 4 참조). 그림에서 볼 수 있듯이 공격자는 이 WebShell 파일을 통해서만 파일 관리, 데이터베이스 관리, 시스템 명령 실행 및 서버에서 임의의 PHP 코드 실행을 수행할 수 있습니다. 이 WebShell을 사용하면 공격자는 다른 WebShell 파일을 더 깊은 디렉터리에 배치하거나 시스템 관리자가 검색하는 것을 방지하기 위해 시스템에 이미 거의 사용되지 않는 PHP 파일에 PHP 백도어 코드를 직접 추가할 수 있습니다.

웹 보안 파일 업로드 취약점 공격 및 예방 방법

그림 4 WebShell 백도어 접근 성공

4 파일 업로드 취약점 방어

우선 업로드된 파일을 웹 컨테이너에서 해석하고 실행할 수 있습니다. 따라서 파일이 업로드되는 디렉터리는 웹 컨테이너가 포함하는 경로여야 합니다.
둘째, 사용자는 웹에서 이 파일에 액세스할 수 있습니다. 파일이 업로드되었지만 사용자가 웹을 통해 해당 파일에 액세스할 수 없거나 웹 컨테이너에서 스크립트를 해석할 수 없는 경우 이를 취약점이라고 부를 수 없습니다.
마지막으로, 사용자가 업로드한 파일의 내용이 보안 검사, 서식 지정, 이미지 압축 및 기타 기능에 의해 변경되는 경우에도 공격이 실패할 수 있습니다.

파일 업로드 취약점을 방지하는 몇 가지 일반적인 방법.

1. 파일 업로드용 디렉터리는 실행 불가능으로 설정되어 있습니다.

웹 컨테이너가 해당 디렉터리 아래의 파일을 구문 분석할 수 없는 한, 공격자가 스크립트 파일을 업로드하더라도 서버 자체에는 영향을 미치지 않습니다. 그래서 이것은 매우 중요합니다.

2. 파일 형식 결정

파일 형식을 결정할 때 MIME 유형, 접미사 확인 및 기타 방법을 조합하여 사용할 수 있습니다. 파일 형식 검사에서는 화이트리스트 방법을 적극 권장합니다. 블랙리스트 방법은 신뢰할 수 없는 것으로 수없이 입증되었습니다. 또한, 이미지 처리의 경우 압축 기능이나 크기 조정 기능을 이용하여 이미지 처리 과정에서 이미지에 포함될 수 있는 HTML 코드를 파기할 수 있습니다.

3. 임의의 숫자를 사용하여 파일 이름과 파일 경로를 다시 작성하세요.

파일 업로드 코드를 실행하려면 사용자가 파일에 액세스할 수 있어야 합니다. 일부 환경에서는 사용자가 업로드할 수 있지만 액세스할 수는 없습니다. 난수를 사용하여 파일 이름과 경로를 다시 쓰면 공격 비용이 크게 증가합니다. 다음으로, shell.php.rar.rar 및 crossdomain.xml과 같은 파일은 이름 변경으로 인해 공격을 받을 수 없습니다.

4. 파일 서버의 도메인 이름을 별도로 설정하세요

브라우저의 동일 출처 정책으로 인해 crossdomain.xml 업로드, 다음을 포함하는 XSS 익스플로잇 업로드 등 일련의 클라이언트 측 공격은 효과적이지 않습니다. Javascript 및 기타 문제가 해결됩니다.

l 시스템 개발 단계에서의 방어

시스템 개발자는 특히 PHP 언어를 사용하여 시스템을 개발할 때 강력한 보안 감각을 가져야 합니다. 시스템 개발 단계에서는 시스템 보안을 충분히 고려해야 합니다. 파일 업로드 취약점의 경우 클라이언트 측과 서버 측 모두에서 사용자가 업로드한 파일명과 파일 경로를 엄격하게 확인하는 것이 가장 좋다. 숙련된 공격자가 도구를 사용하여 클라이언트 측 검사를 우회할 수 있지만 일부 기본 테스트도 차단할 수 있습니다. 대문자 및 대문자 사용과 같은 우회를 방지할 수 있는 서버 측 검사에는 화이트리스트 필터링 방법을 사용하는 것이 가장 좋습니다. 동시에 HTTP 헤더의 콘텐츠 유형과 %00 잘림 문자도 감지해야 합니다. 업로드된 파일의 크기도 확인해야 합니다.

l 시스템 운영 단계의 방어

시스템이 온라인 상태가 된 후 운영 및 유지보수 담당자는 강한 보안의식을 갖고 다양한 보안 탐지 도구를 적극적으로 활용하여 시스템에 대한 보안 스캔을 수행하여 잠재적인 취약점을 신속하게 발견하고 수리하세요. 시스템 로그와 웹 서버 로그를 정기적으로 확인하여 침입 흔적을 찾아보세요. 시스템에 사용되는 타사 플러그인의 업데이트에 정기적으로 주의하세요. 새 버전이 출시되면 타사 플러그인이 노출되어 보안 허점이 있는 경우 적시에 업데이트하는 것이 좋습니다. 즉시 수리해야 합니다. 전체 웹사이트가 오픈 소스 코드나 온라인 프레임워크를 사용하여 구축된 웹사이트의 경우, 취약점 자체 검사와 소프트웨어 버전 및 패치 업데이트에 특별한 주의가 필요합니다. 업로드 기능은 필요하지 않으며 직접 삭제할 수 있습니다. 시스템 자체의 유지 관리 외에도 서버를 올바르게 구성해야 하며, 필요하지 않은 일반 디렉터리에서는 실행 권한을 제거해야 하며, 업로드 디렉터리는 읽기 전용으로 구성할 수 있습니다.

l 보안 장비 방어

파일 업로드 공격의 본질은 악성 파일이나 스크립트를 서버에 업로드하는 것입니다. 전문 보안 장비는 주로 취약점 업로드 및 악용, 악성 파일 업로드 과정을 통해 이러한 취약점을 방어합니다. 파일. 악성 파일은 끊임없이 변화하고 있으며, 숨기는 방법도 끊임없이 등장하고 있습니다. 일반 시스템 관리자의 경우 보안 장치를 배포하여 자신을 방어할 수 있습니다. 현재 H3C커뮤니케이션즈컴퍼니가 출시한 SecPath IPS 시리즈 제품은 오랫동안 축적되어온 네트워크 내 다수의 파일 업로드 취약점 악용을 행위 기반으로 탐지할 수 있을 뿐만 아니라, 콘텐츠 기반으로 악성 파일을 식별할 수 있다.

2. 결론

공격자에게 파일 업로드 취약점은 항상 서버 쉘을 획득하는 중요한 방법이었습니다. 시스템 유지 관리 담당자의 경우 파일 업로드 취약점의 엄청난 피해에 대해 자세히 설명할 필요가 없습니다. 취약점에 대한 관련 지식에 대한 적극적인 학습과 심층적인 이해를 통해 이러한 공격에 더욱 편안하게 대처할 수 있습니다.

추천 튜토리얼: PHP 보안 및 취약점

위 내용은 웹 보안 파일 업로드 취약점 공격 및 예방 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.