iT邦幫忙

2024 iThome 鐵人賽

DAY 12
1
Security

資安這條路:系統化學習網站安全與網站滲透測試系列 第 12

資安這條路:Day 12 探索 ORM 機制與網站檔案上傳漏洞

  • 分享至 

  • xImage
  •  

學習 ORM 與上傳檔案漏洞

ORM

ORM 是什麼

ORM(Object-Relational Mapping,物件關聯對應)是一種程式設計技術,用來在物件導向程式語言與關聯式資料庫之間建立對應的關係。

透過 ORM,開發者可以以物件的方式來操作資料庫中的資料,而不需要直接撰寫 SQL 查詢語句。

ORM 工具會自動將程式中的物件屬性對應到資料庫的資料表與欄位,簡化資料庫操作的流程。

重點

  1. 建立資料庫的對應關係
  2. 可使用物件操作資料庫資料
  3. 不需要寫 SQL 查詢與據
  4. 自動化對應資料表與資料欄位
  5. 簡化資料庫操作

為什麼要使用 ORM

使用 ORM 的原因如下:

  1. 提高開發效率:使用 ORM 工具,開發者可以專注於業務邏輯,而不用花太多時間在撰寫複雜的 SQL 語句上。透過自動化的資料庫映射,ORM 減少了程式碼重複,並且讓開發變得更直觀。
  2. 跨資料庫兼容性:大多數的 ORM 工具支援多種關聯式資料庫,如 MySQL、PostgreSQL、SQLite 等。這讓程式可以更容易在不同的資料庫之間切換,而不需要重寫查詢語句。
  3. 可讀性與維護性:ORM 工具提供的 API 讓程式碼更具可讀性,降低了程式碼中出現錯誤的機會,也讓維護變得更加容易。
  4. 資料驗證:ORM 通常內建資料驗證功能,可以確保資料在存入資料庫前符合特定的條件與規範。

ORM 會有資安風險嗎

ORM 雖然提供了很多便利性,但在使用上可能仍然存在一些資安風險,包括:

  1. SQL Injection(SQL 注入):雖然 ORM 工具預設提供了防範 SQL 注入的機制,但如果開發者在操作 ORM 時沒有使用預防措施(如使用不當的原始 SQL 查詢功能),還是可能會暴露在 SQL 注入攻擊的風險之中。
  2. 過度信任 ORM 自動生成的查詢:有時 ORM 生成的 SQL 查詢語句可能不是最佳化的,可能導致性能問題,甚至可能在某些情況下暴露敏感資料。
  3. 資料庫結構變更風險:如果沒有正確管理資料庫遷移(migration),ORM 在操作資料庫時可能會破壞現有的資料或結構,導致資料損失或系統不穩定。

因此,開發者在使用 ORM 時,應保持對安全性的關注,並確保遵循良好的程式開發實踐。

Node.js Sequelize

Sequelize 是 Node.js 中一個常見的 ORM 工具,它支援多種資料庫,如 MySQL、PostgreSQL、SQLite 和 MariaDB。Sequelize 提供了簡單易用的 API,讓開發者可以輕鬆地操作資料庫,進行 CRUD 操作(建立、讀取、更新、刪除)。

Sequelize 的一些特點包括:

  1. 模型定義:Sequelize 允許開發者以物件模型的方式定義資料表結構,並自動處理資料表之間的關聯性(如一對多、多對多關聯)。
  2. 查詢生成:Sequelize 自動生成 SQL 查詢語句,開發者不需要直接撰寫 SQL,大大減少了錯誤發生的可能性。
  3. 資料驗證:Sequelize 支援多種資料驗證規則,確保資料在進入資料庫前符合預設規範。
  4. 遷移工具:Sequelize 提供了資料庫遷移工具,幫助管理資料庫結構的變更。

網站上傳功能情境

什麼時候會有上傳功能

網站的上傳功能常見於下列情境:

  1. 使用者上傳檔案:例如使用者在社群媒體上傳個人照片、文件或影片等檔案。
  2. 表單提交附件:像是線上報名表或聯繫表單中,允許使用者上傳相關的文件作為補充資料,例如履歷表、申請文件等。
  3. 儲存內容資料:企業或系統管理者上傳報表、備份檔案、產品圖片、手冊等。
  4. 檔案共享平台:如 Google Drive、Dropbox 等,允許使用者上傳檔案並與他人分享。
  5. 系統更新:例如管理員在網站後台上傳更新檔案或資料,以維護網站功能。

會有什麼風險

檔案上傳功能常伴隨一定的資安風險,主要風險包括:

  1. 惡意程式上傳:攻擊者可能上傳包含惡意程式碼的檔案(如木馬程式、Web shell),如果檔案未被正確過濾或檢查,攻擊者可能會利用此程式來入侵系統。
  2. 檔案類型偽裝:攻擊者可以透過修改檔案副檔名,將危險的可執行檔偽裝成無害的檔案格式(如將 .php 程式碼檔案偽裝成 .jpg 圖片檔),一旦被伺服器執行,可能導致網站被攻擊。
  3. 資料洩露:如果上傳的檔案包含機密資訊,如企業內部文件或使用者隱私資料,這些資料若未妥善保護,可能會被未經授權的使用者存取或下載,導致資料洩露。
  4. DDoS 攻擊:攻擊者可以上傳過大或大量檔案,試圖耗盡伺服器資源,造成系統崩潰或拒絕服務(Denial of Service)。

