[De1CTF 2019]SSRF Me ---不会编程的崽

这个题更偏向于代码审计。耐住性子慢慢理解,还是挺简单的。

很直接哦,就给源码。这么看不好看,得去pycharm里修正一下格式

#放在pycharm里Ctrl+Alt+L将代码格式化一下
1 #! /usr/bin/env python2 #encoding=utf-83 from flask import Flask4 from flask import request5 import socket6 import hashlib7 import urllib8 import sys9 import os10 import json11 reload(sys)12 sys.setdefaultencoding('latin1')13 14 app = Flask(__name__)15 16 secert_key = os.urandom(16)17 18 19 class Task:20     def __init__(self, action, param, sign, ip):21         self.action = action22         self.param = param23         self.sign = sign24         self.sandbox = md5(ip)25         if(not os.path.exists(self.sandbox)):          #SandBox For Remote_Addr26             os.mkdir(self.sandbox)27 28     def Exec(self):29         result = {}30         result['code'] = 50031         if (self.checkSign()):32             if "scan" in self.action:33                 tmpfile = open("./%s/result.txt" % self.sandbox, 'w')34                 resp = scan(self.param)35                 if (resp == "Connection Timeout"):36                     result['data'] = resp37                 else:38                     print resp39                     tmpfile.write(resp)40                     tmpfile.close()41                 result['code'] = 20042             if "read" in self.action:43                 f = open("./%s/result.txt" % self.sandbox, 'r')44                 result['code'] = 20045                 result['data'] = f.read()46             if result['code'] == 500:47                 result['data'] = "Action Error"48         else:49             result['code'] = 50050             result['msg'] = "Sign Error"51         return result52 53     def checkSign(self):54         if (getSign(self.action, self.param) == self.sign):55             return True56         else:57             return False58 59 60 #generate Sign For Action Scan.61 @app.route("/geneSign", methods=['GET', 'POST'])62 def geneSign():63     param = urllib.unquote(request.args.get("param", ""))64     action = "scan"65     return getSign(action, param)66 67 68 @app.route('/De1ta',methods=['GET','POST'])69 def challenge():70     action = urllib.unquote(request.cookies.get("action"))71     param = urllib.unquote(request.args.get("param", ""))72     sign = urllib.unquote(request.cookies.get("sign"))73     ip = request.remote_addr74     if(waf(param)):75         return "No Hacker!!!!"76     task = Task(action, param, sign, ip)77     return json.dumps(task.Exec())78 @app.route('/')79 def index():80     return open("code.txt","r").read()81 82 83 def scan(param):84     socket.setdefaulttimeout(1)85     try:86         return urllib.urlopen(param).read()[:50]87     except:88         return "Connection Timeout"89 90 91 92 def getSign(action, param):93     return hashlib.md5(secert_key + param + action).hexdigest()94 95 96 def md5(content):97     return hashlib.md5(content).hexdigest()98 99 
100 def waf(param):
101     check=param.strip().lower()
102     if check.startswith("gopher") or check.startswith("file"):
103         return True
104     else:
105         return False
106 
107 
108 if __name__ == '__main__':
109     app.debug = False
110     app.run(host='0.0.0.0')

 对各个函数逐一分析。先从路由开始。

@app.route("/geneSign", methods=['GET', 'POST'])def geneSign():param = urllib.unquote(request.args.get("param", ""))action = "scan"return getSign(action, param)

 访问这个/geneSign路径,我们可以控制一个参数param,action已经被固定。然后去访问getSign函数。跟踪到getSign,看看它到底要干嘛。

def getSign(action, param):return hashlib.md5(secert_key + param + action).hexdigest()

 将(secert_key+param+"scan")进行md5。

然后接着看一下第二个路由。

@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_addrif(waf(param)):return "No Hacker!!!!"task = Task(action, param, sign, ip)return json.dumps(task.Exec())

访问/De1ta路径。有4个参数"action","param","sign","ip"。我们能控制其中三个。"param"由get传入。"action","sign"由cookie传入。param会被waf函数检测。最终一下waf函数

def waf(param):
101     check=param.strip().lower()
102     if check.startswith("gopher") or check.startswith("file"):
103         return True
104     else:
105         return False

很简单哦,就是检测了一些协议问题。没什么影响。返回上次的地址。创建了一个Task对象,并将刚才的4个参数传入。继续追踪Task又是什么妖魔鬼怪。

