【AdvSQLi】用語義保持的對抗樣本擊穿 WAF 黑箱:從語法樹出發的 SQL Injection 新攻擊

Web Application Firewall(WAF)是目前防堵 SQL Injection(SQLi)攻擊的主流防線,不論是企業自建還是 AWS、Cloudflare 等商用 WAF-as-a-Service。但這些防禦系統真的能擋下變形過的攻擊嗎?

近期發表於 IEEE TIFS 的論文《AdvSQLi: Generating Adversarial SQL Injections Against Real-World WAF-as-a-Service》r提出一個新方法,可以在 不破壞原始語義與功能的情況下繞過黑箱 WAF。而這一切的核心在於:語義保持 + CFG 導引變異 + MCTS 搜索。

系統總覽與三層結構

AdvSQLi 的整體架構如論文 Figure 2 所示:

alt text

整體包含三個主要模組:

  1. 語法樹建構(Hierarchical Tree):將 payload 結構化,僅針對 Query 區段變異。
  2. 語義一致性變異(CFG-based Mutation):使用上下文無關文法生成語義等價的語法替代。
  3. 蒙地卡羅樹搜尋(MCTS):以策略性搜索避免暴力枚舉,提升查詢效率。

語法樹切分 Payload 結構

傳統 payload:1' or 1=1--+
被拆成:

  • Left boundary: 1'
  • Query (變異目標):or 1=1
  • Right boundary: --+

👉 只針對中間 Query 區段變異,保證整體語義不被破壞。

並將其建成 語法樹(hierarchical tree),例如:

1
2
3
4
5
STree
├── ExprLog
│ ├── 1
│ └── =
│ └── 1

上下文無關文法 + 權重變異策略

AdvSQLi 使用 CFG(Context-Free Grammar)建模 SQL 表達式,例如 tautology 1=1 可對應到:

1
true && /**foo*/ select 1 and 2<>3

它不只是語意對等替換,還透過權重控制變異深度,避免遞迴無窮(Decay Rate 方式)。

常見變異手法如下(來自 Table I):

  • Inline Comment
  • DML Substitution (SELECT/**/select)
  • Whitespace Substitution (%0A、Tab 等)

MCTS 核心選擇策略

AdvSQLi 採用蒙地卡羅樹搜尋(MCTS)時,使用如下公式選擇最值得探索的節點(節錄自論文 Equation 2):

  • $Q(v’)$:目前節點 $v’$ 的累計 reward(成功繞過的次數)
  • $N(v’)$:此節點被造訪的次數
  • $N(v)$:父節點 $v$ 的造訪次數
  • $c$:探索/利用的調整參數(通常設為 $\sqrt{2}$)

這個公式本質上是在平衡「已知的好選擇」與「尚未探索的潛力」。前半段是 exploitation,後半段是 exploration。


AdvSQLi 主流程:演算法解構與關鍵步驟說明

主流程在論文 Algorithm 1 中完整描述,這段 Pseudocode 是整體運作的實現主體。

alt text

下面為各步驟說明與設計邏輯:

第 1~3 行:初始語法分析與變異候選生成

1
2
3
t ← BuildTree(x)              // 將原始 payload 建為語法樹
t* ← ExploreOperationalNodes(t) // 選出可變異的節點
M ← CFG(t*) // 產出變異候選(以 CFG 為基礎)

此處限定變異範圍於 query 區段,並依據語法角色進行替換候選生成。

第 4~6 行:MCTS 初始化

1
2
3
s ← Min(s, len(t*))          
state ← MCTSState(t, M, p) // 將語法樹與 CFG 包裝為初始狀態
node ← MCTSNode(state) // 設定為搜尋樹的根節點

根據 payload 結構限制搜索步數,並初始化狀態與節點資料。

第 7~17 行:核心 MCTS 搜索迴圈

