以MySQL為例,首先我們知道mysql注釋符有#、-- (后面有空格)、/**/三種,在SQL注入中經常用到,但是不一定都適用。筆者在sqlilabs通關過程中就遇到不同場景用的注釋符不同,這讓我很疑惑,讓我們來深入挖掘一番(篇幅比較長,省時間可以跳到最后看結論)。
以第一關(GET提交方式)和第十一關(POST提交方式)為例,從前端--數據傳輸--數據庫查詢命令三方面講解:
目錄(本文篇幅較長,點擊目錄跳轉)
在關卡源碼中找到要執行的SQL語句,在下面加入以下代碼,方便我們查看執行的SQL命令
echo "$sql<br>";
一、注釋符:-- (后面有空格)(也就是--+)
第一關(GET提交方式)
1.URL:
http://localhost/sqlilabs/Less-1/?id=-1' union select 1,2,database()--+
執行沒問題,注意黃色SQL命令這里的--+變成了-- (后面有空格)
2.burpsuite:
傳輸過程對單引號還有空格進行了url編碼
3.MySQL命令行:
將頁面黃色命令復制到MySQL命令行,執行沒問題,注意這里的--+變成了-- (后面有空格),即正確使用了注釋符-- (后面有空格)
第十一關(POST提交方式)
1.POST參數:
uname=vdf&passwd=-ad' union select 1,database()-- &submit=Submit
執行沒問題
2.burpsuite:
因為是POST提交的數據,所以不用進行url編碼,是POST原文
3.MySQL命令行:
執行沒問題
二、注釋符:#
第一關(GET提交方式)
1.URL:
http://localhost/sqlilabs/Less-1/?id=-1' union select 1,2,database()#
執行命令提示語法錯誤,來傳輸過程看看經歷了什么:
2.burpsuite:
傳輸過程對單引號還有空格進行了url編碼。原來是#號沒了,為什么呢?因為url中的#號代表html頁面中的錨點,數據傳輸過程並不會一起帶到后端
3.MySQL命令行:
上面說到,在前端頁面執行語法錯誤了,那語法到底是哪錯了?我們復制黃色命令在命令行執行了一下,提示少了一個單引號,就可以正常執行了,原來錯誤就在這里了,我們分析一波:
①url中#號作為錨點,不當做數據來傳輸
②命令傳到后端,少了一個單引號用來閉合命令(我們可以利用這種特性,在url中命令結尾添加一個單引號來代替注釋符,又一種方法get!)
解決辦法:直接在url中使用#號有問題,就可以把#號轉換成url編碼(%23)就可以執行了
1.URL:
http://localhost/sqlilabs/Less-1/?id=-1' union select 1,2,database()%23
執行沒問題
2.burpsuite:
傳輸過程對單引號還有空格進行了url編碼
3.MySQL命令行:
執行沒問題
同時得出傳輸過程結論:在前端注釋符使用url編碼,傳輸過程中把url編碼帶上,到后端就會進行一次url解碼操作,#號注釋符起作用。
第十一關(POST提交方式)
1.POST參數:
uname=vdf&passwd=-ad' union select 1,database()#&submit=Submit
執行沒問題
2.burpsuite:
因為是POST提交的數據,所以不用進行url編碼,是POST原文
3.MySQL命令行:
執行沒問題
三、注釋符:/**/
因為注釋符#、-- 都是把后面的語句全部注釋掉了,而內聯注釋/**/則是注釋指定部分,需要一前一后閉合,所以在傳參那里幾乎不做注釋語句用,而是用於過濾空格等bypass,如:
?id=-1'/**/union/**/select/**/1,2,database()--+ //過濾空格,用/**/代替空格
其他注釋方式
四、注釋方式:payload結尾單引號閉合
第一關(GET提交方式)
1.URL:
http://localhost/sqlilabs/Less-1/?id=-1' union select 1,2,database()'
執行沒問題
2.burpsuite:
傳輸過程對單引號還有空格進行了url編碼
3.MySQL命令行:
執行沒問題
第十一關(POST提交方式)
1.POST參數:
uname=vdf&passwd=-ad' union select 1,database()'&submit=Submit
執行沒問題
2.burpsuite:
因為是POST提交的數據,所以不用進行url編碼,是POST原文
3.MySQL命令行:
執行沒問題
五、結論
(GET提交方式):
-- (后面有空格)
%23
payload結尾單引號閉合
(POST提交方式):
-- (后面有空格)
#
payload結尾單引號閉合
全文手打,各位看官覺得有用就點個贊唄