一、堆疊注入。php
數據庫查詢語句語法是以分號;結尾。當數據庫中出現容許多條查詢語句同時成立時候,就能使用堆疊注入。mysql
正常狀況:sql
select * from users where id='1';數據庫
堆疊注入狀況:瀏覽器
select * from users where id='1';insert into ....#';less
演示案例:sqli-lab less38函數
-1'; insert into users (id,username,password) value (38,'admin38','pass38')%23網站
緣由是咱們的輸入被放置在 mysqli_multi_query()中了,被容許執行多條數據庫查詢語句編碼
二、二次注入url
若是在初始輸入點遇到有sql注入防禦的時候,好比addslashes(),咱們輸入的單引號會被轉義,變成反斜槓'。其問題就在於當初始輸入被轉義後存入數據庫中的時候,數據庫保存的時候會把\去掉,那一旦咱們再次調用該數據的時候,就會造成二次注入。
演示案例:sqli-lab less24
經過對網站的觀察,發現有個登錄口,有個註冊口,登陸後能夠修改密碼。恰好符合二次注入的場景
咱們的攻擊目標是 管理員帳號admin
首先註冊 admin '# ,密碼隨意,註冊成功後,在數據庫中顯示的就是:
admin '#
而後使用上述帳戶登陸,修改密碼,此時數據庫的查詢就變成:
update users set password='123456' where username = 'admin'' #;
經過上述語句能夠看出,實際上'閉合前面的單引號,#註釋了後面的單引號,最終修改的username就變成了admin了,也達到了咱們在不知道管理員密碼的狀況下重置了他的密碼。
三、寬字節注入
所謂寬字節,主要出如今中文頁面上,由於漢字字符的關係,中文編碼會佔用2個字節位,編碼使用的是GBK編碼,會把兩個字符組合一個漢字。
寬字節注入的產生也是由於對引號的過濾,在url編碼中,\的編碼是%5c,而'的編碼是%27,當被addslashes等過濾手段過濾後,原本輸入的: 1' =》1'=>1%5c%27,這原本是一種很好的防護手段。但是在寬字節編碼中,%5c剛好能夠和其餘字符組成一個寬字節漢字。當咱們輸入1%df'的時候:=>1%df%5c%27 =>1(寬字節)%27,這樣就使咱們的單引號脫離了反斜槓的束縛,造成特殊字符注入。
以kuan.php爲例:
想使用常規的sql注入語句的時候,輸入id=1' ,其在數據庫中就變成:
select * from wuser where id ='1\''
當使用寬字節注入,輸入id=1%df',其在數據庫中就變成:
select * from wuser where id ='1運''
接着就能夠繼續使用常規的sql注入來攻擊,輸入id= -1%df' union select 1,2,3%23:
select * from wuser where id ='-1運' union select 1,database(),3#'
在sqli-lab less33中,也有相似的應用
四、urldecode編碼注入
這種注入的場景主要出如今有urldecode()解碼函數的地方。正常的話,瀏覽器在接收到http請求的時候,特殊字符都是經過url編碼的,瀏覽器會自動解一次碼。