Sploitus

Exploit for PrestaShop

kitploit · 2026-09-05

Exploit Code

MARKDOWN105 lines
## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-FARISV-PRESTASHOP-CVE-2018-19126
# PrestaShop 后台远程代码执行 (CVE-2018-19126)

这是 CVE-2018-19126 的概念验证代码,通过串联 PrestaShop 后台多个漏洞,利用 phar 触发反序列化实现远程代码执行。

前提条件:

  * PrestaShop 1.6.x 低于 1.6.1.23 或 1.7.x 低于 1.7.4.4。
  * 后台账户(物流员、翻译员、销售员等)。



![](https://assets.kitploit.com/production/public/readmes/25388/c5ec6d56498ca5c1f3dafc059095762b1220432e4eade77b9cb6eaf13db22321.gif)

PrestaShop 发布说明:http://build.prestashop.com/news/prestashop-1-7-4-4-1-6-1-23-maintenance-releases/

受影响包链接:https://assets.prestashop2.com/en/system/files/ps_releases/prestashop_1.7.4.3.zip

## 警告

仅供教育目的。请勿将此脚本用于非法活动。作者不承担任何滥用或损害的责任。

## 示例

你需要 `php` 并启用 curl 扩展,同时在 `php.ini` 中设置 `phar.readonly = Off` 才能运行此利用脚本。

root@kitploit:~
    
    
    # 下载仓库
    wget https://github.com/farisv/PrestaShop-CVE-2018-19126/archive/master.zip -O PrestaShop-CVE-2018-19126.zip
    unzip PrestaShop-CVE-2018-19126.zip
    cd PrestaShop-CVE-2018-19126-master
    
    # 运行利用脚本
    # 用法: php exploit.php 后台URL 邮箱 密码 函数 参数
    php exploit.php http://127.0.0.1/admin-dev/ some-email@example.com 54l35m4n123 system 'cat /etc/passwd'
    

注意:上传目录会被重命名,如果文件夹名称没有恢复,你将无法再次上传恶意 phar 文件。你可能需要执行反弹 shell 以获得持久 RCE,或者在你的 payload 中包含重命名文件夹的命令(你需要知道上传目录的路径)。

## 解释

我们可以通过 `[back-office-path]/filemanager/ajax_calls.php` 中的 `getimagesize()` 函数实现 利用 phar 包装器的隐式反序列化。

https://github.com/PrestaShop/PrestaShop/commit/4c6958f40cf7faa58207a203f3a5523cc8015148#diff-0f03d65f71cdd8eeb12913a97a6b8945

root@kitploit:~
    
    
    case 'image_size':
        if (realpath(dirname(_PS_ROOT_DIR_.$_POST['path'])) != realpath(_PS_ROOT_DIR_.$upload_dir)) {
            die();
        }
        $pos = strpos($_POST['path'], $upload_dir);
        if ($pos !== false) {
            $info = getimagesize(substr_replace($_POST['path'], $current_path, $pos, strlen($upload_dir)));
            echo json_encode($info);
        }
    

我们需要找到一种方法,通过绕过某些检查,使 `getimagesize()` 以 phar 包装器 URL 作为参数被调用。

第一个 `realpath()` 检查相当严格。

root@kitploit:~
    
    
    if (realpath(dirname(_PS_ROOT_DIR_.$_POST['path'])) != realpath(_PS_ROOT_DIR_.$upload_dir)) {
        die();
    }
    

`$upload_dir` 变量来自 `config.php`,默认设置为 `$upload_dir = Context::getContext()->shop->getBaseURI().'img/cms/';`。我们不能在 `$_POST['path']` 中使用 `phar://[string]`,因为 `realpath(dirname(_PS_ROOT_DIR_.$_POST['path']))` 会返回 `false`(路径不存在)。

存在另一个漏洞(CVE-2018-19125),允许用户删除或重命名 `$upload_dir`。如果 `$upload_dir` 目录不存在,`realpath(_PS_ROOT_DIR_.$upload_dir)` 将返回 `false`,因此我们可以绕过该检查,因为 `realpath(dirname(_PS_ROOT_DIR_.$_POST['path']))` 同样也是 `false`。这个漏洞是在代码审查中发现的,当时我们正在寻找绕过方法。

简而言之,CVE-2018-19125 允许调用 `execute.php` 中 `delete_folder` 或 `rename_folder` 动作时的 `path` 参数为空,从而应用程序会删除/重命名 `$upload_dir`。

第二个检查很简单:`$_POST['path']` 必须包含 `$upload_dir`。

root@kitploit:~
    
    
    $pos = strpos($_POST['path'], $upload_dir);
    if ($pos !== false) {
    

我们只需在 phar URL 中 phar 文件的路径后面附加 `/img/cms/`,因为即使该目录在 phar 存档中不存在,反序列化仍然会发生。`substr_replace($_POST['path'], $current_path, $pos, strlen($upload_dir))` 只会将 `/img/cms/` 替换为该文件夹的绝对路径 `$current_path`(例如,如果应用程序安装在 `/var/www/html/`,则路径为 `/var/www/html/img/cms/`)。

由于我们可以控制 `getimagesize()` 函数处理 phar 包装器 URL,我们需要将恶意 phar 文件上传到服务器。默认情况下,PrestaShop 中的 FileManager 只允许 'jpg', 'jpeg', 'png', 'gif', 'bmp', 'tiff', 'svg', 'pdf', 'mov', 'mpeg', 'mp4', 'avi', 'mpg', 'wma', 'flv', 'webm' 作为扩展名。我们可以构造 payload 并以有效扩展名保存。我们可以使用来自 PHPGGC (https://github.com/ambionics/phpggc/blob/master/gadgetchains/Monolog/RCE/1/) 的 `Monolog` gadget 链,因为 PrestaShop 使用了它。

最终利用步骤:

  1. 构造恶意 phar 文件并以有效扩展名保存(例如 phar.pdf)。
  2. 将 phar.pdf 上传到 FileManager。
  3. 触发漏洞将上传目录重命名为其他名称(例如 renamed)。
  4. 调用 `image_size` 动作,`path` 参数设为 `phar://../../img/renamed/phar.pdf/img/cms/`。
  5. phar.pdf 中的反序列化 payload 将被执行。



`exploit.php` 脚本会自动完成所有步骤。

请记住,上传目录在第 3 步被重命名,如果文件夹名称没有恢复,你将无法再次上传恶意 phar 文件。你可能需要使用反弹 shell 作为 payload,或者在 payload 中包含重命名文件夹的命令(你需要知道上传目录的路径)。