聯合查詢 union
因爲查詢語句構造問題,可直接否認掉之前的查詢,執行一個全新的語句來執行,需要注意的是查詢的列應當與之前對應。
在MySQL中,把information_schema 看作是一個信息數據庫,其中保存着關於MySQL服務器所維護的所有其他數據庫的信息,如數據庫表名,數據庫的表,表欄的數據類型與訪問權限
此數據庫是MySQL自帶的,information_schema.SCHEMATA表中的SCHEMA_NAME有着所有的數據庫。
萬能密碼繞過登陸
通過在用戶名處傳入參數 ' or 1 = 1 #
進行萬能密碼登陸
在SQL查詢語句中,where 條件中爲檢驗username,往往要where username = '..'
此時如果在 ..
後加上構造的參數,那麼就會出現驗證提前中斷,並且換作一個或的條件
我們知道1 = 1 這個條件恆成立,username就跳過驗證了,接下來,AND password = '...'
就自然而然的被 # 註釋掉。
select * from users where username = '..'or 1 = 1 #' AND password = '...'
【上述 # 也可以換作 – 都是SQL註釋】
數字型注入
輸入參數爲整數,如果存在注入型漏洞,則爲數字型注入
字符型注入
與數字型注入的區別在於:字符型注入一般要用單引號或雙引號來閉合
檢測方法
..?id=8 and 1=1 【數字型】 --change--> ..? id=8' 【字符型】
..? user=admin' and '1'='1' 【字符型】
SQL盲注
不能通過直接顯示的途徑來獲取數據庫數據的方法。
在盲注中,攻擊者根據其返回頁面的不同來判斷信息(可能是頁面內容不同也可能是響應時間不同)
- 布爾盲注
- 時間盲注
- 報錯型盲注
由於某些限制,布爾盲注的關鍵字帶入不進去,這時候可以用slee來進行時間盲注,去頁面執行時間,來判斷sleep函數是否正常執行.
基於時間盲注在使用延遲函數上有兩個選擇,BENCHMARK(count,expr)函數,sleep(time)函數,前者通過將expr語句執行count次來達到延遲的目的,後者是直接延遲time時間.
某些查詢是不需要返回結果的,僅判斷語句是否正確執行即可,所以返回可以看作是一個布爾值,正常顯示true,報錯或者不正常顯示爲false.
SQL文件頭注入
User-Agent:
使得服務器能夠識別客戶使用的操作系統,瀏覽器版本,很多數據量大的網站終會記錄客戶使用的操作系統或者瀏覽器版本等存入數據庫中
Cookie:
網站爲了辨別用戶,進行session跟蹤而儲存在用戶本地終端上的數據 , 通常經過加密
X-Forwarded-For:
簡稱XFF頭,它代表客戶端,也就是HTTP的請求段真實的IP,通常一些網站的防注入功能會記錄請求端真實IP並寫入數據庫or某文件。【通過修改XXF頭可以實現僞造IP】
Rerferer:
瀏覽器向web服務器表明自己是從哪個頁面鏈接過來的
Host:
客戶端制定自己想訪問的web服務器的域名/IP地址和端口號
- Cookie注入
- Refer注入
- UA注入
- XFF注入
寬字節注入
理想規範下,程序都使用unicode , 網站都使用 utf-8 ,但有些國家使用自己的編碼,例如gbk,一個gbk編碼的漢字佔用兩個字節,一個utf-8佔用三個字節,簡體中文系統中ANSI就代表GBK。
Scenes:
正常情況下通過輸入單引號來探測有沒有SQL注入漏洞
但由於使用了select函數或者其他字符轉義函數,我們會在單引號前加反斜槓
如果我們構造的是`%df'`作爲輸入,在前面加上\,即`%df\'`,將會變成`%df%5c%27`
但gbk是兩個字節表示一個漢字,所以`%5c變成漢字`
`單引號逃逸`,本來轉義之後是不能作爲特殊字符的
現在可以與前面的語句進行`引號閉合`,使得報錯或者檢測漏洞。