? ? ? ? 如果文章不足還請各位師傅批評指正!
????????想象一下,你經營著一家咖啡店,顧客可以通過店內的點單系統下單。這個系統會根據顧客的輸入,向后廚發送指令,比如“為顧客A準備一杯拿鐵”。
????????然而,如果有個不懷好意的顧客,在點單時輸入了“給我一杯拿鐵;再給所有顧客免費升級到特大杯”,那么后廚可能會按照這個指令執行,導致你的咖啡店損失慘重。
????????在網絡安全領域,這種類似的情況就是SQL注入。SQL注入是指攻擊者在Web應用程序中輸入惡意的SQL代碼片段,這些代碼片段會與原本的數據庫查詢語句合并執行,從而欺騙數據庫執行非授權的操作。就好比在正常的訂單系統中偷偷加入了一些額外的指令,讓數據庫按照攻擊者想要的方式去執行。
一、什么是 SQL 注入
????????SQL 注入是一種常見的網絡攻擊手段,它專門針對程序員在編寫代碼時的疏忽。
????????你在網上注冊了一個賬號,填寫用戶名和密碼后點擊提交。正常情況下,網站會將你輸入的信息發送到數據庫進行驗證,看看用戶名是否存在,密碼是否正確。但如果網站對用戶輸入的數據沒有進行嚴格的檢查,黑客就有機會在你輸入的內容里添加一些特殊的 SQL 語句。比如,在用戶名框里輸入 “' or '1'='1”(別小看這串字符,它可是有大 “威力” 的),這時候網站傳給數據庫的查詢語句就可能變成了 “SELECT * FROM users WHERE username = ' ' or '1'='1' AND password = ' 你輸入的密碼 '” 。由于 “1'='1” 這個條件永遠成立,黑客就能繞過密碼驗證,輕松登錄系統,獲取他們不該得到的數據,這就是 SQL 注入的可怕之處!
二、SQL 注入的類型
(一)聯合查詢注入
????????這種注入方式就像是黑客找到了網站數據顯示的 “秘密通道”。
????????當網站有明確的數據回顯位置時,黑客就能利用它來獲取各種信息。比如說,有一個學生信息查詢網站,輸入學生 ID 就能顯示學生的姓名、年齡等信息。黑客發現這個網站存在注入漏洞后,就可以通過 “order by” 語句來判斷數據庫表的列數,假設發現有 3 列。接著,他們使用 “union select” 語句,構造出類似 “-1' union select 1,user (),database () --+” 這樣的攻擊語句(這里的 “-1” 是為了讓原查詢不返回數據,“user ()” 和 “database ()” 是 SQL 函數,分別用于獲取數據庫的使用者和當前數據庫名),網站就會把數據庫的使用者和數據庫名顯示出來,黑客就這樣輕松獲取到了敏感信息。
(二)報錯注入
????????有些網站比較 “粗心”,雖然沒有給黑客提供數據回顯的位置,但卻沒有屏蔽數據庫的報錯信息,這就給了黑客可乘之機。
????????報錯注入就是利用這一點,通過一些特殊的函數讓數據庫報錯,然后從報錯信息中獲取數據。例如 “updatexml ()” 函數,黑客在訪問網站時輸入 “?id=1' and updatexml (1,concat (0x7e,(select user ()),0x7e),1) --+” ,數據庫就會報錯,而報錯信息里會顯示出當前數據庫的使用者信息。就好像黑客故意在數據庫里制造混亂,然后從混亂中找到他們想要的東西。
(三)布爾盲注
????????布爾盲注就像是黑客在和網站玩猜謎游戲。
????????當網站關閉了錯誤回顯和數據回顯,但頁面會根據輸入的對錯發生變化時,黑客就可以用這種方法。比如一個登錄頁面,正常輸入用戶名和密碼,頁面會提示 “登錄成功” 或 “用戶名或密碼錯誤” 。黑客通過構造 “and 1=1” 和 “and 1=2” 這樣的語句,如果輸入 “and 1=1” 時頁面顯示正常,輸入 “and 1=2” 時頁面有變化,就說明存在注入點。然后,他們利用 “substr ()”“ascii ()” 等函數,結合二分法來逐個猜解數據庫里的數據。這就好比黑客每次問網站一個關于數據的 “小問題”,根據網站的回答來慢慢拼湊出完整的數據。
(四)時間盲注
????????時間盲注是最 “狡猾” 的一種注入方式。
????????當網站沒有任何形式的回顯,連錯誤信息都不顯示時,黑客就會利用睡眠函數來判斷注入是否成功。在 MySQL 里有個 “Benchmark ()” 函數可以用來測試性能,黑客會構造類似 “?id=1' and if (ascii (substr (user (),1,1))>1, sleep (5),0) --+” 的語句。如果頁面加載時間明顯變長了 5 秒,就說明這個語句被執行了,也就意味著存在注入點。這就好像黑客在網站上偷偷設置了一個 “定時器”,通過觀察網站的反應時間來獲取信息。
(五)堆疊注入
????????堆疊注入在 MySQL 上不太常見,但在 Mssql 中比較多見。
????????它就像是黑客找到了一條能直接進入數據庫的 “捷徑”,可以用分號分割來執行多個語句。比如,黑客輸入 “root';DROP database user;”,服務器生成的 SQL 語句就會變成 “select * from user where name='root';DROP database user;” ,這樣第一條語句查詢數據,第二條語句就能把整個 user 數據庫刪除,危害極大。
三、注入點方式類型
(一)數字型注入
????????這種注入發生在網站對數字類型的參數處理不當的時候。
????????比如一個商品詳情頁面,URL 可能是 “xxx.com/product?id=1” ,這里的 “id” 就是數字型參數。如果網站沒有對這個參數進行嚴格驗證,黑客就可以嘗試在 “id” 參數后添加特殊的 SQL 語句,如 “xxx.com/product?id=1; DROP TABLE products;”(當然,實際情況中可能需要根據數據庫類型和網站架構進行調整),這樣就有可能導致商品信息表被刪除。
(二)字符型注入
????????字符型注入通常出現在處理字符串參數的地方,比如登錄頁面的用戶名和密碼輸入框。
????????就像前面提到的萬能密碼 “' or '1'='1” ,就是利用了字符型注入的漏洞。黑客在輸入框中輸入特殊字符和 SQL 語句,讓數據庫的查詢邏輯發生改變,從而達到非法訪問的目的。
(三)搜索型注入
????????搜索框也是黑客經常攻擊的目標。
????????當你在網站的搜索框里輸入關鍵詞時,如果網站沒有對輸入進行過濾,黑客就可以輸入特殊的 SQL 語句。比如,在搜索框輸入 “' or 1=1 --” ,原本的搜索語句可能就會變成 “SELECT * FROM articles WHERE title LIKE '%' or 1=1 -- %'” ,這樣黑客就能獲取到所有文章的信息,而不僅僅是符合搜索關鍵詞的文章。
四、如何預防SQL注入攻擊?
(一)輸入驗證
對用戶輸入的數據進行嚴格的驗證和過濾,確保輸入中不包含惡意的SQL代碼。就像咖啡店要仔細檢查顧客的訂單,確保沒有不合理的要求一樣。
(二)使用預編譯語句
預編譯語句(如PreparedStatement)可以在執行前對SQL語句進行編譯,將用戶輸入作為參數傳遞,這樣用戶輸入就不會改變SQL語句的結構,從而有效防止SQL注入。
(三)限制數據庫權限
為Web應用程序設置專用的數據庫用戶,并嚴格限制該用戶的權限,使其只能執行必要的操作。這就像是給咖啡店的員工設置權限,讓他們只能接觸和操作自己職責范圍內的事物,避免因權限過大而引發問題。
(四)隱藏錯誤信息
避免將詳細的數據庫錯誤信息直接顯示在頁面上,而是顯示友好的錯誤提示。這樣可以防止攻擊者從錯誤信息中獲取敏感信息,就像咖啡店的后廚出現問題時,不會直接把錯誤的訂單細節展示給顧客,而是由店員出面友好地解釋情況。
五、SQL相關靶場
????????用心的小伙伴可以發現我在主頁自己搭建sqllab搭建報錯,問題應該出在數據庫沖突,還沒解決,總之新手伙伴們可以試下這個在線連接,網上也可以找到相關通關教程。
????????在線靶場:https://sqli-labs.bachang.org/
????????sql-libs是一個專門用于學習和測試SQL注入的開源平臺,它提供了一系列的注入場景和關卡,幫助開發者和安全測試人員深入理解SQL注入的原理和防范方法。
? ? ? ? 再次感謝!是小白是小白是小白,如果文章不足還請師傅批評指正。感謝~