打开这道题,日志审计,第一次接触这样的题目。
打开压缩包之后只有一个txt文件。
打开这个文件就是密密麻麻
用Sublime打开之后,
比较清晰一点。
找到其中有URL类型的语句,
解码之后看看。
其他的语句也一样,不难想到是sql注入类型的语句,
可以搜索一下flag,
真的有一堆的语句,将这部分复制下来,进行URL解码,
有ORD(MID)表示用二分法盲注,观察到后面有200,404 之类的状态码。404很明显的就是不成功,200就是成功的,比如 LIMIT 0,1),1,1))>101,这里的101,网上大佬说是ascii码。根据对照表,
因为这里观察到LIMIT 0,1),1,1))> 的最后一个200是101,比如101 是e,他说要大于101,也就是加一之后,为102,所以102就是正确的flag字符,102对应的是f,以此类推。找到LIMIT 0,1),2,1))> 的最后一个200成功字符为107,107+1 = 108,对应l。
拉到最后,看到
这个flag应该有25个字符,
使用大佬的代码
import re
import urllib.parse
f = open('C:\\Users\\apple\Desktop\\5b0b08e0-31aa-4a8d-ae19-89b843554506\\access.log', 'r') # 下载的access.log文件的绝对路径,笔者是存在了d盘根目录下~
lines = f.readlines()
datas = []
for line in lines:
t = urllib.parse.unquote(line) # 就是将文本进行 urldecode 解码
if '1765' in t and 'flag' in t: # 过滤出与flag相关,正确的猜解(只要200的)
datas.append(t)
flag_ascii = {}
for data in datas:
matchObj = re.search(r'LIMIT 0,1\),(.*?),1\)\)>(.*?) AND', data) # 在date 中搜索符合正则表达的字符串并 将匹配的字符串存入变量 matchObj 中
if matchObj:
key = int(matchObj.group(1)) # 取变量matchObj 中 的第一个括号里的内容 (也就是上条语句中的 (.*?)中的内容)并转为10进制
value = int(matchObj.group(2)) + 1 # 取变量matchObj中的第二个括号里的内容,并转为 10 进制
flag_ascii[key] = value # 使用字典,保存最后一次猜解正确的ascii码
flag = ''
for value in flag_ascii.values():
flag += chr(value)
print(flag)
直接出现结果,
flag{sqlm4p_15_p0werful}
这个代码还是很好理解的,就是很懒,懒得写。这个得克服啊。
欢迎关注我的微信公众号!!~~
一起快落学习CTF吧!!~~ (*^▽^*)
吾日三省吾身,为人谋而不忠乎?与朋友交而不信乎?传不习乎?