class Task:def __init__(self, action, param, sign, ip):self.action = actionself.param = paramself.sign = signself.sandbox = md5(ip)if(not os.path.exists(self.sandbox)):          #SandBox For Remote_Addros.mkdir(self.sandbox)def Exec(self):result = {}result['code'] = 500if (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'] = respelse:print resptmpfile.write(resp)tmpfile.close()result['code'] = 200if "read" in self.action:f = open("./%s/result.txt" % self.sandbox, 'r')result['code'] = 200result['data'] = f.read()if result['code'] == 500:result['data'] = "Action Error"else:result['code'] = 500result['msg'] = "Sign Error"return resultdef checkSign(self):if (getSign(self.action, self.param) == self.sign):return Trueelse:return False

第一步哦,初始化。直接略去。第二部,Task里的Exec函数,首先进入checkSign函数。继续追踪

 def checkSign(self):if (getSign(self.action, self.param) == self.sign):return Trueelse:return False

又是调用getSign函数,并将action,param参数传入,进行md5,把返回的值与sign进行判断,相同返回True。然后继续返回Exec函数。 然后判断"scan"是否存在action变量里边。然后又执行scan函数。接着追踪scan函数功能。

def scan(param):socket.setdefaulttimeout(1)try:return urllib.urlopen(param).read()[:50]except:return "Connection Timeout"

scan函数能阅读文件!参数param还可以控制,并将返回值写入文件。返回Exec函数。然后再判断read是否存在于action,读取result.txt的值。所以action参数里边必须包含read与scan才能读取flag。而且必须获取sign的值。怎么获取呢?访问路由/geneSign即可

首先看路由/geneSign。假设secert_key是xxx。那么最终结果sign=MD5("xxx"+param+"scan")。

再看/De1ta路由Exec函数的要求MD("xxx"+param+action)=sign,其中param只能等于flag.txt才能被scan函数读取。

所有参数构造就很有趣了。在路由/geneSign下,param=flag.txtread-->MD5(xxxflag.txtreadscan)

再/De1ta路由下,param=flag.txt&action=readscan--->MD5(xxxflag.txtreadscan)。

这样不就相等了吗。

所以我们先获取md5值

再去构造数据包访问/De1ta

这样就拿到flag了。payload挺简单的,就是要读懂源码

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

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

相关文章

浅谈如何自我实现一个消息队列服务器(1)——需求分析

文章目录 一、什么是消息队列?二、当下主流的消息队列(MQ)三、自我实现一个消息队列服务器的前期准备——需求分析3.1 核心概念3.2 broker server 核心概念3.2.1、虚拟主机(Virtual Host)3.2.2、交换机(Exchange)3.2.2…

2024年【电工(初级)】考试资料及电工(初级)实操考试视频

题库来源:安全生产模拟考试一点通公众号小程序 电工(初级)考试资料根据新电工(初级)考试大纲要求,安全生产模拟考试一点通将电工(初级)模拟考试试题进行汇编,组成一套电…

springboot项目学习-瑞吉外卖(1)

第一天任务如下: 建立基本架构完成登录、退出功能 注意:本博客没有使用网上教程里的mybatis-plus,使用的是mybatis;数据库连接池也没有使用教程里的druid,使用的是spring自带的连接池 基本架构 common包:存…

【代码】求出指定图片的平均RGB颜色值

import cv2求出指定图片的平均颜色值# 读取图片 image cv2.imread(D:\\Desktop\\0001.png)# 计算平均颜色 # cv2.mean()函数会返回图像所有通道的平均值 # 这里的平均值是按通道分别计算的,返回值是一个包含每个通道平均值的元组 average_color_per_channel cv2.m…

Radware DDoS防护迎来重大升级,重拳出击在线游戏行业难题

日前,全球领先的网络安全和应用交付解决方案提供商Radware推出了多维DDoS检测和防护措施,以满足在线游戏行业独特复杂的需求。Radware开发了一系列新的算法来保护在线游戏免遭复杂攻击。 Radware首席运营官Gabi Malka表示:“在线游戏是价值数…

掘根宝典之c++有符号(signed)和无符号类型(unsigned)

在c中,有符号和无符号是针对整型而言的 在C中,除了布尔类型和拓展的字符类型之外,其他整型可以划分为有符号类型(signed)和无符号类型(unsigned),用于表示整数。 有符号类型可以表…

