๐Ÿ”ง ๊ทธ๋ˆ„๋ณด๋“œ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 grep

Nginx๋งŒ ๋–  ์žˆ๋‹ค๋ฉด .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" -delete

thumb- ์ ‘๋‘ ํŒŒ์ผ์€ ์กฐํšŒ ์‹œ ์ž๋™ ์žฌ์ƒ์„ฑ๋˜๋ฏ€๋กœ ์ง€์›Œ๋„ ๋ฌด๋ฐฉํ•˜๋‹ค. ๋‹ค๋งŒ ๊ฐ ์—…๋กœ๋“œ ํด๋”์˜ **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๋กœ ๋‚จ์•„ ์žˆ๋‹ค๋ฉด ์˜ค๋Š˜ ๋ฐ”๋กœ ํ™•์ธํ•ด ๋ณด์‹œ๊ธธ!!