2023泉城杯 easy_log的解题

压缩包解压里面是一个 access.log 日志文件。

捋数据

进行过远程命令执行

在这里插入图片描述
这个后续没啥用

可疑字符串

在这里插入图片描述

可疑字符串/upload/ma.php?log=var_dump(%27cGFzc3dvcmQ6IHNAZncjdiVmOQ==%27);这个首先就判断是不是base64编码(英文大小写、数字和+、/)以及用作后缀等号,字符串长度一定可以被4整除)
对内容cGFzc3dvcmQ6IHNAZncjdiVmOQ==解码得到:password: s@fw#v%f9

大量的sqlmap的盲注日志

分析查询了

  1. 数据库名
  2. 数据库的表名
  3. 表名为logdata的字段名
  4. logdata表的id和data值(0x7e为波浪线)
  5. flag表的字段名
  6. flag表的flag字段的值。

细节:这里可以看到这是在用 二分法 进行 sql盲注
2023泉城杯 easy_log的解题_第1张图片
每一条语句返回200,但返回字节长度不同分别为699 704可以区分查询语句是否满足查询条件,盲注这次采用的是ascii码的大于校验方式,因此,满足条件时返回699 不满足时返回704

知识点:
sql盲注二分法里测试的字符的 最后一条满足的条件的语句的ASCII值再加1就是猜解正确的ASCII值(或者最后一次不满足条件的ASCII值)

最后的一点儿,没啥用

在这里插入图片描述

盲注数据获取:

采取脚本方式,如下:

#简化版,正则匹配后,直接出结果
import urllib.parse,re
def logAnalysis_SQLBlindInjection(file,pattern):
    with open(file) as f:
        data_ascii = {}
        for x in f.readlines():#遍历行
                #x=urllib.parse.unquote(x) # 转码,放开的话。调用时pattern处需做相应的调整
                mo = re.search(pattern,x)   # 在x中搜索符合正则表达的字符串并将匹配的字符串存入变量mo中
                if mo:
                    key = int(mo.group(1))  # mo 中 的第一个括号里的内容 (也就是上条语句中的 (.*?)中的内容)并转为10进制
                    data_ascii[key] = int(mo.group(2))+1# 取变量mo中的第二个括号里的内容,并转为 10 进制使用字典,保存最后一次猜解正确的ascii码
        data = ''
        for value in data_ascii.values():
            data += chr(value)
        print(data) #输出结果
#对主要内容结果进行拼接
rzfx('access.log',r'logdata\),(.*?),1\)\)%3E(.*?) .*699')
rzfx('access.log',r'flag\),(.*?),1\)\)%3E(.*?) .*699')

在这里插入图片描述

#第二版 后续再完善
import urllib.parse,re
class llfx():
    #文件,查询内容
    def __init__(self,file,filter=None,pattern=r'\),(.*?),1\)\)>(.*?) '):
        self.ll=[]
        self.file=file
        self.pattern=pattern
        if filter is not None:
            self.filter()

    def filter(self,filter=None):
        if filter is not None:
            self.filter=filter

        with open(self.file) as f:
            for x in f.readlines():
                lenf=len(filter)
                for f in filter:
                    if f in x:
                        lenf=lenf-1
                if lenf==0:
                    x=urllib.parse.unquote(x)
                    self.ll.append(x)
        return self

    def getLine(self):   
        return self.ll#[0]

    def match(self,pattern=None):
        if pattern is not None:
           self.pattern=pattern
        data_ascii = {}  
        for d in self.ll:
            mo = re.search(self.pattern,d)   # 在date 中搜索符合正则表达的字符串并 将匹配的字符串存入变量m中
            if mo:
                # print(mo)
                key = int(mo.group(1))  # m 中 的第一个括号里的内容 (也就是上条语句中的 (.*?)中的内容)并转为10进制
                value = int(mo.group(2))+1  # 取变量m中的第二个括号里的内容,并转为 10 进制
                # print(value)
                data_ascii[key] = value     # 使用字典,保存最后一次猜解正确的ascii码
        data = ''
        for value in data_ascii.values():
            data += chr(value)
        print(data)
        return data

获得到一串字符
504b03041400090063004da8cf56cbeaad37460000002800000008000b00666c61672e7478740199070001004145030800299502e8ee56d83e35f0a1699140c37d4fe9e7663ff2f00a8db6bbec32c1acb0ac871dc920e2b1bf4439325f70d9acd3483fcc141c9504561431a1eff00430c0cadf9131913c504b0708cbeaad374600000028000000504b01021f001400090063004da8cf56cbeaad37460000002800000008002f000000000000002000000000000000666c61672e7478740a00200000000000010018004982f2a2899fd9016101122b8a9fd90124a9e42a8a9fd9010199070001004145030800504b0506000000000100010065000000870000000000

flag数据的分析与处理

首先,看字符串的内容0-f 得知其是16进制字符串。
看flag数据为504b0304开头,确认它是zip压缩包(压缩包格式504B0304表示开始,504B0506表示结束)
16进制字符串数据转zip,直接转会报错,zip结尾504b0506,所以把后面的多余字符去掉了

with open("flag.zip", "wb") as f:
    f.write(bytes.fromhex(x))

生成压缩包后,输入密码s@fw#v%f9得到最终flag
2023泉城杯 easy_log的解题_第2张图片

你可能感兴趣的:(CTF)