iT邦幫忙

2025 iThome 鐵人賽

DAY 10
0
Modern Web

AI 驅動的 Web 資安新時代系列 第 10

Day10 - API 安全:Agent 模擬攻擊 + 自動生成防護建議

  • 分享至 

  • xImage
  •  

API 已經是現代服務的核心,無論是手機 App、前端網站、甚至 IoT,都靠 API 互通。

但這也代表 駭客最愛的攻擊目標,因為只要 API 有一點點漏洞,就可能被利用來竊取資料、注入惡意指令。

人工檢測太慢,因此今天示範如何用 AI Agent 模擬攻擊 + 自動生成防護建議


為什麼要用 AI Agent?

  • 自動化測試 → AI 可以快速嘗試常見惡意 Payload(SQLi / XSS / CSRF)。
  • 智能分析 → 自動檢查 API 回應是否有異常訊息(錯誤碼、DB 報錯、HTML script)。
  • 防護建議 → 不只是找到問題,還能即時給出修補建議。

AI Agent 分工

  • 攻擊模擬模組
    • 發送惡意 Payload 測試 API
    • 例如:
      • "' OR 1=1 --" → 測試 SQL Injection
      • <script>alert(1)</script> → 測試 XSS
      • 空 JSON {} → 測試弱驗證
  • 回應收集模組
    • 收集 API 回應內容 (status code, response body)
    • 檢查是否有:
      • DB Error 訊息
      • HTML <script> 標籤
      • 不合理的 200 / 401 狀態碼
  • 弱點分析模組
    • 使用 Gemini AI 分析回應
    • 判斷是否存在漏洞:
      • SQL Injection
      • XSS
      • 不安全 Header (缺少 CSP / HSTS)
      • 身分驗證過於寬鬆
  • 防護建議模組
    • 依據弱點自動生成修補建議
    • 例如:
      • 使用 Prepared Statement 防止 SQL Injection
      • 加上 Content-Security-Policy (CSP) 防止 XSS
      • 強制 JWT 驗證 / OAuth2 來強化登入流程
      • API Response 加上 安全標頭 (HSTS, X-Frame-Options, SameSite Cookie)

Server - 模擬 API

1、初始化伺服器

建立基本的 Express 伺服器,並啟用 express.json() 讓它能解析 JSON body

import express from "express";

const app = express();
app.use(express.json());

2、模擬一個有漏洞的 API

這裡刻意留下兩個漏洞:

  • SQL Injection:當密碼是 ' OR 1=1 -- 時,伺服器會回傳登入成功。
  • XSS:如果帳號含有 <script>,伺服器會直接輸出。
app.post("/api/login", (req, res) => {
   const { username, password } = req.body;

   // 模擬 SQL Injection 風險 (直接拼接字串,錯誤示範)
   if (username === "admin" && password === "' OR 1=1 --") {
      return res.json({ message: "登入成功 (SQLi 模擬)" });
   }

   // 模擬 XSS 風險 (回應未做轉義)
   if (username && username.includes("<script>")) {
      return res.send(`<h1>歡迎 ${username}</h1>`);
   }

   res.status(401).json({ error: "登入失敗" });
});

3、啟動伺服器

啟動在本機 3000 port,給後續的 agent.js 測試使用

app.listen(3000, () => {
   console.log("測試 API 伺服器已啟動 ");
});

AI Agent

測試目標 API

指定測試目標,就是剛剛建立的 /api/login

const apiUrl = "http://localhost:3000/api/login";

惡意 payload 測試

const payloads = [
  { username: "admin", password: "' OR 1=1 --" },      // SQL Injection
  { username: "<script>alert(1)</script>", password: "123" } // XSS
];

攻擊模擬 - 送出 API 請求

async function attackApi(payload) {
   const res = await fetch(apiUrl, {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify(payload)
   });

   const text = await res.text();
   return { payload, status: res.status, response: text };
}

偵測分析 - 交給 Gemini 判斷

async function detectVulnerabilities(results) {
   const prompt = `
   你是一個資安檢測 Agent,請分析以下 API 回應結果,指出可能的弱點:
   ${JSON.stringify(results, null, 2)}
   請輸出「弱點類型 / 偵測結果」的列表。
   `;
   const r = await model.generateContent(prompt);
   return r.response.text();
}

防護建議 - 交給 Gemini 生成

async function generateAdvice(detection) {
   const prompt = `
   根據以下檢測結果,請提供對應的防護建議:
   ${detection}

   請用表格形式輸出 (弱點類型 / 建議措施)。
   `;
   const r = await model.generateContent(prompt);
   return r.response.text();
}

主流程

(async () => {
   console.log("開始模擬攻擊 API:", apiUrl);

   // 1. 發送攻擊
   const attackResults = [];
   for (const p of payloads) {
      const result = await attackApi(p);
      attackResults.push(result);
   }

   // 2. 偵測漏洞
   const detection = await detectVulnerabilities(attackResults);
   console.log("檢測結果:\n", detection);

   // 3. 生成防護建議
   const advice = await generateAdvice(detection);
   console.log("防護建議:\n", advice);
})();

上一篇
Day9 - AI Agent 幫忙清理與強化 HTTP Security Headers
系列文
AI 驅動的 Web 資安新時代10
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言