今天要帶大家深入了解 SQL 注入(SQL Injection)這個經典網頁漏洞。
相信不管是資安新手還是老手,一提到 SQL 注入都不陌生。簡單來說,SQL 注入就是駭客利用網頁應用程式對使用者輸入資料驗證不足的漏洞,在資料庫查詢語句中插入惡意 SQL 代碼。結果是,駭客能夠未經授權取得、修改,甚至刪除資料庫裡的資料,一不小心整個系統就被操控了!
攻擊有多恐怖?像是透過輸入 ' OR '1'='1
這種經典語句繞過認證、用 UNION SELECT
撈取資料、利用錯誤訊息爆出系統資訊或是時間盲注等等。別小看它,就算簡單的字串拼接也會成為致命漏洞。
先講講今天的主角專案,是一個簡單的用戶管理系統,讓使用者透過帳號登入查看個人資料。我們用 MVC 架構來整理整個流程:
專案中,我們初版 Model 有個致命缺陷:直接用字串拼 SQL!結果只要輸入一點奇怪的字串,就能輕鬆攻破系統。
Controller 接收從 URL 或表單的帳號參數,Model 使用類似以下的查詢語句:
SELECT * FROM Users WHERE username = ' " + userInput + " '
假如攻擊者在帳號欄輸入:
' OR '1'='1
這時整個 SQL 查詢變成:
SELECT * FROM Users WHERE username = '' OR '1'='1'
因為條件永遠成立,攻擊者就能獲取全部用戶資料!
要阻止 SQL 注入,最關鍵的是:
改寫後的 Model 程式碼大致長這樣:
csharp
var cmd = new SqlCommand("SELECT * FROM Users WHERE username = @username");
cmd.Parameters.AddWithValue("@username", userInput);
var result = cmd.ExecuteReader();
同樣的輸入嘗試不會再造成資料外洩,完全被擋下來!
除了程式寫得安全,懂得怎麼測試網站是否被注入攻擊成功也很重要!
透過實戰測試,找出你的程式還有哪些被攻擊的縫隙,才有機會做進一步強化。
建議:
其實這些我們以前都介紹過了,但今天是想要真的從上機後的網站來實測看看這個可怕的自然漏洞,也希望可以介紹更多一點防禦工具讓自然防禦成為大家重視的課題!但是網站架設及鍵資料庫需要一點時間且防禦工具也要再熟悉一些,所以今天可能沒有辦法上畫面!這幾天會努力趕出來的。
來源
揭密SQL注入攻擊原理駭客工具示範演練攻防 https://www.netadmin.com.tw/netadmin/zh-tw/technology/BA57AAB19C8C4C0AB22479124F9F4B94
資訊安全從入門到差點入獄 https://s.itho.me/techtalk/2017/iThome-Teach-0322.pdf
秒懂SQL Injection https://tech-blog.cymetrics.io/posts/nick/sqli/