跳轉到內容

網路應用安全指南/SQL 注入

來自華夏公益教科書

SQL 注入

如果包含在資料庫查詢中的使用者輸入沒有正確轉義,就會出現 SQL 注入漏洞。這種漏洞允許攻擊者更改資料庫查詢,從而使他們能夠獲取或修改資料庫內容。

為了防止這種型別的攻擊

  • 使用預處理語句訪問資料庫 – 或 –
  • 使用儲存過程,使用適當的語言/庫方法或預處理語句進行訪問
  • 始終確保應用程式使用的 DB 登入名僅具有所需的許可權

基本原理

手動轉義輸入容易出錯,而且可能會被遺忘。使用預處理語句,會自動應用正確的轉義。這還避免了由於不同的輸入解釋(字元集、空位元組處理等)導致的難以發現的漏洞問題。使用具有有限訪問許可權的資料庫登入名可以限制成功攻擊的影響。

利用

SQL 注入可以危害資料庫中的任何資訊,甚至會導致系統完全被破壞。它可以用來在網頁中新增 PHP、HTML 和 JavaScript 程式碼,並建立檔案。新增到網站的任意內容可用於針對使用者的惡意攻擊,以及獲取對伺服器的 shell 訪問許可權。

示例

如果本網站頁面標題的輸入容易受到 SQL 注入攻擊,那麼用於攻擊的 URL 將是 https://wikibook.tw/w/index.php?title=。一個簡單的測試來揭示輸入是否容易受到攻擊,是在 https://wikibook.tw/w/index.php?title=' 後新增,因為這種 SQL 語法會破壞查詢,並在頁面上顯示 SQL 錯誤。下一個查詢可以是使用類似 https://wikibook.tw/w/index.php?title=1%20UNION%20ALL%20SELECT%20user_pass%20FROM%20wiki_user;-- 的內容來選擇使用者名稱和雜湊密碼。結尾的 ;-- 結束查詢,並使剩餘的查詢成為註釋。可以轉儲包含密碼鹽的檔案,以便攻擊者可以使用 select load_file() 查詢開始破解密碼,並獲取對管理員帳戶的訪問許可權。類似於此的一個查詢可用於獲取對伺服器的 shell 訪問許可權:https://wikibook.tw/w/index.php?title=UNION%20SELECT%20<? system($_REQUEST['cmd']); ?>,2,3%20INTO%20OUTFILE%20"shell.php";--

華夏公益教科書