ctf 一题日志审计题

 

打开日志看下,前面看不出什么,但是最后面就很明显,url解码后是sq盲注

这是按照一般流程去盲注找出数据库、表、字段及它们的长度。

所以直接跳过

直到这附近,

随便打开一个解码

3' OR NOT ORD(MID((SELECT IFNULL(CAST(COUNT(*) AS CHAR),0x20) FROM flag.flag),1,1))>48#

 

这是对flag的每个字符判断其ascii值,本来应该是通过响应状态码来判断是否成功,但是所有的状态码200,但是

可以对几个大概判断出4000左右的都为正确,5000的为错误的

 

由于python不熟,我先在文本中直接提取出所有盲注flag的响应,再通过脚本实现

!/usr/bin/env python3
# -*- coding: utf-8 -*-
import re
import urllib

# 将access.log中的id参数值url解码,以及状态放入log.txt中
f = open("log.txt", "w+")
fa = open("access.log", "r+")

datapat = re.compile('id=(.+?)&Submit')

line = fa.readline()
# print line
list = [];
while line:
    # print datapat.findall(line)
    data = datapat.findall(line)
    if line.find('200 5') == -1:
        list.append([data[0], '200'])
    print data[0]
    line = fa.readline()

for i in list:
    decode = urllib.unquote(i[0])
    f.writelines(decode+'    '+i[1]+'\n')

f.close()
fa.close()

 

获取到log.txt,这是把access.log里成功的响应包提取出来,再来个脚本推算,比如第一个字符,4条数据,找出最大的那个即101加1即可得出该字符,具体可以看我另一张博客,其实都差不多的2333.

https://blog.csdn.net/qq_40519543/article/details/107135902

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import re



f = open('log.txt','r+')
line = f.readline()
flag = ''
for i in range(1,40):
    d = re.compile(str(i)+',1\)\)>(.+?)#')
    tmp = 0
    while line:
        data = d.findall(line)
        if data:
            # print data
            if int(data[0]) >= tmp:
                tmp = int(data[0])+1
            line = f.readline()
        else:
            break
    flag = flag + chr(tmp)
print flag

 

posted @ 2020-07-16 23:16  为之。  阅读(866)  评论(0编辑  收藏  举报