Fork me on GitHub

Bugku-CTF分析篇-日志审计(请从流量当中分析出flag)

日志审计

请从流量当中分析出flag
 
 
本题要点:sql盲注、python脚本编写、python正则表达式
 
 
先下载压缩包,解压发现里面是一个 access.log 日志文件。
 
 
 
用 notepad++ 打开更清晰明了一些~
 
 
 
用 notepad++ 的插件中的  MIME Tool  中的  URL decode  解一下码~
 
 
 
然后就能清楚的看出来 是在进行  sql 盲注 操作~
 
 
 
为了便于刚开始玩ctf的小伙伴们理解这道题目,简单解释一下sql盲注的过程~
 
若有描述错误,请各位大佬指正!
 
 sql盲注的过程 :
 
1.测试有没有注入漏洞
 
这个就类似  and 1=1,页面返回正常:
 
 
这个就类似 and1=2,页面返回错误或空白页等情况:
 
 
2.对数据库表名、字段名、查询数据、用户名猜解等操作
 
这里我们可以看到这是在用 二分法 在进行 sql盲注。
 
 
 
 
每一条语句返回的状态码有 200 和 404  。
我们可以看到 200状态码对应的ASCII值是1765 , 404状态码对应的ASCII值是5476 。
 
这一步有利于后面编写解码脚本。
 
 
 
我们往后继续看~
看到有 flag_is_here 的记录...
 
如何判断flag的第一个字符呢?
 
在sql盲注里测试的字符的 最后一条状态码为 200 的语句 的ASCII值再加1就是猜解正确的ASCII值,转换成字符就是我们需要的答案的其中一个字符。
 
下面以第一个字符作为例子:
flag_is_here ORDER BY flag LIMIT 0,1),1,1))>64 AND 'RCKM'='RCKM&Submit=Submit HTTP/1.1" 200 1765
flag_is_here ORDER BY flag LIMIT 0,1),1,1))>96 AND 'RCKM'='RCKM&Submit=Submit HTTP/1.1" 200 1765
flag_is_here ORDER BY flag LIMIT 0,1),1,1))>112 AND 'RCKM'='RCKM&Submit=Submit HTTP/1.1" 404 5476
flag_is_here ORDER BY flag LIMIT 0,1),1,1))>104 AND 'RCKM'='RCKM&Submit=Submit HTTP/1.1" 404 5476
flag_is_here ORDER BY flag LIMIT 0,1),1,1))>100 AND 'RCKM'='RCKM&Submit=Submit HTTP/1.1" 200 1765
flag_is_here ORDER BY flag LIMIT 0,1),1,1))>102 AND 'RCKM'='RCKM&Submit=Submit HTTP/1.1" 404 5476
flag_is_here ORDER BY flag LIMIT 0,1),1,1))>101 AND 'RCKM'='RCKM&Submit=Submit HTTP/1.1" 200 1765
 
我们可以看到当 LIMIT 0,1),1,1))>101 时,是第一个字符的最后一个 状态码为 200  的语句,这时的ASCII码是 101 ,那么 101+1=102 ,ASCII码为 102 对应的是  f  ,因此flag的第一个字符就为  f  
 
 
下面多看几个例子,红框中就是每个字符的最后一个状态码为 200 的语句。
 
101+1=102 -->f
107+1=108 -->l
96+1=97 -->a
102+1=103 -->g 
......
 
由于字符比较多,我们就不一一列举了,以上就是flag的前四个字符。
 
 
 
从上图看,这个flag就25个字符。
 
( 如果写不出脚本,也可以用手工的方法,一个一个的记下 flag 每一个 字符的 ascii 值,然后+1,对应ASCII表......qwq)
 
 
下面是参考了一个大佬写的脚本:
 
# coding:utf-8
import re
import urllib
 
f = open('D:/access.log','r')  # 下载的access.log文件的绝对路径,笔者是存在了d盘根目录下~
lines = f.readlines()
datas = []
for line in lines:
    t = urllib.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

 

 
以下摘自 菜鸟教程 :
 
 
 
 
 
 注意:以上脚本需要在python2的环境下运行哦~ 
 
然后就得到flag啦~~!
 
 
 flag{sqlm4p_15_p0werful} 
 
 
 
 
 
参考资料:
 
https://www.runoob.com/python/python-reg-expressions.html
https://blog.csdn.net/vhkjhwbs/article/details/102612656#6
https://tool.oschina.net/commons?type=4
https://www.freebuf.com/tag/sql盲注
 
 
 
 
 
 
posted @ 2020-02-17 15:59  0yst3r  阅读(10729)  评论(6编辑  收藏  举报
返回顶部