天天看點

sql注入堆疊注入、二次注入、寬位元組注入、http頭注入

1.堆疊注入

堆疊注入的原理很簡單就是使用分号來執行兩條不同指令,因為在資料庫中就是使用分号來進行語句的分隔的,但是使用堆疊注入,由于第一條語句的原因,并不會插入的堆疊注入傳回任何結果,但實際上是執行了的。我們在注入的過程中,union後面隻能跟select查詢語句,而堆疊注入可以進行增删改查,對資料庫危害極大屬于高危漏洞。

我們首先來看sql-labs的38關的原代碼

sql注入堆疊注入、二次注入、寬位元組注入、http頭注入

他的sql執行函數使用的是mysqli_muti_query而不是我們常看見的mysqli_query,他們最重要的差別就是前者能執行多條語句,而後者隻能執行一條語句。是以當有執行函數使用mysqli_muti_query切沒有對傳參做嚴格過濾的時候我們可以使用堆疊注入。我們來驗證一下。

sql注入堆疊注入、二次注入、寬位元組注入、http頭注入

判斷注入點閉合逃逸我就不多講了,前面說過很多次了,接下來直接insert

sql注入堆疊注入、二次注入、寬位元組注入、http頭注入

進庫檢視結果,執行成功:

sql注入堆疊注入、二次注入、寬位元組注入、http頭注入

2.二次注入

二次注入嚴格上說應該是邏輯上的問題,比如我在注冊時注冊了admin‘#這個賬戶,#在傳入資料庫時被轉義當成字元串處理,沒有産生注釋的效果,而在傳出時沒有進行轉義,當我們修改admin’#的密碼,由于#是注釋符,是以我們修改的是admin的密碼。

我們看sql-labs24關的代碼,以下是注冊新使用者時的代碼

sql注入堆疊注入、二次注入、寬位元組注入、http頭注入

我們可以看到使用了字元串強制轉換的函數,就是在特殊符号前加反斜杠強制轉義,但是在修改密碼的時候,他的sql語句是這樣的

sql注入堆疊注入、二次注入、寬位元組注入、http頭注入

由于我們的使用者名是admin‘#,是以語句就變成了

#後面的就被注釋了,修改了admin的密碼

3.寬位元組注入

前面我們說了使用mysql_escape_string來強制轉換特殊字元如單引号#等,那我們有沒有其他方法來繞過這個防禦機制呢,答案是有的,那就是寬位元組注入。前提是資料庫使用的是GBK編碼。

這裡由于比較簡單,是以隻将原理就不示範了

原理是當資料庫使用GBK編碼時,我們輸入一個單引号‘會被轉義函數強制加上反斜杠變成’ ,這樣單引号就隻是一個字元沒有特殊含義,GBK編碼一個漢字和一個英文單詞都占兩個字元,當資料庫字元集為GBK時,%df可以了解為半個漢字,當%df或者%dc和轉義符\在一起時,資料傳輸到資料庫中,GBK會4個字元4個字元的讀取,他們兩個的ascii碼湊在一起是表示一個漢字的ascii碼,是以轉義符就被吃掉了。是以隻需要在單引号前加%df就ok了

3.http頭注入

這個比較簡單,很多網站都會把cookie或者refer等http頭存入資料庫中,是以我們隻需要抓包在cookie或者refer等地方插入注入語句就ok了,這個告訴我們不要隻盯着肉眼可見的地方進行sql注入,隻要是與資料庫有互動的點,都可能是一個注入點