iT邦幫忙

2026 iThome 鐵人賽

DAY 21
0

今天,我們將探討敏感資訊洩漏的常見類型、實際觸發情境與現代化防禦策略。

在 OWASP Top 10 中,「安全性設定錯誤(Security Misconfiguration)」與「敏感資料暴露(Sensitive Data Exposure)」長期榜上有名。許多資安事故的起因,往往不是後端演算法出現漏洞,而是伺服器環境的不當設定、測試檔案未清理,或瀏覽權限未關閉,讓攻擊者直接對關鍵設定檔或系統原始碼存取。

什麼是敏感資訊洩漏?

敏感資訊洩漏(Sensitive Information Disclosure)是指系統因設定缺失或控管不當,將原本僅限內部使用的敏感資料暴露在網路上,允許未授權的外部人員直接存取或讀取。

常見洩漏的資料包含:

  • 系統憑證: API 金鑰、資料庫帳密、JWT Secret Key、AWS / GCP 存取金鑰。
  • 原始碼與版本控制: .git 目錄、.env 環境變數檔、config.php 備份檔。
  • 伺服器架構資訊: 詳細的 Debug 堆疊追蹤(Stack Trace)、伺服器版本 Header、系統架構圖。
  • 個人隱私資料: 未加密的用戶身分證字號、信用卡號、交易紀錄、內部日誌(Logs)。

常見洩漏範例

1. 目錄瀏覽漏洞

當Web伺服器收到一個指向特定檔的請求且該資料夾內沒有預設的index.html或index.php時,若伺服器啟用了「目錄索引」功能,伺服器就會自動渲染出該目錄下所有檔案的清單。

2. 版本控制與配置文件洩漏

開發人員在開發時,常使用.env儲存環境變數(如資料庫密碼),或使用 Git 進行版本控制(產生 .git 資料夾)。部署到線上環境時,若沒有設定HTTP存取權限,直接把整份專案目錄複製到Web Root(如 /var/www/html/),那麼外部任何人都能透過瀏覽器直接請求這些隱藏檔案。

攻擊者使用自動化掃描工具發起請求:
[https://shop.example.com/.env](https://shop.example.com/.env)。

Web 伺服器將 .env 當作普通純文字檔直接回傳,內容包含:

程式碼片段
DB_HOST=127.0.0.1
DB_USER=root
DB_PASS=P@ssw0rd2026!
STRIPE_SECRET_KEY=sk_live_51Nx... (第三方支付金鑰)
AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLE

攻擊者拿到 Stripe 與 AWS 金鑰後,利用企業的AWS帳號購買加密貨幣,並扣刷企業的第三方支付管道,造成數百萬元的損失。

3. 詳細錯誤訊息與 Debug Mode(Verbose Error / Stack Trace)

在開發階段,詳細的錯誤訊息有助於工程師排查問題;但若直接將Debug模式部署到線上環境,一旦程式發生 Exception(例如 SQL 語法錯誤、Null Pointer),伺服器就會將的程式碼堆疊、資料庫結構、內部檔案路徑直接渲染在大眾面前。

在登入某個系統時輸入了特殊的單引號 '。系統沒有顯示系統繁忙,而是直接跳出全螢幕的錯誤頁面:

DatabaseQueryException in DB.php line 142:
SQLSTATE[42000]: Syntax error near '''' at line 1
Query: SELECT * FROM users WHERE username = ''' AND status = 'active'
Server Path: /var/www/project_v2_release/app/Services/AuthService.php
Framework: Laravel v10.2.0 (PHP v8.2.10)

這裡就已經洩漏了資料庫裡的機密包含以下內容:

  • 資料庫架構: 從上面可以看出資料表名稱為 users、欄位有 username 與 status。
  • 伺服器絕對路徑: /var/www/project_v2_release/>。
  • 軟體版本資訊: 知道確切的 PHP 與 Framework 版本,攻擊者可針對該版本的已知 CVE 漏洞發起攻擊。

不安全連線:

# Nginx 設定檔:未禁止敏感檔案存取,且啟用了目錄瀏覽
server {
    listen 80;
    server_name example.com;
    root /var/www/my_project;

    # 不安全:啟用目錄列表
    autoindex on;

    # 未對 .env、.git 等隱藏檔案進行阻斷!
}
# Python / Flask 不安全範例:Production 開啟 Debug Mode
from flask import Flask
app = Flask(__name__)

# 不安全:上線環境開啟 debug=True,會洩漏完整的 Stack Trace 甚至開啟控制台!
if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0', port=80)

安全連線(加上權限限制):

# Nginx 安全設定範例
server {
    listen 80;
    server_name example.com;
    
    # 建議:Web Root 僅指向 public 目錄,將 .env 與 .git 放在 Web Root 之外
    root /var/www/my_project/public;

    # 安全 1:全域關閉目錄瀏覽
    autoindex off;

    # 安全 2:明確封鎖所有以句點開頭的隱藏檔案(如 .env, .git, .htaccess)
    location ~ /\. {
        deny all;
        access_log off;
        log_not_found off;
    }

    # 安全 3:隱藏 Nginx 版本號 Header
    server_tokens off;
}
# Python / Flask 安全範例:全域例外處理與客製化錯誤頁面
from flask import Flask, render_template
import logging

app = Flask(__name__)
app.config['DEBUG'] = False  # 確保 Production 關閉 Debug Mode

@app.errorhandler(Exception)
def handle_unexpected_error(error):
    # 將詳細的 Error Stack Trace 紀錄在內部 Log 中,不對外公開
    logging.error(f"Internal Server Error: {error}", exc_info=True)
    
    # 對使用者僅回傳友善且無敏感資訊的通用錯誤頁面
    return render_template("500.html"), 500

4. 最小權限佈署原則:Web Root 分離架構

要徹底防止敏感設定檔洩漏,最佳的架構設計是實施 「Web Root 目錄分離」:

/var/www/my_project/           <── 專案根目錄(外界不可存取)
├── .env                       <── 敏感設定檔 (安全)
├── .git/                      <── 版本控制目錄 (安全)
├── app/                       <── 後端核心程式碼 (安全)
├── config/                    <── 設定檔 (安全)
└── public/                    <── Web Root (Nginx/Apache 的 Document Root)
    ├── index.php              <── 唯一的入口點
    ├── css/
    └── js/

將 Web 伺服器的root嚴格限制在public/資料夾內,這樣即使外部使用者嘗試請求,瀏覽器與 Web 伺服器也會自動規範化路徑,完全無法讀取到 public/ 上層的任何敏感檔案。


上一篇
Day 20:Web 漏洞––跨站請求偽造(CSRF)與 Unauthorized Action
下一篇
Day 22:惡意程式威脅----勒索軟體(Ransomware)加密機制與雙重脅迫
系列文
新手開發者的資安第一課:30 天搞懂 OWASP Top 10 與常見漏洞 共 26 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言