SQL 注入攻擊也稱為 SQL injection,網頁有許多功能都需要資料庫,例如會員登入、購物車等,都需要工程師在網頁前端收到使用者的資料,儲存於資料庫,以便未來使用者登入輸入帳密時,可以檢查是否帳密正確。
而工程師在編寫程式時,對於檢查「使用者的輸入」不夠嚴格,可能輸入的內容被程式以為是 SQL 語法,進而繞過檢查機制或洩漏機敏資料
資料庫類型有許多種,有 MySQL、Access、Microsoft SQL Server等,不同的資料庫類型,會有不同的注入語法。
參考資料:https://www.slideshare.net/hugolu/sql-injection-61608454
是指使用者輸入數字,資料庫會根據使用者輸入的數字,查詢相關第N筆資料
通常數字型的 SQL 注入點會搭配其他手法來進行 SQL 注入,例如 UNION
假設今天欲從資料庫中,依據 id 進行查詢 news,則查詢 id 為 1 的 news 所使用的 SQL 語法如下:
SELECT `title`, `content`
FROM `news`
WHERE `id` = 1;
以 PHP 為例,若網頁後端要從 MySQL 查詢 news,則需將指定的 id 嵌入 SQL 語法,再送給 MySQL 伺服器執行。最簡單的寫法如下:
$res = mysqli_query($conn, "SELECT title, content FROM news WHERE id=".$_GET['id']");
以 https://localhost/news?id=1
為例,上述程式碼中的 $_GET['id']
會取得 URL 中的參數 id ,因而合併後的字串為 "SELECT title, content FROM news WHERE id=1"
。然而,由於程式沒有檢查 $_GET['id']
是否為數字,若攻擊者輸入網址 https://localhost/news?id=1 OR 2 > 1
,則會構建出如下的 SQL :
SELECT `title`, `content`
FROM `news`
WHERE `id` = 1
OR 2 > 1;
由於 2 > 1
恆真,資料庫就會將所有 news 都回傳。
由此可見,若網頁程式沒有檢查從 Client 端傳來的資料,便將其嵌入 SQL 語法,攻擊者便可能插入額外語法,藉此改變程式行為。結合明天將介紹的 UNION ,甚至可能將整個資料庫的資料盡數洩漏出來。
參考資料:https://zhuanlan.zhihu.com/p/139737334
[https://localhost/news?id=1](https://localhost/news?id=1)
可以在 id=1
的地方改成 id=3-2
,看是否會進行計算
id=1
的結果,代表會根據輸入的資料進行運算,代表可能是一個數字型注入id=3
的樣子,表示網頁程式可能有對輸入轉型為數字,因此後面非數字的字串沒有生效。參考資料:https://blog.csdn.net/weixin_43749051/article/details/114295081