2023泉城杯 easy_log的解题

压缩包解压里面是一个 access.log 日志文件。

捋数据

进行过远程命令执行

在这里插入图片描述
这个后续没啥用

可疑字符串

在这里插入图片描述

可疑字符串/upload/ma.php?log=var_dump(%27cGFzc3dvcmQ6IHNAZncjdiVmOQ==%27);这个首先就判断是不是base64编码(英文大小写、数字和+、/)以及用作后缀等号,字符串长度一定可以被4整除)
对内容cGFzc3dvcmQ6IHNAZncjdiVmOQ==解码得到:password: s@fw#v%f9

大量的sqlmap的盲注日志

分析查询了

  1. 数据库名
  2. 数据库的表名
  3. 表名为logdata的字段名
  4. logdata表的id和data值(0x7e为波浪线)
  5. flag表的字段名
  6. 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
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/90948.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Little Kernel代码学习笔记

目录 虚拟地址转换为物理地址内核启动Multiboot头部结构启动时的寄存器状态real_start段选择子初始化BSS段 页表转换设置CR4、CR3、EFER寄存器设置页表映射 初始化IDT,执行lk_main 虚拟地址转换为物理地址 // start.S#define PHYS_LOAD_ADDRESS (MEMBASE KERNEL_L…

基于MATLAB开发AUTOSAR软件应用层Code mapping专题-part 6 Data Transfers标签页介绍

这篇文章我们介绍下Data Transfers页的配置,这里边包含的内容是IRV,我之前的文章里有讲解过IRV就是 Inter-Runnable Variables,内部runnable的之间传递数据的变量,在讲解Data Store memory的文章里我们提到了,irv也可以使用Data Store memory的方式来实现,我们先看下IRV如何…

【Java 高阶】一文精通 Spring MVC - 转发重定向(四)

👉博主介绍: 博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家,51CTO 专家博主 ⛪️ 个人社区&#x…

百望云华为云共建零售数字化新生态 聚焦数智新消费升级

零售业是一个充满活力和创新的行业,但也是当前面临很大新挑战和新机遇的行业。数智新消费时代,数字化转型已经成为零售企业必须面对的重要课题。 8 月 20 日-21日,以“云上创新 韧性增长”为主题的华为云数智新消费创新峰会2023在成都隆重召…

HTML总结1【转】

以下内容转载和参考自:w3school的HTML学习内容,HTML 简介 。 一、概述 HTML不是一种编程语言,它是超文本标记语言 (Hyper Text Markup Language),使用标记标签来描述网页内容。HTML标签是由尖括号包围的关键词,标签通…

Springboot开发所遇问题(持续更新)

SpringBoot特征: 1. SpringBoot Starter:他将常用的依赖分组进行了整合,将其合并到一个依赖中,这样就可以一次性添加到项目的Maven或Gradle构建中。 2,使编码变得简单,SpringBoot采用 JavaConfig的方式对Spring进行配置…

【mysql是怎样运行的】-EXPLAIN详解

文章目录 1.基本语法2. EXPLAIN各列作用1. table2. id3. select_type4. partitions5. type 1.基本语法 EXPLAIN SELECT select_options #或者 DESCRIBE SELECT select_optionsEXPLAIN 语句输出的各个列的作用如下: 列名描述id在一个大的查询语句中每个SELECT关键…

二叉树的层序遍历及完全二叉树的判断

文章目录 1.二叉树层序遍历 2.完全二叉树的判断 文章内容 1.二叉树层序遍历 二叉树的层序遍历需要一个队列来帮助实现。 我们在队列中存储的是节点的地址,所以我们要对队列结构体的数据域重定义, 以上代码 从逻辑上来讲就是1入队,1出队&am…

建模杂谈系列234 基于图的程序改造

说明 为了进一步提升程序设计与运维的可靠性,我觉得(目前看来)只有依赖图的结构。 提升主要包含如下方面: 1 程序结构的简洁性:节点和边2 程序执行的可视化:交通图(红、黄、绿)3 程序支持的逻辑复杂性。…

数据结构—循环队列(环形队列)

循环队列(环形队列) 循环队列的概念及结构循环队列的实现 循环队列的概念及结构 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。…

用Cmake build OpenCV后,在VS中查看OpenCV源码的方法(环境VS2022+openCV4.8.0) Part II

用Cmake build OpenCV后,在VS中查看OpenCV源码的方法 Part II 用Cmake build OpenCV后,在VS中查看OpenCV源码的方法(环境VS2022openCV4.8.0) Part I_松下J27的博客-CSDN博客 在上一篇文章中,我用cmake成功的生成了ope…

设计模式三原则

1.1单一职责原则 C 面向对象三大特性之一的封装指的就是将单一事物抽象出来组合成一个类,所以我们在设计类的时候每个类中处理的是单一事物而不是某些事物的集合。 设计模式中所谓的单一职责原则,就是对一个类而言,应该仅有一个引起它变化的原…

我的128天创作纪念日-东离与糖宝

文章目录 机缘收获日常成就憧憬 不知不觉我也迎来了自己的128天创作纪念日,一起来看看我有什么想对大家说的吧 机缘 我的写博客之旅始于参加了代码随想录算法训练营。在训练营期间,代码随想录作者卡尔建议我们坚持每天写博客记录刷题学习的进度和心得体…

【LeetCode-中等题】240. 搜索二维矩阵 II

文章目录 题目方法一:暴力双for查找方法二:二分查找,对每二维数组进行拆分,一行一行的进行二分查找方法三:列倒序Z字形查找 题目 方法一:暴力双for查找 public boolean searchMatrix(int[][] matrix, int …

Java版B/S架构 智慧工地源码,PC、移动、数据可视化智慧大屏端源码

智慧工地是什么?智慧工地主要围绕绿色施工、安全管控、劳务管理、智能管理、集成总控等方面,帮助工地解决运营、管理方面各个难点痛点。在互联网的加持下促进项目现场管理的创新与发展,实现工程管理人员与工程施工现场的整合,构建…

系统架构师---软件重用、基于架构的软件设计、软件模型

目录 软件重用 构件技术 基于架构的软件设计 ABSD方法与生命周期 抽象功能需求 用例 抽象的质量和业务需求 架构选项 质量场景 约束 基于架构的软件开发模型 架构需求 需求获取 标识构件 需求评审 架构设计 架构文档 架构复审 架构实现 架构演化 前言&…

什么是响应式设计(Responsive Design)?如何实现一个响应式网页?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 响应式设计(Responsive Design)⭐ 如何实现一个响应式网页?1. 弹性网格布局2. 媒体查询3. 弹性图像和媒体4. 流式布局5. 优化导航6. 测试和调整7. 图片优化8. 字体优化9. 渐进增强10. 面向移动优先11. …

一、Kafka概述

目录 1.1 定义1.2 消息队列1、传统消息队列的应用场景2、消息队列的两种模式 1.3 Kafka的基础架构 1.1 定义 Kafka传 统定义:Kafka是一个分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用于大数据实时处理领域。 K…

6、Spring_Junit与JdbcTemplate整合

Spring 整合 1.Spring 整合 Junit 1.1新建项目结构 1.2导入依赖 导入 junit 与 Spring 依赖 <!-- 添加 spring 依赖--> <dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version…

数据结构数组栈的实现

Hello&#xff0c;今天我们来实现一下数组栈&#xff0c;学完这个我们又更进一步了。 一、栈 栈的概念 栈是一种特殊的线性表&#xff0c;它只允许在固定的一端进行插入和删除元素的操作。 进行数据的插入和删除只在栈顶实现&#xff0c;另一端就是栈底。 栈的元素是后进先出。…