ํ์ฌ ํํ์ด์ง๊ฐ ํดํน๋นํ๋ค(๊ฐ๋ฐ์ver.) - ๊ทธ๋๋ณด๋ ๊ฒ์ํ ํดํน๋์ ๊ธฐ๋ก
๐ง ๊ทธ๋๋ณด๋5๋ก ์ด์ ์ค์ธ ํ์ฌ ํํ์ด์ง์์ ์คํธ ๊ธ 61๋ง ๊ฑด์ ๋ฐ๊ฒฌํ๊ณ ์ ๋ฆฌํ ๊ธฐ๋ก์ด๋ค. ์น์ ธ ์๋ ์์ ์คํธ ์ ์ ์ด์๊ณ , ์์ธ์ ๋ฐฉ์น๋ ๊ฐ๋ฐฉ ๊ฒ์ํ์ด์๋ค. sudo ๊ถํ ์์ด ๋์ํด์ผ ํ๋ ์ ์ฝ ์กฐ๊ฑด๊น์ง ๊ทธ๋๋ก ๊ธฐ๋กํด๋๋ ์ด์ด์ด์ด์ด์ด์ด์ด๋ณด ๊ฐ๋ฐ์ผ์ง..
๋จผ์ ๋ณด๋ฉด ์ข์ ๊ธ: ํ์ฌ ํํ์ด์ง๊ฐ ํดํน๋นํ๋ค(๊ธฐํ์ver.) - ๋๋ง ๋ชฐ๋๋ ์ด์ผ๊ธฐ
์ํฉ
์ง์ ์๊ฐ ๊ฒ์ํ์ด ๊ด๊ณ ํ ์คํธ๋ก ๊ฐ๋ํ๋ค. ์ง์ 22๊ฑด ์๋๋ก ์คํธ์ด 22๊ฑด.
๊ด๋ฆฌ์ ํ์ด์ง ๋ก๊ทธ์ธ์ ๋๋๋ฐ ๊ธ์ด ์ง์์ง์ง ์์๋ค. ๊ถํ๊น์ง ๊ฑด๋๋ ธ๋ ์ถ์๋ค.
๊ฐ์ฅ ๋น ๋ฅธ ๊ฑด ๋ฐฉํ๋ฒฝ์์ ํฌํธ๋ฅผ ๋ซ๋ ๊ฒ์ธ๋ฐ, ๊ฐ์ ์๋ฒ์ ๋ค๋ฅธ ์๋น์ค 6๊ฐ๊ฐ ๋ ์ฌ๋ผ๊ฐ ์์๋ค. sudo ๊ถํ๋ ์์ด์ nginx ์ค์ ์ ๋ง์ง ์๋ ์์๋ค. ๊ฒฐ๊ตญ ์๋ฒ๋ ๋๊ณ ์ฌ์ดํธ๋ง ๋ซ๋ ๋ฐฉ๋ฒ์ ์ฐพ์์ผ ํ๋ค.
๊ทธ๋ฆฌ๊ณ ๋ค์ ๋ ์กฐ์ฌ๋ฅผ ๋๋ด๊ณ ๋ณด๋, ๊ทธ๋ ๋ณธ 22๊ฑด์ ์ ์ฒด์ 0.004%. ๊ทธ์ผ๋ง๋ก ๋น์ฐ์ ์ผ๊ฐ์ด์๋ค. ๋ฐฉ์น๋ ์ ์ฐ๋ ๊ฒ์ํ์ 61๋ง ๊ฑด์ ์คํธ์ด ์์ฌ์์๋ ๊ฒ์ด๋ค. ๋ฌด๋ ค 3๋ ๋์์ด๋!
์๋๋ ์ฐจ๋จ โ ์ง๋จ โ ์ ๋ฆฌ โ ์์ธ ๋ณต๊ตฌ๊น์ง์ ์ ๊ณผ์ ์ด๋ค. ๋ช ๋ น์ด๋ ์คํํ ์์ ๊ทธ๋๋ก ์ ์๋ค.
ํ๊ฒฝ๊ณผ ์ ์ฝ
| ํญ๋ชฉ | ๊ฐ |
|---|---|
| CMS | ๊ทธ๋๋ณด๋5 |
| ์น์๋ฒ | Nginx |
| PHP | PHP-FPM 7.4 (2022-11 EOL) |
| DB | MariaDB |
| ๊ถํ | ์ผ๋ฐ ๊ณ์ , sudo ์์ |
| ์๋ฒ ๊ตฌ์ฑ | ๋จ์ผ ์๋ฒ์ PHP-FPM pool 7๊ฐ ๊ณต์กด |
์ด ์ ์ฝ์ด ๋์ ๋ฐฉ์์ ์ ๋ถ ๊ฒฐ์ ํ๋ค.
- sudo ์์ โ nginx ์ค์ ์์ ๋ถ๊ฐ,
/var/log/nginx์ ๊ทผ ๋ถ๊ฐ, PHP ์ ๊ทธ๋ ์ด๋ ๋ถ๊ฐ - Nginx โ
.htaccess๋ฌดํจ - ๋ฉํฐ pool โ ๋ฐฉํ๋ฒฝ ํฌํธ ์ฐจ๋จ ์ ๋ค๋ฅธ ์๋น์ค 6๊ฐ ๋๋ฐ ์ค๋จ
1์ฐจ ๋์ โ sudo ์์ด ์ฌ์ดํธ ๋จ์ ์ฐจ๋จํ๊ธฐ
.htaccess๊ฐ ์ ๋๋ ํ๊ฒฝ์์
ps aux | grep -E 'httpd|apache|nginx' | grep -v grepNginx๋ง ๋ ์๋ค๋ฉด .htaccess๋ ๋ฌด์๋๋ค. ์ฌ์ดํธ ๋ฃจํธ์ 2023๋
์ฐ .htaccess๊ฐ ๋จ์ ์์์ง๋ง 3๋
์งธ ์๋ฌด ์ญํ ์ ํ์ง ์๊ณ ์์๋ค.
.user.ini + auto_prepend_file
PHP-FPM ํ๊ฒฝ์์๋ .user.ini๋ก ๋๋ ํ ๋ฆฌ ๋จ์ PHP ์ค์ ์ ๋ฐ๊ฟ ์ ์๋ค. auto_prepend_file์ PHP_INI_PERDIR ์ค์ฝํ๋ผ ์ฌ๊ธฐ์ ์ง์ ํ ์ ์๋ค. root ๊ถํ์ด ํ์ ์๋ค.
cd /์ฌ์ดํธ๊ฒฝ๋ก
cat > _maintenance.php << 'EOF'
<?php
$key = 'CHANGE-ME-๋์๋ฌธ์์ด';
if (isset($_GET['unlock']) && $_GET['unlock'] === $key) {
setcookie('site_pass', $key, time()+60*60*24*30, '/');
header('Location: /'); exit;
}
if (isset($_COOKIE['site_pass']) && $_COOKIE['site_pass'] === $key) { return; }
header('HTTP/1.1 503 Service Unavailable');
header('Retry-After: 86400');
header('Content-Type: text/html; charset=utf-8');
exit('<h1>ํํ์ด์ง ์ ๊ฒ ์ค์
๋๋ค</h1>');
EOF
echo 'auto_prepend_file = /์ฌ์ดํธ๊ฒฝ๋ก/_maintenance.php' > .user.ini
chmod 644 _maintenance.php .user.ini๐ก
.user.ini๋user_ini.cache_ttl๊ธฐ๋ณธ๊ฐ 300์ด ๋์ ์บ์๋๋ค. ์ ์ฉ๊ณผ ํด์ ๋ชจ๋ ์ต๋ 5๋ถ์ด ๊ฑธ๋ฆฐ๋ค. ๊ธํ๊ฒ ์ฌ๋ฌ ๋ฒ ํ์ธํ์ง ๋ง๊ณ ๊ธฐ๋ค๋ฆด ๊ฒ.
IP ํ์ฉ ๋ฐฉ์๋ณด๋ค ์ฟ ํค ๋ฐฉ์์ ๊ถํ๋ค. ์ ๋ IP(๋ชจ๋ฐ์ผ ํ ๋๋ง, ๊ฐ์ ์ฉ ํ์ )์์๋ IP๊ฐ ๋ฐ๋๋ ์๊ฐ ๋ณธ์ธ๋ ์ฐจ๋จ๋๋ค. ์ฟ ํค ๋ฐฉ์์ ๋คํธ์ํฌ์ ๋ฌด๊ดํ๊ณ , ๊ธฐ๊ธฐ๋ง๋ค ํ ๋ฒ์ฉ๋ง ์ด์ URL๋ก ์ ์ํ๋ฉด ๋๋ค.
403์ด ์๋๋ผ 503์ ์ด๋ค. 403์ ๊ฒ์์์ง์ ์๊ตฌ ์ฐจ๋จ ์ ํธ๋ก ์ฝํ ์์ธ์ด ํต์งธ๋ก ๋น ์ง ์ ์๋ค. 503 + Retry-After๋ ์ผ์์ ์ ๊ฒ์ด๋ผ๋ ์ ํธ๋ค.
์ ์ ํ์ผ์ ๋ชป ๋ง๋๋ค. .jpg, .mp4๋ nginx๊ฐ ์ง์ ์ฒ๋ฆฌํด์ PHP๋ฅผ ์ ๊ฑฐ์น๋ค. ๊ฒ์ํ ์คํธ ํ์ด์ง๋ ์ ๋ถ PHP๋ผ ๋ชฉ์ ์ ๋ฌ์ฑ๋์ง๋ง, ํ๊ณ๋ ์๊ณ ์์ด์ผ ํ๋ค.
๋๋๋ฆฌ๊ธฐ
rm /์ฌ์ดํธ๊ฒฝ๋ก/.user.ini /์ฌ์ดํธ๊ฒฝ๋ก/_maintenance.php.user.ini๋ง ์ง์๋ ์ฆ์ ๋ฌด๋ ฅํ๋๋ค.
2์ฐจ ๋์ โ ์นจํด ์ฌ๋ถ ์ง๋จ
์์๊ฐ ์ค์ํ๋ค. ๋ฐฑ์ โ ์ง๋จ โ ์ ๋ฆฌ. ๋ฐฑ์ ์์ด ์ง์ฐ๋ฉด ์์ธ ์ถ์ ์ด ๋ถ๊ฐ๋ฅํด์ง๋ค.
๋ฐฑ์
# ์ฉ๋ ํ์ธ
du -sh /์ฌ์ดํธ๊ฒฝ๋ก
df -h ~
# ํ์ผ (๋ฐฑ๊ทธ๋ผ์ด๋, SSH ๋๊ฒจ๋ ๊ณ์)
nohup tar -czf ~/backup_$(date +%Y%m%d).tar.gz -C /์์๊ฒฝ๋ก ์ฌ์ดํธํด๋ > ~/backup.log 2>&1 &
# DB ์ ์ ์ ๋ณด (๊ทธ๋๋ณด๋5๋ ๋๋ฌธ์ ์์)
grep -i mysql /์ฌ์ดํธ๊ฒฝ๋ก/data/dbconfig.php
# DB
mysqldump -u๊ณ์ -p DB๋ช
> ~/db_$(date +%Y%m%d).sql๊ฒ์ฆ๊น์ง ํด์ผ ๋ฐฑ์ ์ด๋ค.
tail -3 ~/db_20260813.sql # "-- Dump completed on" ์ด ์์ด์ผ ์ ์
grep -c "CREATE TABLE" ~/db_20260813.sql # ๊ทธ๋๋ณด๋๋ 30~50๊ฐtail์ด ์๋ฌด๊ฒ๋ ์ ๋ฑ์ผ๋ฉด ๋คํ๊ฐ ์คํจํ ๊ฒ์ด๋ค. ํ์ผ์ 0๋ฐ์ดํธ๋ก ๋จ์ ์์ด์ ํฌ๊ธฐ๋ง ๋ณด๋ฉด ์๊ธฐ ์ฝ๋ค.
์น์ ธ ํ์ 5์ข
# 1. ์
๋ก๋ ํด๋ ๋ด ์คํ ํ์ผ โ ์ ์์ด๋ฉด ๊ฑฐ์ ์ ๋์จ๋ค
find /์ฌ์ดํธ๊ฒฝ๋ก/data -type f \( -name "*.php*" -o -name "*.phtml" -o -name "*.inc" \) 2>/dev/null
# 2. ์ต๊ทผ ๋ณ๊ฒฝ๋ PHP
find /์ฌ์ดํธ๊ฒฝ๋ก -name "*.php" -mtime -180 -printf '%TY-%Tm-%Td %p\n' 2>/dev/null | sort -r | head -40
# 3. ์
์ฑ ์๊ทธ๋์ฒ
grep -rl --include="*.php" -E "eval\(base64_decode|gzinflate\(base64_decode|str_rot13\(base64|assert\(\\\$_|shell_exec|passthru\(" /์ฌ์ดํธ๊ฒฝ๋ก 2>/dev/null
# 4. ์ด๋ฏธ์ง ํด๋์ ์จ์ PHP ์ฝ๋
grep -rl "<?php" /์ฌ์ดํธ๊ฒฝ๋ก/data/file 2>/dev/null
# 5. ์ง์์ฑ ํ๋ณด ํ์
crontab -l
cat ~/.ssh/authorized_keys 2>/dev/null์คํ ์ฃผ์. 3๋ฒ์์ ๊ทธ๋๋ณด๋ ๊ธฐ๋ณธ ํ์ผ์ด ๊ฑธ๋ฆฐ๋ค. bbs/download.php, bbs/qadownload.php, lib/Excel/*, adm/sms_admin/*. ์ด ํ์ผ๋ค์ ์๋ ํด๋น ํจ์๋ฅผ ์ด๋ค. ๋ณ๊ฒฝ์ผ์ด ์ค๋๋๋์ง๋ก ํ๋จํ๋ฉด ๋๋ค.
1๋ฒ์์ ๋์ค๋ ์ ์ ํ์ผ๋ ์๋ค. data/dbconfig.php, data/cache/latest-*.php, ๊ทธ๋ฆฌ๊ณ ๊ฐ ์
๋ก๋ ํด๋์ ๋น index.php(๋๋ ํ ๋ฆฌ ๋ฆฌ์คํ
๋ฐฉ์ง์ฉ).
์ฐ๋ฆฌ ๊ฒฝ์ฐ 5์ข ์ ๋ถ ๊นจ๋ํ๋ค. ์๋ฒ ์นจ์ ์ด ์๋๋ผ๋ ๊ฒฐ๋ก ์ด ์ฌ๊ธฐ์ ๋์๋ค.
๊ท๋ชจ ํ์
SELECT table_name, ROUND(data_length/1024/1024,1) AS data_mb, table_rows
FROM information_schema.tables WHERE table_schema='DB๋ช
'
ORDER BY data_length DESC LIMIT 15;๊ฒฐ๊ณผ:
| ํ ์ด๋ธ | MB | rows | ์ ์ฒด |
|---|---|---|---|
| g5_write_qa | 3,078.7 | 615,094 | ๊ฒ์ํ |
| g5_point | 50.9 | 607,324 | ํฌ์ธํธ ์ ๋ฆฝ ๋ด์ญ |
| g5_uniqid | 17.1 | 642,119 | ์ค๋ณต ๋ฑ๋ก ๋ฐฉ์ง ํค |
| g5_visit | 16.9 | 107,564 | ๋ฐฉ๋ฌธ ๋ก๊ทธ |
g5_point์ g5_uniqid๊ฐ ๊ธ ์์ ๊ฑฐ์ ๊ฐ๋ค๋ ๊ฒ ๊ฒฐ์ ์ ๋จ์์๋ค. ์ ์ ๊ธ์ฐ๊ธฐ ํผ์ ํตํด 61๋ง ๋ฒ ๋ฑ๋ก๋๋ค๋ ๋ป์ด๋ค. DB ์ง์ ์ฃผ์
์ด ์๋๋ค.
์นจํฌ ๊ฒฝ๋ก ํ์
SELECT bo_table, bo_subject, bo_write_level, bo_use_captcha, bo_count_write
FROM g5_board ORDER BY bo_count_write DESC;qa | ์ด๊ฑฐ ์ ์จ์ | write_level 1 | captcha 0 | 615,094
people | ํจ๊ปํ๋ ์ฌ๋๋ค | write_level 1 | captcha 0 | 44
email | ์ด๊ฒ๋ ์ง์๋ ๋๋์ | write_level 1 | captcha 0 | -531๋ฏธ์ฌ์ฉ ๊ฒ์ํ 3๊ฐ๊ฐ bo_write_level=1(๋๊ตฌ๋), bo_use_captcha=0์ผ๋ก ์ด๋ ค ์์๋ค. bo_count_write๊ฐ ์์์ธ ๊ฒ์ํ๋ ์์๋ค(์นด์ดํธ๊ฐ ๊ผฌ์ธ ํ์ ).
์๊ณ์ด๊ณผ ์์ฑ์
SELECT DATE_FORMAT(wr_datetime,'%Y-%m') AS ym, COUNT(*) FROM g5_write_qa GROUP BY ym ORDER BY ym;
SELECT mb_id, COUNT(*) AS cnt FROM g5_write_qa GROUP BY mb_id ORDER BY cnt DESC LIMIT 10;2023-05๋ถํฐ ์ ๊ฐ๋๋ก ์์ํด 2025-04๋ถํฐ ์ 7๋ง ๊ฑด ๊ท๋ชจ๋ก ํญ์ฆ. ํผํฌ์ผ์๋ ํ๋ฃจ 2,400๊ฑด(36์ด๋น 1๊ฑด). ๊ณ์ 2๊ฐ๊ฐ ์ ์ฒด์ 98%.
ํ์ ๋ชฉ๋ก์์ pentest0421, alive0049(์ด๋ฆ poc0569) ๊ณ์ ์ด ๋ฐ๊ฒฌ๋๋ค. ๋ณด์ ์ ๊ฒ ์๋ขฐ ์ด๋ ฅ์ด ์๋ค๋ฉด ์ธ๋ถ ์ ์ฐฐ ์๋๋ก ๋ด์ผ ํ๋ค. ์ญ์ ์ ์ ๊ฐ์
์ผยท์ต์ข
๋ก๊ทธ์ธยท์ ์ IP๋ฅผ ๊ธฐ๋กํด๋๋ ๊ฒ ์ข๋ค. ์ ๊ณ ์ ๊ทผ๊ฑฐ๊ฐ ๋๋ค.
์ ๋ฆฌ โ 61๋ง ํ ์ง์ฐ๊ธฐ, DELETE ๋ง๊ณ TRUNCATE๋ก.
61๋ง ํ DELETE๋ ํธ๋์ญ์
๋ก๊ทธ๊ฐ ํญ์ฆํ๊ณ ๋ฝ์ด ์ค๋ ๊ฑธ๋ฆฐ๋ค. ๋ณด์กด ๋์๋ง ๋นผ๊ณ TRUNCATE๊ฐ ํจ์ฌ ๋น ๋ฅด๋ค.
-- 1. ๋ณด์กด ๋์ ๋ฐฑ์
CREATE TABLE bak_qa_admin AS SELECT * FROM g5_write_qa WHERE mb_id='admin';
SELECT COUNT(*) FROM bak_qa_admin;
-- 2. ๋น์ฐ๊ธฐ (์ด ๋จ์)
TRUNCATE TABLE g5_write_qa;
-- 3. ๋ณต์
INSERT INTO g5_write_qa SELECT * FROM bak_qa_admin;TRUNCATE๋ innodb_file_per_table์ด ์ผ์ ธ ์์ผ๋ฉด .ibd ํ์ผ์ ์ฌ์์ฑํด OS ๋ ๋ฒจ๊น์ง ๊ณต๊ฐ์ ๋ฐํํ๋ค. 3.2GB โ 103MB.
๋ถ์ ํ ์ด๋ธ
DELETE FROM g5_board_new WHERE bo_table='qa';
DELETE FROM g5_board_file WHERE bo_table='qa';
UPDATE g5_board SET bo_count_write=5 WHERE bo_table='qa';
TRUNCATE TABLE g5_uniqid; -- ์ค๋ณต๋ฐฉ์ง์ฉ ์์ ๋ฐ์ดํฐ
TRUNCATE TABLE g5_point; -- ํฌ์ธํธ ๋ฏธ์ฌ์ฉ ์๋ถ๋ถ ์ญ์ ๊ฐ ํ์ํ ๊ฒ์ํ
์ ์ ๊ธ์ด ์์ฌ ์์ผ๋ฉด wr_id ๊ฒฝ๊ณ๋ฅผ ํ์ธํ๊ณ ์๋ฅธ๋ค.
SELECT wr_id, mb_id, wr_name, wr_datetime, LEFT(wr_subject,40) FROM g5_write_people ORDER BY wr_id;
SELECT COUNT(*) FROM g5_write_people WHERE wr_id >= 47; -- ๋จผ์ ์ธ์ด๋ณธ๋ค
DELETE FROM g5_write_people WHERE wr_id >= 47;
DELETE FROM g5_board_new WHERE bo_table='people' AND wr_id >= 47;
DELETE FROM g5_board_file WHERE bo_table='people' AND wr_id >= 47;
UPDATE g5_board SET bo_count_write =
(SELECT COUNT(*) FROM g5_write_people WHERE wr_is_comment=0)
WHERE bo_table='people';โ ๏ธ ์ญ์ ์ ๋ฐ๋์
SELECT COUNT(*)๋ก ์์ ๊ฑด์๋ฅผ ํ์ธํ๊ณ ์คํํ๋ค. ์ด ์ต๊ด ํ๋๊ฐ ์ ์ ๋ฐ์ดํฐ๋ฅผ ์งํค๋ ๋ง์ง๋ง ๋ฐฉ์ด์ ์ด๋ค.
๋ฌผ๋ฆฌ ํ์ผ
DB๋ง ์ง์ฐ๋ฉด ์ด๋ฏธ์ง๊ฐ ์๋ฒ์ ๋จ์ URL๋ก ์ง์ ์ด๋ฆฌ๊ณ ๊ฒ์์์ง์๋ ์กํ๋ค.
๊ทธ๋๋ณด๋ ์
๋ก๋ ํ์ผ๋ช
์ {์๋}_{๋๋ค}_{ํด์}.ํ์ฅ์ ๊ตฌ์กฐ์ธ๋ฐ, ๊ฐ์ ๊ฒ์๊ธ ๋ฌถ์์ ์ ์๋๊ฐ ๊ฐ๋ค. ์ ์ ํ์ผ๊ณผ ์คํธ ํ์ผ์ ์๋๋ฅผ ๋์กฐํ๋ฉด ์ ํํ ๊ณจ๋ผ๋ผ ์ ์๋ค.
# ๊ธฐ๊ฐ์ผ๋ก ํ๋ณด ์ถ์ถ ํ ์๋ ๋ชฉ๋ก ํ์ธ
find /์ฌ์ดํธ๊ฒฝ๋ก/data/file/people -type f -newermt "2026-07-10" -printf "%f\n" \
| sed 's/^thumb-//' | cut -d_ -f1 | sort -u
# ์ ์ ์๋๊ฐ ์์ด์ง ์์๋์ง ๊ฒ์ฆ (0์ด์ด์ผ ํจ)
find /์ฌ์ดํธ๊ฒฝ๋ก/data/file/people -type f -newermt "2026-07-10" \
| grep -cE "์ ์์๋1|์ ์์๋2|์ ์์๋3"
# ์ญ์
find /์ฌ์ดํธ๊ฒฝ๋ก/data/file/people -type f -newermt "2026-07-10" -deletethumb- ์ ๋ ํ์ผ์ ์กฐํ ์ ์๋ ์ฌ์์ฑ๋๋ฏ๋ก ์ง์๋ ๋ฌด๋ฐฉํ๋ค. ๋ค๋ง ๊ฐ ์
๋ก๋ ํด๋์ **index.php**๋ ๋ฐ๋์ ๋จ๊ธด๋ค. ๋๋ ํ ๋ฆฌ ๋ฆฌ์คํ
๋ฐฉ์ง ํ์ผ์ด๋ค.
์ ๋ ์ญ์ ๊ฐ ๋ถ๋ด์ค๋ฌ์ฐ๋ฉด ์ญ์ ๋์ ์ด๋์ด ์์ ํ๋ค.
mkdir -p ~/removed_files
find /์ฌ์ดํธ๊ฒฝ๋ก/data/file/qa -type f ! -name "index.php" -exec mv {} ~/removed_files/ \;๊ณ์ ์ ๋ฆฌ์ ์ฌ๋ฐ ๋ฐฉ์ง
DELETE FROM g5_member WHERE mb_id LIKE 'zx%' AND mb_name='๊น๋ํ';
DELETE FROM g5_member WHERE mb_id IN ('๋ด๊ณ์ 1','๋ด๊ณ์ 2', ...);
-- ํต์ฌ
UPDATE g5_board SET bo_write_level=10, bo_use_captcha=1
WHERE bo_table IN ('qa','people','email','free');๊ทธ๋๋ณด๋5์๋ ํ์๊ฐ์ ์ ๋๋ ์ค์ ์ปฌ๋ผ์ด ์๋ค. ๊ฐ์ ์์ฒด๋ฅผ ๋ง์ผ๋ ค๋ฉด ํ์ผ์ ๋นํ์ฑํํ๋ค.
cd /์ฌ์ดํธ๊ฒฝ๋ก/bbs
mv register.php register.php.disabled
mv register_form.php register_form.php.disabledํ์ โ ๊ฒ์์์ง ์์ธ ์ ๋ฆฌ
๊ทธ๋๋ณด๋์ soft 404 ๋ฌธ์
์ญ์ ๋ ๊ธ URL์ ์ ๊ทผํ๋ฉด โ๊ธ์ด ์กด์ฌํ์ง ์์ต๋๋คโ ํ๋ฉด์ด ๋จ์ง๋ง, HTTP ์ํ ์ฝ๋๋ 200์ด๋ค.
curl -s -o /dev/null -w "%{http_code}\n" "https://๋๋ฉ์ธ/bbs/board.php?bo_table=qa&wr_id=12345"๊ตฌ๊ธ์ ์ด๊ฑธ soft 404๋ก ์ถ์ ์ฒ๋ฆฌํ๋๋ฐ, ๋ช ์์ 404/410๋ณด๋ค ์์ธ ์ ๊ฑฐ๊ฐ ํจ์ฌ ๋๋ฆฌ๋ค. 61๋ง ๊ฐ๋ฉด ์ฒด๊ฐ ์ฐจ์ด๊ฐ ํฌ๋ค.
410 Gone ์ฒ๋ฆฌ
์ฐจ๋จ์ ์ผ๋ auto_prepend_file์ ๊ทธ๋๋ก ์ฌํ์ฉํ ์ ์๋ค.
<?php
if (strpos($_SERVER["SCRIPT_NAME"], "/adm/") !== false) return;
if (!isset($_GET["bo_table"])) return;
$bo = $_GET["bo_table"];
$wr = isset($_GET["wr_id"]) ? (int)$_GET["wr_id"] : 0;
$gone = ($bo === "qa") || ($bo === "people" && $wr >= 47 && $wr <= 68);
if (!$gone) return;
header("HTTP/1.1 410 Gone");
header("X-Robots-Tag: noindex");
header("Content-Type: text/html; charset=utf-8");
echo "<h1>์ญ์ ๋ ํ์ด์ง์
๋๋ค</h1>";
exit;/adm/ ๊ฒฝ๋ก๋ ์ ์ธํด์ผ ๊ด๋ฆฌ์ ํ์ด์ง์์ ํด๋น ๊ฒ์ํ์ ๋ค๋ฃฐ ๋ ๊ฑธ๋ฆฌ์ง ์๋๋ค.
์ ์ฉ ํ ๊ฒ์ฆ:
curl -s -o /dev/null -w "qa๊ธ: %{http_code}\n" "https://๋๋ฉ์ธ/bbs/board.php?bo_table=qa&wr_id=12345"
curl -s -o /dev/null -w "๋ฉ์ธ: %{http_code}\n" "https://๋๋ฉ์ธ/"
curl -s -o /dev/null -w "์ ์๊ฒ์ํ: %{http_code}\n" "https://๋๋ฉ์ธ/bbs/board.php?bo_table=people"๊ธฐ๋๊ฐ 410 / 200 / 200. ๋ค ๋ ๊ฐ๊ฐ 200์ด ์๋๋ฉด ์ฆ์ .user.ini๋ฅผ ์ญ์ ํ๋ค.
โ ๏ธ robots.txt๋ก ์ฐจ๋จํ๋ฉด ์ญํจ๊ณผ๋ค. ํฌ๋กค๋ฌ๊ฐ ์ ๊ทผํ์ง ๋ชปํ๋ฉด 410 ์ ํธ ์์ฒด๋ฅผ ๋ฐ์ง ๋ชปํด ์์ธ์ด ๋ ์ค๋ ๋จ๋๋ค. ์ญ์ ๋ URL์ ํฌ๋กค๋ง์ ํ์ฉํด์ผ ํ๋ค.
heredoc ๋ถ์ฌ๋ฃ๊ธฐ ์ฌ๊ณ ์ฃผ์
ํฐ๋ฏธ๋์ heredoc(cat > file << 'EOF')์ ๋ถ์ฌ๋ฃ๋ค๊ฐ ์๋ถ๋ถ์ด ์๋ ค ํ์ผ์ด ๊นจ์ง๋ ์ผ์ด ์ค์ ๋ก ์์๋ค. <?php ์์ ํ
์คํธ๊ฐ ๋ค์ด๊ฐ๋ฉด ํค๋ ์ ์ก์ด ๊นจ์ง๋ฉด์ ์ฌ์ดํธ ์ ์ฒด๊ฐ ๋ง๊ฐ์ง๋ค.
# ๋ถ์ฌ๋ฃ๊ธฐ ์ฌ๊ณ ๋ฐฉ์ง: printf๋ก ํ ์ค์ฉ
printf '%s\n' '<?php' > _gone.php
printf '%s\n' 'if (!isset($_GET["bo_table"])) return;' >> _gone.php
# ์ ์ฉ ์ ๋ฐ๋์ ๊ฒ์ฆ
php -l _gone.php # No syntax errors detected์ค์ ํ์ผ์ ๋ง๋ค๊ธฐ ์ ์ ๋์ PHP ํ์ผ๋ถํฐ ๋ฌธ๋ฒ ๊ฒ์ฆํ๋ค. ์์๋ฅผ ์งํค๋ฉด ์ฌ์ดํธ๊ฐ ๊นจ์ง ์ผ์ด ์๋ค.
๋ฐฑ์ ํ์ผ ์ฒ๋ฆฌ
DB ๋คํ์๋ ํ์ ์ ๋ณด์ ์ ์ ์ค์ ์ด ํ๋ฌธ์ผ๋ก ๋ค์ด ์๋ค. ์ฌ์นจํด ์ ๊ทธ๋๋ก ์ ์ถ๋๋ค. ๋ก์ปฌ๋ก ์ฎ๊ธฐ๊ณ ์๋ฒ์์๋ ์ญ์ ํ๋ค.
# ๋ฌด๊ฒฐ์ฑ ๋์กฐ (์๋ฒ)
md5sum ~/backup_20260813.tar.gz
# PowerShell
# Get-FileHash -Algorithm MD5 H:\backup\backup_20260813.tar.gz
rm ~/backup_20260813.tar.gz ~/db_20260813.sql๋ณด๊ด์ 3~6๊ฐ์. ์นจํด ๊ธฐ๋ก์ด์ ๋๋๋ฆฌ๊ธฐ์ฉ์ด๋ค.
๋ชจ๋ํฐ๋ง ์ฟผ๋ฆฌ
-- ์ ๊ท ์ ์
ํ์ธ
SELECT COUNT(*) FROM g5_write_people WHERE wr_datetime > '2026-08-14';
-- ๊ฒ์ํ ๊ถํ ์ ๊ธฐ ์ ๊ฒ
SELECT bo_table, bo_subject, bo_write_level, bo_use_captcha, bo_count_write FROM g5_board;
-- ์ ๊ท ํ์
SELECT mb_id, mb_name, mb_datetime FROM g5_member ORDER BY mb_datetime DESC LIMIT 10;# ์ ๊ท ์
๋ก๋ ํ์ผ
find /์ฌ์ดํธ๊ฒฝ๋ก/data/file -type f -newermt "2026-08-14" | wc -l์ ๋ฆฌ
๋์ ์ฒดํฌ๋ฆฌ์คํธ
- ๋
ธ์ถ ์ฐจ๋จ (
.user.ini+ 503) - ํ์ผยทDB ๋ฐฑ์ ๋ฐ ๊ฒ์ฆ
- ์น์ ธ 5์ข ์ง๋จ
-
information_schema๋ก ๊ท๋ชจ ํ์ -
g5_board๋ก ์นจํฌ ๊ฒฝ๋ก ํ์ -
TRUNCATE๊ธฐ๋ฐ ๋๋ ์ ๋ฆฌ - ๋ฌผ๋ฆฌ ํ์ผ ์ ๋ฆฌ
- ๋ด ๊ณ์ ์ญ์ , ๊ฒ์ํ ๊ถํ ์ํฅ
- 410 Gone ์ฒ๋ฆฌ
- PHP 7.4 โ 8.x (root ํ์)
- KISA ๋ฌด๋ฃ ์ ๊ฒ ์ ์ฒญ
- ๋์ผ ์๋ฒ ํ ์ฌ์ดํธ ์ ๊ฒ
๋จ๋ ๊ตํ ์
๊ฒ์ํ, ํผ์ฒ๋ผ ์ธ๋ถ์์ ์ง์
ํ ์ ์๋ ๊ฒ๋ค์ ๋ฏธ๋ฆฌ ์ ๋ฆฌ๋ฅผ ํด์ผ ํ๋ค. ๊ถํ์ ์ ํํด๋๋ , ๊ฒ์ํ์ ์์ ๋ , ์ธ๋ถ ์ ๊ทผ ๊ฒฝ๋ก๋ฅผ ํ์ธ ํด์ผ ํ๋ค. bo_write_level๋ง ๋ฎ์ถฐ๋ ๋งํ์ง๋ง, ์ ์ด์ ์กด์ฌํ์ง ์๋ ๊ฒ์ํ์ ํ์ ์ด ๋ ์ ์๋ค.
EOL ๋ฒ์ ์ ์ฐ๊ณ ์๋ค๋ฉด ๊ทธ๊ฒ ์ง์ง ๋ฆฌ์คํฌ๋ค. ์ด๋ฒ์ ์ด๋ฆฐ ๊ฒ์ํ์ด ๋ฌธ์ ์์ง ์ทจ์ฝ์ ์ด ๋ซ๋ฆฐ ๊ฒ ์๋์๋ค. pentest0421 ๊ณ์ ์ด ์์๋ค๋ ๊ฑด ๋๊ตฐ๊ฐ ์ค์ ๋ก ์ฐ๋ฌ๋ดค๋ค๋ ๋ป์ด๊ณ , PHP 7.4๋ก๋ ๋ค์์ ์ฅ๋ดํ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ sudo ๊ถํ. ๋ก๊ทธ๋ฅผ ๋ชป ๋ด์ ์ต์ด ์ ์
๊ฒฝ๋ก์ ์ธ๋ถ๋ ๋๋ด ํ์ธํ์ง ๋ชปํ๋ค. ์๋ฒ๋ฅผ ์ง์ ์ด์ํ๋ค๋ฉด root ์ ๊ทผ ๊ฒฝ๋ก๋ ํ๋ณดํด๋๋ ๊ฒ ๋ง๋ค.
์ด๋ฒ ๊ฑด์ ์๋ฒ๋ฅผ ๊ฐ์์์ ์ผ์ด ์๋์๋ค. ์ค์ ๋ช ๊ฐ์ ์ฟผ๋ฆฌ ๋ช ์ค์ด๋ฉด ๋๋๋ ์ผ์ด์๊ณ , ๊ฑฐ๊ธฐ๊น์ง ๊ฐ๋ ๋ฐ ํ๋ฃจ๊ฐ ๊ฑธ๋ ธ๋ค. ๊ทธ ํ๋ฃจ์ ๋๋ถ๋ถ์ โ๋ญ๊ฐ ๋ซ๋ฆฐ ๊ฑด๊ฐ, ์๋๋ฉด ๊ทธ๋ฅ ์ด๋ ค ์๋ ๊ฑด๊ฐโ๋ฅผ ํ๋จํ๋ ๋ฐ ์ผ๋ค.
๊ทธ ๊ตฌ๋ถ์ด ๋จผ์ ๋ค. ์น์ ธ 5์ข ์ง๋จ์ด ์ ๋ถ ๊นจ๋ํ๊ฒ ๋์ค๋ ์๊ฐ ๋์ ๋ฐฉ๋ฒ์ด ์์ ํ ๋ฐ๋๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋๋ณด๋๋ฅผ ์ด์ ์ค์ด๋ผ๋ฉด SELECT bo_table, bo_subject, bo_write_level, bo_use_captcha, bo_count_write FROM g5_board; ํ ์ค๋ง ๋๊ฒจ๋ณด์๊ธธ. ๋ฏธ์ฌ์ฉ ๊ฒ์ํ์ด write_level 1๋ก ๋จ์ ์๋ค๋ฉด ์ค๋ ๋ฐ๋ก ํ์ธํด ๋ณด์๊ธธ!!