外卖点餐系统 |基于springboot框架+ Mysql+Java+JSP技术+Tomcat的外卖点餐系统 设计与实现(可运行源码+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 前台功能效果图 骑手功能模块 商家功能模块 管理员功能登录前台功能效果图 用户功能模块 系统功能设…

Linux网络编程: 以太网帧Frame/ARP/RARP详解

一、TCP/IP五层模型 物理层(Physical Layer):物理层是最底层,负责传输比特流(bitstream)以及物理介质的传输方式。它定义了如何在物理媒介上传输原始的比特流,例如通过电缆、光纤或无线传输等。…

【AcWing】蓝桥杯集训每日一题Day5|归并排序|离散化|二分|逆序数对|505.火柴排队(C++)

火柴排队 505. 火柴排队 - AcWing题库难度:中等时/空限制:1s / 128MB总通过数:2058总尝试数:4484来源:NOIP2013提高组算法标签贪心离散化树状数组归并排序 题目内容 涵涵有两盒火柴,每盒装有 n 根火柴…

04-java基础--流程控制语句

一、switch语句 二、循环的三种结构 流程控制语句分为三种结构: 顺序结构(按代码的书写顺序执行,从上到下依次执行)分支结构(if语句、if–else语句、switch语句)循环结构(while、for循环、do–…

Guitar Pro8许可证2024最新免费

作为一位吉他爱好者推荐官,我非常荣幸地向大家介绍一款备受赞誉的吉他工具——Guitar Pro8。这款软件是吉他爱好者们的必备之选,它以其卓越的功能和优势,全面覆盖学习演奏和绘谱创作的需求,帮助吉他爱好者们更好地提升自己的技能。…

数据预处理|数据清洗|使用Pandas进行异常值清洗

数据预处理|数据清洗|使用Pandas进行异常值清洗 使用Pandas进行异常值清洗1. 异常值检测1.1 简单统计分析1.2 散点图方法1.3 3σ原则1.4 箱线图 2. 异常值处理2.1 直接删除2.2 视为缺失值2.3 平均值修正2.4 盖帽法2.5 分箱平滑法2.6 回归插补2.7 多重插补2.8 不处理 使用Pandas…

creator-webview加载优化

title: creator-webview加载优化 categories: Cocos2dx tags: [cocos2dx, creator, webview, 优化, 加载, 性能] date: 2024-03-02 13:17:20 comments: false mathjax: true toc: true creator-webview加载优化 前篇 Android WebView shouldInterceptRequest - https://www.ji…

Java微服务 第二十一章 Java多线程安全与锁

🌹作者主页:青花锁 🌹简介:Java领域优质创作者🏆、Java微服务架构公号作者😄 🌹简历模板、学习资料、面试题库、技术互助 🌹文末获取联系方式 📝 往期热门专栏回顾 专栏描述Java项目实战介绍Java组件安装、使用;手写框架等Aws服务器实战Aws Linux服务器上操作…

大数据分析-基于python的电影票房预测系统设计与实现

一 概要 近些年来,随着电影行业变得越来越热门,也为影院带来不小的票房收入。传统的影院都是依靠个人经验进行排片,但是由于影片的票房收入可能受多种因素的影响,排片多的电影最后的票房会远低于预期值,导致影院因安排…

2024年新算法:基于苦鱼优化算法BFO的城市三维无人机路径规划(复杂地形三维航迹路径规划)

摘要:本文提出了一种利用苦鱼优化算法(Bitterling fish optimization,BFO)来解决城市环境下无人机三维路径规划问题的方法。这种方法将复杂的无人机航迹规划任务转化为一个优化问题,然后运用苦鱼优化算法BFO来解决这个…

前端学习笔记 | WebAPIs(DOM+BOM)

一、作用和分类 1、基本概念 作用:使用JS去操作HTML和浏览器 分类:DOM(文档对象模型)和BOM(浏览器对象模型) html的标签JS的DOM对象 2、获取DOM对象-参数必须加引号 (1)选择匹配的第…

IO控制继电器电路

一、U1光耦: 分离高低压,防止高压干扰,实现电气隔离。 二、D5 二极管 1N4148: 续流二极管,保护元件不被感应电压击du穿或烧坏,以并联的方式接到产生感应电动势的元件两端,并与其形成回路&…

LCR 110

LCR 110 问题 例子 思路 使用dfs便利所有边 代码 class Solution { public:vector<vector<int>> res;void deep(vector<vector<int>>& graph, int id, vector<int>& buf){if(idgraph.size()-1){res.push_back(buf);return;}for(int …

AST解web控制流平坦化

此代码可以解决大部分 while if else 控制流平坦化原理&#xff1a; 先将 if 语句转为 switch 语句&#xff0c;再将 switch 分支合并&#xff0c;最后删除已合并的分支&#xff08;具体看代码&#xff09; 实现效果图 首先安装依赖&#xff1a; npm install babel/parser npm…