[php2shell] nextcloud 25 (docker部署) php8.1 的一次补丁

wwwwwhj 2026-10-23 14:48 1

前天刷到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阿, 疯了

最新回复 (1)
  • maxzxc0110 10-23 17:24
    1楼

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

* 帖子来源Linux.do
返回