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盲注
--------------------- ┑( ̄Д  ̄)┍ --------------------------
作者:0yst3r[一只在安全领域努力奋斗的小菜鸡]
来源:博客园[ https://www.cnblogs.com/0yst3r-2046/ ] 引用时请注明来源哦~
(๑•̀ㅂ•́)و✧ヽ(✿゚▽゚)ノ(*^▽^*) φ(≧ω≦*)♪
如果本文对你有用,本人不胜欢喜。
The world is your oyster.