sql的十種注入種類:
可顯注入
攻擊者可以直接在當前界面內容中獲取想要獲得的內容。
報錯注入
數據庫查詢返回結果并沒有在頁面中顯示,但是應用程序將數據庫報錯信息打印到了頁面中,所以攻擊者可以構造數據庫報錯語句,從報錯信息中獲取想要獲得的內容。
盲注
數據庫查詢結果無法從直觀頁面中獲取,攻擊者通過使用數據庫邏輯或使數據庫庫執行延時等方法獲取想要獲得的內容。
時間盲注
常用函數 sleep()
分割函數 substr、substring、left
分割函數編碼后可不用引號,ascii() hex()
一般時間盲注我們還需要使用條件判斷函數
if(expre1,expre2,expre3)
當 expre1 為 true 時,返回 expre2,false 時,返回 expre3
布爾盲注
這種注入會出現在 注冊、ip頭、留言板等等需要寫入數據的地方,如用sqlmap會產生大量垃圾數據。嘗試性插入、引號、雙引號、轉義符 \ 讓語句不能正常執行,然后如果插入失敗,更新失敗,然后深入測試確定是否存在注入。
二次注入:
sql語句的變量并不是直接傳入的變量,而是通過其它的方式保存到了數據庫,形成二次注入。沒有單引號的sql語句中,進行16進制編碼,這樣就不會帶有單引號。
寬字節注入:
字符注入的時候我們需要逃逸單引號,但是php提供了魔術引號開關magic_quotes_gpc和addslashes(),iconv()函數作為防御,特點是自動給傳入的參數如單引號,雙引號,反斜杠,%00前面加一個反斜杠,進行轉義,避免單引號進行逃逸。單引號轉義為 ‘ , mysql 會將 \ 編碼為 %5c ,寬字節中兩個字節代表一個漢字,所以把 %df 加上 %5c 就變成了一個漢字“運”,從而繞過轉義。如果數據庫是GBK格式而非默認的UTF-8格式,則我們利用兩個url編碼是一個漢字的特點,組合一個漢字從而解決”\“問題,完成單引號的逃逸。
數字型注入
當我們訪問頁面時經常會出現http:xxx.admin.com?id=1這種形式的url,這個時候我們輸入and 1=1與and 1=2,進行判定看是否會出現and 1=1回顯正常,and 1=2回顯不正常的情況。如果出現了我們一般就認為這里存在注入,并且是數字型注入。如果沒有出現那么并不能排查這里沒有注入,只是排除這里不存在數字型的注入。
字符型注入
url后輸入’ and 1=1 and ‘1’=’1,’ and 1=2 and ‘1’=’1。看是否會出現報錯的現象。如果存在我們可以進一步的閉合我們的語句。
http頭部注入
user-agent:判定用戶使用的操作系統,以及使用的瀏覽器的版本。
cookie:判定用戶的身份,進行session跟蹤可以存儲在用戶本地終端上的數據,簡單理解為用戶的一張身份辨別卡。
x-forwarded-for:是用來識別通過HTTP代理或負載均衡方式連接到Web服務器的客戶端最原始的IP地址的HTTP請求頭字段。
client-ip: 數據庫保存客戶端IP的參數。
rerferer:瀏覽器向web端表明自己從哪個連接而來。
host:客戶端指定自己想訪問的WEB服務器的域名/IP 地址和端口號。