攻擊面

  1. 任意上傳惡意檔案
  2. 任意下載他人檔案
  3. 取得敏感資料內容
  4. upload 上傳資料夾任意開放
  5. 上傳檔案未進行修改檔案名稱

實作

程式碼細項

https://github.com/fei3363/ithelp_web_security_2024/commit/cb4f2e6c4a6850285450e761bb7b596a5852d83f

目標

  1. 實作檔案上傳和管理系統
    • 後端API
    • 資料庫操作
    • 前端界面
  2. 處理 ORM 相關設定
  3. 處理 gitignore 設定

檔案細項

  1. .gitignore
    • 新增 upload/
    • 避免將上傳的檔案加入版本控制
  2. docker-compose.yml
    • 在 web 服務的指令新增
    • npm run db:migrate
      • 確保在啟動應用前運行資料庫遷移
  3. web/Dockerfile
    • 安裝 sequelize-cli、PostgreSQL 和 MongoDB 相關套件。
    • 建立 config 目錄
      • 為 ORM Sequelize 設定而準備
  4. web/config/config.js
    • 新增 Sequelize 設定檔案
    • 定義開發環境的資料庫連接設定
  5. web/controllers/fileController.js
    • 實現檔案上傳、查詢、更新和刪除等功能的控制器。
  6. web/db/postgres.js
    • 更新資料庫連接設定
    • 新增 Sequelize 連線
    • 新增測試連接功能
  7. web/migrations/20240926142740-create-file-table.js
    • 建立 file 表的資料庫遷移檔案
  8. web/models/file.model.js
    • 定義 File 模型
    • 對應資料庫中的 file 表
  9. web/package.json
    • 新增相依性
      • sequelize
      • sequelize-cli
      • multer
    • 新增 db:migrate 腳本
  10. web/routes/file.routes.js
    • 定義檔案相關的路由和處理邏輯
  11. web/server.js
    • 整合檔案路由
    • 新增靜態檔案服務
  12. web/views/upload.ejs
    • 建立檔案上傳和管理的前端頁面

演練

  1. 進入頁面
  2. 查看訊息,可看到真實儲存路徑
    image
  3. 觀察刪除 API
    • 沒有進行任何驗證可直接刪除
      image

總結

本篇文章深入探討了 ORM 技術的運作原理、使用優勢以及其潛在的資安風險,接著闡述了網站檔案上傳功能常見的攻擊面與風險。在開發過程中,ORM 大大簡化了資料庫操作,但同時應重視其潛在的安全問題。此外,網站上傳功能是攻擊者常見的進攻點,必須做好文件類型和大小限制,以及上傳資料的驗證,避免可能的攻擊。

小試身手

題目1:
ORM 是什麼的簡稱?

  • A. Object-Reality Mapping
  • B. Object-Relational Mapping
  • C. Object-Resource Mapping
  • D. Object-Retrieve Mapping

正確答案: B
解析: ORM 是 Object-Relational Mapping,意指將物件導向程式中的物件映射到關聯式資料庫的技術。

題目2:
使用 ORM 的主要優勢不包括哪一項?

  • A. 提高開發效率
  • B. 簡化資料庫操作
  • C. 避免所有安全風險
  • D. 增強程式碼可讀性

正確答案: C
解析: 雖然 ORM 簡化操作,但仍需注意安全風險,特別是 SQL 注入等問題。

題目3:
以下何者為常見的 ORM 工具?

  • A. MongoDB
  • B. Sequelize
  • C. GraphQL
  • D. Redis

正確答案: B
解析: Sequelize 是 Node.js 中常見的 ORM 工具,用來操作 SQL 資料庫。

題目4:
哪個風險是與網站檔案上傳功能有關的?

  • A. SQL 注入
  • B. 檔案類型偽裝
  • C. 內部連線洩漏
  • D. 缺少驗證

正確答案: B
解析: 攻擊者常透過偽裝檔案類型進行攻擊,例如將 .php 檔案偽裝成 .jpg

題目5:
為什麼 ORM 可能帶來性能問題?

  • A. ORM 會直接運行資料庫中的惡意程式碼
  • B. ORM 有時生成的查詢語句不是最佳化的
  • C. ORM 無法支援大多數的資料庫
  • D. ORM 必須依賴手動編寫查詢語句

正確答案: B
解析: ORM 自動生成的查詢語句有時並非最佳化,可能會影響系統性能。

實作清單與參考資源

實作清單

  1. 建立 ORM 模型:使用 Sequelize 定義資料庫結構。
  2. 檔案上傳系統
    • 檔案驗證:設定允許上傳的檔案類型與大小。
    • 檔案存放:將上傳的檔案儲存在專門的目錄下,並確保目錄的安全性。
  3. 防範措施
    • 實作防止惡意程式碼的掃描機制。
    • 實作檔案名稱隨機化以避免名稱衝突。

參考資源


上一篇
資安這條路:Day 11 從文章過濾惡意輸入了解 SQL injection 自動化工具 SQLmap
下一篇
資安這條路:Day 13 探索 NoSQL injection 以及防範措施
系列文
資安這條路:系統化學習網站安全與網站滲透測試30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言