SQL注入注釋符(#、-- 、/**/)使用條件及其他注釋方式的探索


  以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結尾單引號閉合

 

全文手打,各位看官覺得有用就點個贊唄

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM