IT Trend

php2shell 보안패치하기

remake 2026. 10. 24. 12:01

php2shell 보안 패치하려고 하는데 아래와 같은 버전이 필요합니다.

 

PHP  브랜치수정 버전
PHP 8.3 8.3.36 이상
PHP 8.4 8.4.27 이상
PHP 8.5 8.5.12 이상

리눅스 시스템이 20.04라서 업그레이드 자체가 안된다 결국 리눅스 버전업까지 진행을 해야했습니다.

 

먼저 nginx 설정을 확인합니다.

 

sudo nginx -T 2>/dev/null | grep -nE "# configuration file|server_name|root |fastcgi_pass"

 

혹시 도커이면 sudo docker ps로 확인합니다.

sudo apt full-upgrade -y
sudo reboot
# 재접속 후
screen -S upgrade
sudo do-release-upgrade

 

 

 

 

Ctrl+A, C를 누르면 screen 안에 새 창이 열립니다(이전 창으로는 Ctrl+A, N으로 돌아갑니다). 아니면 그냥 N으로 취소하고 아래를 마친 뒤 다시 시작해도 됩니다.

1. DB 덤프 (필수)

 
 
sudo mysqldump --all-databases --routines --events --single-transaction > ~/all-db-$(date +%F).sql
ls -lh ~/all-db-*.sql

2. 설정과 워드프레스 파일 백업

sudo tar czf ~/backup-etc-wp-$(date +%F).tgz /etc/php /etc/nginx /etc/apache2 /etc/mysql /var/www 2>/dev/null
dpkg --get-selections > ~/packages-before.txt

백업 파일은 서버 밖으로 꼭 복사해 두세요(scp 등). 서버가 망가지면 서버 안에 있는 백업도 같이 날아갑니다.

3. MariaDB 메타패키지 확인

 
bash
dpkg -l | grep -i mariadb

 

 

질문 답
서드파티 저장소 비활성화 / 1022 포트 추가 SSH y
Do you want to start the upgrade? y
설정 파일 교체 여부 (/etc/mysql, /etc/php, /etc/nginx 등) N (기존 파일 유지)
서비스 자동 재시작 Yes
Remove obsolete packages? N
마지막 재부팅 y

마리아 db 등은 n을 눌러야 합니다.

 

. 예전 focal용 PPA 설정을 치우고 jammy용으로 다시 추가

 
bash
sudo rm /etc/apt/sources.list.d/ondrej-ubuntu-php-focal.list*
sudo LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php
sudo apt update
apt-cache policy php8.3-fpm

Candidate:가 **8.3.36 이상이고 ubuntu22.04**가 붙은 버전이면 됩니다. 여기서 확인되지 않으면 진행하지 말고 결과를 보내주세요.

 


php8.3-fpm:
  Installed: 8.3.13-1+ubuntu20.04.1+deb.sury.org+1
  Candidate: 8.3.36-1+ubuntu22.04.1+deb.sury.org+1
  Version table:
     8.3.36-1+ubuntu22.04.1+deb.sury.org+1 500
        500 https://ppa.launchpadcontent.net/ondrej/php/ubuntu jammy/main arm64 Packages
 *** 8.3.13-1+ubuntu20.04.1+deb.sury.org+1 100
        100 /var/lib/dpkg/status
ubuntu@python-server:~$

 

이제 8.3.36이 보입니다.

 

드디어 업그레이드가 완료

 

워드프레스 도구 - 사이트 건강 - 서버에서도 정상적으로 보입니다.

 

 

필요하다면 8.5로 올리는 방법도 있습니다.

 

 

sudo apt install -y php8.5-{fpm,gd,mysql,curl,mbstring,intl,imagick,xml,zip}

3. 설정 옮기기

