压缩包解压里面是一个 access.log 日志文件。
捋数据
进行过远程命令执行
这个后续没啥用
可疑字符串
可疑字符串/upload/ma.php?log=var_dump(%27cGFzc3dvcmQ6IHNAZncjdiVmOQ==%27);
这个首先就判断是不是base64编码(英文大小写、数字和+、/)以及用作后缀等号,字符串长度一定可以被4整除)
对内容cGFzc3dvcmQ6IHNAZncjdiVmOQ==
解码得到:password: s@fw#v%f9
大量的sqlmap的盲注日志
分析查询了
- 数据库名
- 数据库的表名
- 表名为logdata的字段名
- logdata表的id和data值(0x7e为波浪线)
- flag表的字段名
- flag表的flag字段的值。
细节:这里可以看到这是在用 二分法 进行 sql盲注
每一条语句返回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=fileself.pattern=patternif filter is not None:self.filter()def filter(self,filter=None):if filter is not None:self.filter=filterwith open(self.file) as f:for x in f.readlines():lenf=len(filter)for f in filter:if f in x:lenf=lenf-1if lenf==0:x=urllib.parse.unquote(x)self.ll.append(x)return selfdef getLine(self): return self.ll#[0]def match(self,pattern=None):if pattern is not None:self.pattern=patterndata_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