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 所示:
整體包含三個主要模組:
- 語法樹建構(Hierarchical Tree):將 payload 結構化,僅針對 Query 區段變異。
- 語義一致性變異(CFG-based Mutation):使用上下文無關文法生成語義等價的語法替代。
- 蒙地卡羅樹搜尋(MCTS):以策略性搜索避免暴力枚舉,提升查詢效率。
語法樹切分 Payload 結構
傳統 payload:1' or 1=1--+
被拆成:
- Left boundary:
1'
- Query (變異目標):
or 1=1
- Right boundary:
--+
👉 只針對中間 Query 區段變異,保證整體語義不被破壞。
並將其建成 語法樹(hierarchical tree),例如:
1 | STree |
上下文無關文法 + 權重變異策略
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 是整體運作的實現主體。
下面為各步驟說明與設計邏輯:
第 1~3 行:初始語法分析與變異候選生成
1 | t ← BuildTree(x) // 將原始 payload 建為語法樹 |
此處限定變異範圍於 query 區段,並依據語法角色進行替換候選生成。
第 4~6 行:MCTS 初始化
1 | s ← Min(s, len(t*)) |
根據 payload 結構限制搜索步數,並初始化狀態與節點資料。
第 7~17 行:核心 MCTS 搜索迴圈
此段為標準 MCTS 四步驟:
Selection:
1
expand_node ← TreePolicy(node)
根據 UCB 評分公式選擇當前值得擴展的子節點。
Expansion & Simulation:
1
reward ← DefaultPolicy(expand_node)
執行變異並將 payload 發送給 WAF,根據回應決定 reward。
Backpropagation:
1
Backup(expand_node, reward)
將 reward 回傳並更新沿路節點的訪問統計。
BestChild & 檢查是否繞過成功:
1
2
3
4node′ ← 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)
實驗設計
- 將原始 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 檢測器
結果摘要
- 在 CNN 和 LSTM 模型上,AdvSQLi 的 ASR 比 WAF-A-MoLE 高 2 倍、比 DRL 高達 7 倍(LSTM + SIK)
- 查詢次數極少時,即能達成高繞過率
- AdvSQLi 顯著優於 AdvSQLi(R)(亂數變異)與 AdvSQLi(A)(全排列)
➡️ 具策略性的語法導引變異搭配 MCTS,讓 AdvSQLi 在查詢資源有限情況下仍能高效攻擊。
RQ3:攻擊商用 WAF-as-a-Service
測試條件
- 實測 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)
最有效的變異方式:
- Inline Comment
- DML Substitution
- Whitespace Substitution
案例分析
- 原本被 AWS/F5/Cloudflare 攔下的 payload,加入 inline comment 或控制符號後可完全繞過
- 表示多數 WAF 的檢測 signature 仍停留在正則比對層級
➡️ 混合變異策略才具廣泛適應性,WAF rule base 系統在語義層面仍顯薄弱。