FPM 풀 설정(listen = 127.0.0.1:9000, 프로세스 개수 등)

 
bash
sudo cp /etc/php/8.5/fpm/pool.d/www.conf ~/www.conf.85-default
sudo cp /etc/php/8.3/fpm/pool.d/*.conf /etc/php/8.5/fpm/pool.d/
grep -rn "8\.3" /etc/php/8.5/fpm/pool.d/       # 8.3 경로가 남아 있으면 8.5로 수정

php.ini에서 직접 바꾼 값 확인

 
bash
for k in memory_limit upload_max_filesize post_max_size max_execution_time max_input_vars max_input_time date.timezone; do
  printf "%-22s 8.3: %-12s 8.5: %s\n" "$k" \
  "$(php-fpm8.3 -i 2>/dev/null | grep -m1 "^$k" | awk '{print $3}')" \
  "$(php-fpm8.5 -i 2>/dev/null | grep -m1 "^$k" | awk '{print $3}')"
done
ls /etc/php/8.3/fpm/conf.d/ | grep -vE '^[0-9]{2}-(.*)\.ini$' ; ls /etc/php/8.3/fpm/conf.d/ | grep -E '^9[0-9]-'

값이 다른 항목은 /etc/php/8.5/fpm/php.ini에서 8.3과 같게 맞춥니다. conf.d에 직접 만든 .ini 파일(예: 99-custom.ini)이 있으면 /etc/php/8.5/fpm/conf.d/로 복사합니다.

 


ubuntu:~$ grep -rn "8\.3" /etc/php/8.5/fpm/pool.d/
/etc/php/8.5/fpm/pool.d/www.conf:41:;listen = /run/php/php8.3-fpm.sock
/etc/php/8.5/fpm/pool.d/www.conf:252:;       It's available in: /usr/share/php/8.3/fpm/status.html
ubuntu:~$ grep -E "^(memory_limit|upload_max_filesize|post_max_size|max_execution_time|max_input_vars|max_input_time|date.timezone)" \
  /etc/php/8.3/fpm/php.ini /etc/php/8.5/fpm/php.ini
/etc/php/8.3/fpm/php.ini:max_execution_time = 3600
/etc/php/8.3/fpm/php.ini:max_input_time = 3600
/etc/php/8.3/fpm/php.ini:memory_limit = 256M
/etc/php/8.3/fpm/php.ini:post_max_size = 100M
/etc/php/8.3/fpm/php.ini:upload_max_filesize = 100M
/etc/php/8.3/fpm/php.ini:date.timezone = Asia/Seoul
/etc/php/8.5/fpm/php.ini:max_execution_time = 30
/etc/php/8.5/fpm/php.ini:max_input_time = 60
/etc/php/8.5/fpm/php.ini:memory_limit = 128M
/etc/php/8.5/fpm/php.ini:post_max_size = 8M
/etc/php/8.5/fpm/php.ini:upload_max_filesize = 2M

 

1. 8.5 php.ini 백업

 
sudo cp /etc/php/8.5/fpm/php.ini ~/php.ini.85-default

2. 6개 값을 8.3과 같게 변경

sudo sed -i \
  -e 's/^max_execution_time = .*/max_execution_time = 3600/' \
  -e 's/^max_input_time = .*/max_input_time = 3600/' \
  -e 's/^memory_limit = .*/memory_limit = 256M/' \
  -e 's/^post_max_size = .*/post_max_size = 100M/' \
  -e 's/^upload_max_filesize = .*/upload_max_filesize = 100M/' \
  -e 's#^;date.timezone =.*#date.timezone = Asia/Seoul#' \
  /etc/php/8.5/fpm/php.ini

각 줄은 "이 항목의 줄을 찾아서 값을 바꿔라"라는 뜻입니다. 시간대는 8.5에서 ;date.timezone =처럼 주석 처리돼 있어서, ;를 없애면서 값을 넣도록 했습니다.

 

설정 문법 검사

 

sudo php-fpm8.5 -t
 
sudo php-fpm8.5 -t

test is successful이 나와야 합니다.

 

4단계: 8.3에서 8.5로 전환 (사이트가 몇 초 끊깁니다)

 
bash
sudo systemctl disable --now php8.3-fpm
sudo dpkg --configure -a
sudo systemctl enable --now php8.5-fpm
systemctl is-active php8.5-fpm
sudo ss -tlnp | grep 9000
  • dpkg --configure -a는 아까 멈춘 설치를 마무리하는 명령입니다. 이번에는 포트가 비어 있으니 에러 없이 끝나야 합니다.
  • active가 나오고 9000번 포트에 php-fpm8.5가 보이면 성공입니다.

터미널의 PHP도 8.5로

sudo update-alternatives --set php /usr/bin/php8.5
php -v | head -1

 

8.5로 맞췄습니다.

 

8.3 삭제

sudo apt purge 'php8.3-*'

실행하면 지울 패키지 목록을 먼저 보여주고 Do you want to continue? [Y/n]라고 묻습니다. 목록에 php8.3-로 시작하는 것만 있는지 확인하고 Y를 누르세요. php8.5나 mariadb, nginx가 섞여 있으면 n을 누르고 목록을 보여주세요.