• wwwwwhj

    前天刷到php2shell的补丁更新.

    看戏看到一半突然想到给公司几年前部署的nextcloud好像就是php, f**k!

    由于nextcloud25版本实在太古老, pgsql也是用的12的版本, 丧失所有反抗的力气

    评估了一下, 打一个新的镜像是最方便的方式, 给有同样情况的佬友参考一下处理过程.

    1.备份! 备份! 备份! 良好习惯不要丢.

    2.下载php的官方发布的8.1补丁版源码

    nextcloud25只支持到8.1的php, 下载官方发布的补丁自己源码安装吧

    PHP-8.1-CVE-2026-109618-109619

    3.编辑Dockerfile等文件, build一个镜像出来

    这里很搞笑的是, Debian 11也归档了, 真是服了.

    Dockerfile```
    FROM nextcloud:25.0.4-apache

    Debian 11 已 EOL,使用 Debian 官方归档仓库

    RUN set -eux; \
    printf '%s\n' \
    'deb http://archive.debian.org/debian bullseye main' \
    'deb http://archive.debian.org/debian-security bullseye-security main' \

    /etc/apt/sources.list; \

    rm -f /etc/apt/sources.list.d/*.list; \
    rm -rf /var/lib/apt/lists/*; \
    apt-get -o Acquire::Check-Valid-Until=false update; \
    apt-get install -y --no-install-recommends sudo; \
    rm -rf /var/lib/apt/lists/*

    开启http2

    RUN a2enmod http2

    安全补丁来源:

    php/php81-security

    PHP-8.1-CVE-2026-109618-109619

    Commit: 1d7dec178a094e6e75b229ce22754045f8c6070a

    LABEL org.opencontainers.image.description="Nextcloud 25.0.4 with patched PHP 8.1"
    LABEL org.opencontainers.image.php-patch-commit="1d7dec178a094e6e75b229ce22754045f8c6070a"

    安装编译依赖和原有 sudo

    RUN set -eux; \
    apt-get update; \
    apt-get install -y --no-install-recommends \
    sudo \
    autoconf \
    automake \
    bison \
    re2c \
    libtool \
    pkg-config \
    build-essential \
    apache2-dev \
    libargon2-dev \
    libcurl4-openssl-dev \
    libonig-dev \
    libreadline-dev \
    libsodium-dev \
    libsqlite3-dev \
    libssl-dev \
    libxml2-dev \
    zlib1g-dev \
    libfreetype6-dev \
    libjpeg62-turbo-dev \
    libpng-dev \
    libwebp-dev \
    libgmp-dev \
    libicu-dev \
    libldap2-dev \
    libpq-dev \
    libzip-dev; \
    rm -rf /var/lib/apt/lists/*

    将补丁源码复制到 PHP 官方构建目录

    COPY php81-security/ /usr/src/php/

    WORKDIR /usr/src/php

    从补丁源码构建 PHP CLI 和 Apache 模块

    生成 configure

    RUN set -eux; \
    cd /usr/src/php; \
    test -f buildconf; \
    autoconf --version | head -n 1; \
    automake --version | head -n 1; \
    php -v; \
    if ! sh -x ./buildconf --force > /tmp/buildconf.log 2>&1; then \
    tail -n 100 /tmp/buildconf.log; \
    exit 1; \
    fi

    RUN set -eux; \
    ./configure \
    --build=x86_64-linux-gnu \
    --with-config-file-path=/usr/local/etc/php \
    --with-config-file-scan-dir=/usr/local/etc/php/conf.d \
    --enable-option-checking=fatal \
    --with-mhash \
    --with-pic \
    --enable-ftp \
    --enable-mbstring \
    --enable-mysqlnd \
    --with-password-argon2 \
    --with-sodium=shared \
    --with-pdo-sqlite=/usr \
    --with-sqlite3=/usr \
    --with-curl \
    --with-iconv \
    --with-openssl \
    --with-readline \
    --with-zlib \
    --disable-phpdbg \
    --without-pear \
    --with-libdir=lib/x86_64-linux-gnu \
    --disable-cgi \
    --with-apxs2

    RUN make -j2

    RUN make install

    重新编译 Nextcloud 所需的主要 PHP 核心扩展

    RUN set -eux; \
    docker-php-ext-configure gd \
    --with-freetype \
    --with-jpeg \
    --with-webp; \
    docker-php-ext-configure ldap \
    --with-libdir=lib/x86_64-linux-gnu; \
    docker-php-ext-install -j2 \
    bcmath \
    exif \
    gd \
    gmp \
    intl \
    ldap \
    opcache \
    pcntl \
    pdo_mysql \
    pdo_pgsql \
    sysvsem \
    zip; \
    docker-php-ext-install -j2 sodium

    WORKDIR /var/www/html

    构建阶段验证 PHP 与 Apache

    RUN set -eux; \
    php -v; \
    php -m; \
    php-config --version; \
    apache2ctl -t; \
    apache2ctl -M 2>/dev/null | grep 'php_module'

    继续继承 Nextcloud 官方 ENTRYPOINT 和 CMD

    ``docker-compose.yml部分内容``
    services:
    nextcloud:
    build:
    context: ./Dockerfile
    dockerfile: Dockerfile
    image: nextcloud:25.0.4-apache-changed
    ```4.直接单独狠狠的重启nextcloud, 结束!!!

    图片


    省去了一些验证的过程, 只列了大致的步骤.

    验证的过程很罗嗦很麻烦, 不过反正有ai, 有需要的佬还是验证完再确认切换生产环境的容器.

    我帮我一个朋友问一下, windows部署的远古禅道10.3有办法把数据迁出, 重新部署一个最新版本的禅道导入数据吗?

    我实在不想折腾升级和补丁了, 它怎么是用的php5或者7阿, 疯了

    主楼
  • maxzxc0110

    我本地复现,在特定条件下确实能复现拿到系统权限,但是并非零依赖零条件指哪打哪的漏洞,利用条件甚至有点苛刻,至少线上的几个poc我用本地和线上项目复现不了。感觉有些公众号是有点危言耸听博流量的,当然不排除有高手藏着掖着,欢迎丢poc来打脸。

    #1

发表回复

登录后回复