此段為標準 MCTS 四步驟:

  1. Selection

    1
    expand_node ← TreePolicy(node)

    根據 UCB 評分公式選擇當前值得擴展的子節點。

  2. Expansion & Simulation

    1
    reward ← DefaultPolicy(expand_node)

    執行變異並將 payload 發送給 WAF,根據回應決定 reward。

  3. Backpropagation

    1
    Backup(expand_node, reward)

    將 reward 回傳並更新沿路節點的訪問統計。

  4. BestChild & 檢查是否繞過成功

    1
    2
    3
    4
    node′ ← BestChild(node)
    x′ ← ConstructPayload(node′)
    score ← clsf(x′)
    if score < threshold then return true

與 RL / Priority Queue 方法的比較

AdvSQLi 相比於強化學習(如 DQN/PPO)與優先佇列(如 WAF-A-MoLE)的優勢在於:

面向 AdvSQLi RL-based WAF-A-MoLE
語義保持
黑箱適應性 一般
查詢效率(少次數) 一般
可遷移性與泛化 一般

AdvSQLi 實驗評估:語義保持與實用性兼具的對抗框架

為驗證 AdvSQLi 的有效性,論文設計了四項核心研究問題(RQs),並搭配三個資料集與七款商用 WAF 進行評估。

實驗資料集與模型設定

資料集 說明
HPD 包含 CSIC + sqlmap 攻擊樣本
SIK Kaggle SQLi dataset
MDD 論文自建,支援 union-based、error-based、盲注等樣式

目標模型分為兩類:

  • ML-based 檢測器:WAF-Brain、CNN、LSTM
  • 真實 WAF 服務:AWS、F5、Cloudflare、Fortinet、CSC、Wallarm、ModSecurity

RQ1:語義保持能力(Semantic Preservation)

alt text

實驗設計

  • 將原始 SQLi payload 與 AdvSQLi/WAF-A-MoLE 變異後的 payload 執行於 MySQL 5.7/8.0 與 PHP/Python Web 應用
  • 比較 payload 執行後的結果是否一致,作為語義保持指標(VGP)

結果分析

  • AdvSQLi 的 VGP 始終為 100%
  • WAF-A-MoLE 當攻擊步數 > 4 時,約有一半 payload 已失效

➡️ AdvSQLi 成功做到語義一致性變異,對真實應用無破壞性。


RQ2:攻擊 ML-based SQLi 檢測器

alt text

結果摘要

  • 在 CNN 和 LSTM 模型上,AdvSQLi 的 ASR 比 WAF-A-MoLE 高 2 倍、比 DRL 高達 7 倍(LSTM + SIK)
  • 查詢次數極少時,即能達成高繞過率
  • AdvSQLi 顯著優於 AdvSQLi(R)(亂數變異)與 AdvSQLi(A)(全排列)

➡️ 具策略性的語法導引變異搭配 MCTS,讓 AdvSQLi 在查詢資源有限情況下仍能高效攻擊。


RQ3:攻擊商用 WAF-as-a-Service

alt text
alt text

測試條件

  • 實測 4 種請求類型(GET, POST, JSON 格式等)
  • 部署在 Google Cloud 的改造版 SQLi-labs + 七家商用 WAF

結果摘要

  • AWS 與 Cloudflare 的 FNR 超過 60%,JSON 請求尤易被繞過
  • AdvSQLi 對 AWS(SIK dataset)ASR 達 99.73%
  • 相較 WAF-A-MoLE,AdvSQLi 達到同樣或更高成功率的查詢次數約為其 1/3

➡️ 真實 WAF 多半解析 JSON 能力不足,是高風險盲點。


RQ4:消融分析(Mutation Method Effectiveness)

alt text

最有效的變異方式:

  • Inline Comment
  • DML Substitution
  • Whitespace Substitution

案例分析

  • 原本被 AWS/F5/Cloudflare 攔下的 payload,加入 inline comment 或控制符號後可完全繞過
  • 表示多數 WAF 的檢測 signature 仍停留在正則比對層級

➡️ 混合變異策略才具廣泛適應性,WAF rule base 系統在語義層面仍顯薄弱。