压缩包解压里面是一个 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=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