一、sql注入原理
注入攻擊的本質就是把用戶輸入的數據當作代碼來執行。所以注入攻擊有兩個必要條件
1.用戶能夠控制的輸入。
2.原本程序要執行的代碼,拼接了用戶輸入的數據。
二、sql注入分類
按照請求方法可以分為:GET請求、POST請求
按照參數類型可以分為:數字型、字符型
按照數據返回結果分為:回顯、報錯、盲注
盲注又分為:布爾盲注、延時盲注
三、sql注入測試方法
一般測試語句:
or 1=1 --+ | 'or 1=1 --+ | "or 1=1 --+ |
)or 1=1 --+ | ')or 1=1 --+ | ")or 1=1--+ |
"))or 1=1 --+ |
ps: # url編碼后為 %23 ,可以用 --+ 替換
常用測試函數:
函數名 | 作用 |
version() | 數據庫版本 |
user() | 數據庫用戶名 |
database() | 數據庫名 |
@@datadir() | 數據庫路徑 |
@@version_compile_os | 操作系統版本 |
測試流程:
這里是在本地搭建的一個 sqli 的靶場,用來自己做練習,感覺還不錯。
文章最后附帶的有鏈接,小伙伴們可以自行下載。
1.檢測sql注入類型
直接在url處添加 單引號 發現網站報錯、說明sql語句出錯,就可能存在注入
2.閉合sql語句
一般有兩種方法:
a.使用 # 號,把本行 # 號后面的內容注釋調,這樣就可以避免sql語句出錯,使我們構造的 payload 可以正確執行
b.根據sql語句,用符號進行閉合
這里就直接用 # 進行注釋了,可以看到網站的頁面回復了正常
3.探測字段列數
假設列數為 4 進行測試,頁面出錯,說明小於 4 列
然后列數為 3 進行測試,頁面正常,說明存在 3 列
4.查看顯示位,進行測試
可以看到數據庫的版本信息,說明存在sql注入漏洞
四、sql注入防護技巧
數據與代碼分離
對用戶輸入的數據進行嚴格過濾
對特殊字符進行轉義
使用預編譯語句
使用安全函數
檢查數據類型