WordPress 백업 마이그레이션 플러그인은 WordPress 웹사이트의 백업 및 마이그레이션 프로세스를 단순화하고 사용하기 쉬운 다양한 기능을 제공하는 강력한 도구입니다.
최근 CDNetworks Security Lab은 1.3.8 이전 버전의 Backup Migration 플러그인에서 원격 코드 실행 취약점을 발견했습니다. 이 취약점은 CVSS 3.1에서 9.8 등급으로 위험 수준이 심각합니다. 이를 통해 악의적인 공격자는 백도어 액세스를 통해 대상 웹사이트에서 원격으로 명령을 실행하여 사이트를 완전히 제어할 수 있습니다.
이 취약점을 악용하기 위한 조건은 비교적 간단하지만 광범위한 영향을 미칩니다. 악용을 방지하려면 기업은 이 플러그인의 버전을 확인하고 관련 취약점을 수정하거나 더 나아가 웹 보호 솔루션을 도입해야 합니다.
이 빠른 가이드에서는 취약점에 대한 분석을 진행합니다.
취약점 분석 및 복제
취약점은 플러그인 파일 /includes/backup-heart.php에 존재합니다. 이 취약점을 복제하는 첫 번째 단계는 이 파일을 찾아 중단점을 설정하는 것입니다. 그런 다음 데이터를 /wp-content/plugins/backup-backup/includes/backup-heart.php 경로로 전송하여 동적 디버깅을 수행합니다. 서버가 데이터를 수신하면 요청 헤더 데이터가 변수 $fields에 저장되어 있음을 알 수 있습니다.
계속해서 $필드의 필드 값이 상수로 정의되어 있음을 알 수 있습니다. 여기서 주요 초점은 BMI_ROOT_DIR 및 BMI_INCLUDES 상수에 있습니다. BMI_ROOT_DIR 값은 요청 헤더의 content-dir 값에 의해 결정되며 BMI_INCLUDES 값은 BMI_ROOT_DIR과 "includes"를 연결하여 구성됩니다.
또한 BMI_INCLUDES는 "bypasser.php"와 연결되어 require_once 함수를 이용하여 포함되어 있는 것으로 확인되었습니다. 결과적으로 require_once의 매개변수를 제어할 수 있으므로 이는 일반적인 파일 포함 취약점이 됩니다.
일부 인코딩에서는 고정 접두사가 인코딩의 시작 문자로 사용됩니다. 다음은 다양한 인코딩에 대한 문자입니다. 예를 들어 한국어 문자 인코딩(ISO-2022-KR)에서 인코딩된 메시지는 "\x1b$)C" 시퀀스로 시작해야 합니다.
인코딩 식별자 | 앞에 붙는 문자 |
ISO2022KR | \x1b$)C |
UTF16 | \xff\xfe |
UTF32 | \xff\xfe\x00\x00 |
전 세계적으로 거의 7,000개의 언어가 사용됩니다. 글로벌 인터넷 커뮤니케이션을 촉진하려면 다양한 인쇄 가능한 문자가 필요합니다.
기본 ASCII 인코딩 테이블은 잘 알려져 있지만 제한 사항이 있습니다. 일본어 문자를 표시할 수 없으며 그리스 알파벳의 "λ", "ν", "π"와 같은 기호를 포함할 수 없습니다. 다른 언어의 문자와 “☺” 같은 이모티콘을 표시하기 위해 다양한 인코딩 테이블이 개발되었습니다.
이러한 인코딩 테이블은 문자를 한 언어에서 다른 언어로 변환할 수 있습니다. 변환 프로세스는 인코딩 길이, 접두사 문자 등의 요소에 영향을 받으며 새 문자가 생성될 수도 있습니다.
호스트에서는 iconv -l을 사용하여 지원되는 인코딩 변환 테이블을 볼 수 있습니다.
이 변환표는 php://convert.iconv.*.* 필터를 통해 사용할 수 있습니다. 예를 들어, Convert.iconv.CP861.UTF-16은 파일의 문자 인코딩을 CP861에서 UTF-16으로 변환하는 것을 의미합니다.
다음 코드 예제에서는 문자열 "START"를 'CP861', 'UTF16', 'L4' 및 'GB13000' 인코딩을 통해 변환하여 문자열 시작 부분에 새 문자 'B'를 삽입할 수 있습니다.
그렇다면 인코딩 변환 중에 생성된 정크 문자를 어떻게 처리합니까? PHP에서 base64 디코딩에는 '0-9', 'a-z', 'A-Z', '/', '+' 및 패딩 문자 '='만 인식하는 기능이 있습니다. 디코딩할 문자열에 다른 문자가 포함되어 있으면 PHP는 이러한 문자를 직접 무시하고 인식 가능한 나머지 문자를 연결하여 디코딩합니다. 예를 들어:
보시다시피, 디코딩하는 동안 문자열의 '@&>>_'와 같은 문자는 자동으로 무시됩니다. 느슨하게 구문 분석된 base64 디코딩을 사용하여 인코딩 변환 프로세스 중에 생성된 정크 문자를 제거할 수 있습니다. 정크 문자에 Convert.base64-decode 필터의 디코딩에 영향을 미칠 수 있는 '='가 포함된 경우 UTF-7 인코딩을 사용하여 디코딩에 영향을 주지 않고 '=' 기호를 다른 기호로 변환할 수 있다는 점에 유의하는 것이 중요합니다. Convert.base64-decode 필터 중 하나입니다.
위의 방법을 사용하면 임의의 base64 문자를 생성할 수 있습니다. 생성된 base64 문자를 디코딩한 후 원본 문자를 얻을 수 있습니다. 마지막으로 생성된 원래 페이로드를 php://filter/{filter}/resource=php://temp로 연결합니다(resource=php://temp를 지정하면 경로가 유효한지 확인하기 위해 모든 .php 파일을 추가할 수 있습니다). 페이로드는 파일에 기록되고, require_once를 사용하여 파일을 포함함으로써 코드 실행에 파일이 포함됩니다.
GitHub에서 작성자는 php://convert.iconv.*.* 필터를 사용하여 해당 base64 문자를 빠르게 생성할 수 있는 인코딩 변환 도구를 작성했습니다.
이 스크립트에 의해 생성된 페이로드는 요청 헤더 content-dir의 값으로 설정됩니다.
인코딩 변환 후 생성된 악성코드가 성공적으로 작성 및 포함되어 파일 포함부터 코드 실행까지의 과정이 완료된 것으로 확인됩니다.
WordPress 6.4.3 + 백업 마이그레이션 플러그인 1.3.6을 사용하여 로컬로 설정합니다. php_filter_chain 도구를 사용하여 페이로드 코드를 생성하세요. 아웃.txt`; ?>` 명령.
(https://github.com/synacktiv/php_filter_chain_generator/blob/main/php_filter_chain_generator.py)
결과를 요청 헤더의 content-dir 값으로 복사하고 데이터 패킷을 http://localhost/wordpress/wp-content/plugins/backup-backup/includes/backup-heart.php 경로로 보냅니다.
http://localhost/wordpress/wp-content/plugins/backup-backup/includes/out.txt에 액세스하세요. 그러면 시스템 명령 날짜의 실행 결과가 out.txt 파일에 기록된 것을 확인할 수 있습니다.
취약점 해결 솔루션
그만큼 최신 버전의 백업 마이그레이션 플러그인 이 문제가 해결되었으므로 최대한 빨리 최신 버전으로 업데이트하는 것이 좋습니다.
취약점 최소화: CDNetworks의 Cloud Security 2.0
CDNetworks의 클라우드 WAF 이 취약점 악용에 대한 즉각적인 보호를 제공합니다. 다른 변종 공격 방법과 다양한 구성 요소 취약점을 지속적으로 조사 및 분석하여 기업의 "취약점 창"을 최소화하기 위해 보호 규칙을 즉시 배포합니다.
최근 몇 달 동안 CDNetworks는 클라우드 보안 솔루션을 다음으로 업그레이드했습니다. 클라우드 보안 2.0, WAF의 몇 가지 주요 기능을 소개합니다.
- 내장 규칙 세트: 0일/N-일 및 OWASP 상위 10개 공격에 대한 1,000개 이상의 규칙 세트.
- 지능형 분석(자체 조정): 사용자 행동에 대한 AI 기반 학습으로 자동으로 규칙 예외를 생성하여 오탐을 줄입니다.
- 제로데이 공격을 위한 가상 패치: 취약점을 지속적으로 모니터링하여 매시간 새로운 규칙을 생성합니다.
- AI 기술을 사용한 관리형 보호 모드: 향상된 위협 탐지 및 대응.
- 확장성 및 배포 용이성: 간편한 배포로 필요에 따라 확장 가능
CDNetworks는 이러한 기능을 통합함으로써 APAC 지역 기업의 진화하는 보안 요구 사항을 충족하고 경쟁이 치열한 시장에서 조직을 보호하는 것을 목표로 합니다.