SQL 注入攻擊新招
阿恆
相信很多 PHP 的開發者都認識 SQL 注入攻擊(SQL injection),我們之前在「不可不知的 PHP 安全技巧」也曾經介紹過,最近 Gareth Heyes 在他的個人網誌提到一種新的 SQL 注入攻擊招式,Gareth Heyes 稱它做「SQL 反射注入攻擊(reflected SQL injection)」,很多人可能都會忽略。
當用戶把數據送來伺服器,我們都會把數據 escape,然後組合成 SQL 指令送給數據庫,這樣做的好處是即使用戶的數據包含數據庫的特殊字符,例如「'」、「%」,也不會破壞 SQL 指令的完整性和語法,從而做成保安上的漏洞,也保證儲存在數據庫的東西,與用戶輸入的東西完全一致。
稍後我們會從數據庫把這些東西取出,利用它們在數據庫其他位置搜尋資料,這時由於沒有數據由用戶輸入,很多人會忽略了這些從數據庫取出的東西可能包含了「'」、「%」等字符,直接把這些東西組合成 SQL 指令送到數據庫,給駭客提供 SQL 注入攻擊的機會。
由於這樣的攻擊並不是發生在第一次組合 SQL 指令時發生(通常這個時候開發人員都會小心驗證用戶輸入的數據,受到攻擊的機會不大),而是在第二次使用數據時發生,特別容易被忽略,Gareth Heyes 估計很多保安檢查軟件也未必有能力偵測出這種漏洞。