[De1CTF 2019]SSRF Me

算是我第一次正兒八經的分析python代碼了

from flask import Flask, request  
import socket
import hashlib
import urllib
import sys
import os
import jsonreload(sys)
sys.setdefaultencoding('latin1')app = Flask(__name__)  # 創建一個Flask應用實例
secret_key = os.urandom(16)  # 生成一個16字節的隨機密鑰# 定義一個名為Task的類,用于處理任務
class Task:def __init__(self, action, param, sign, ip):self.action = action  # 任務動作self.param = param    # 參數self.sign = sign      # 簽名self.sandbox = md5(ip)  # 根據IP生成一個唯一的沙盒目錄名if not os.path.exists(self.sandbox):os.mkdir(self.sandbox)  # 如果沙盒目錄不存在,創建它def Exec(self):result = {}result['code'] = 500  # 默認響應碼為500if self.checkSign():                      # 檢查簽名是否有效if "scan" in self.action:             # 如果任務動作是"scan",執行掃描操作tmpfile = open("./%s/result.txt" % self.sandbox, 'w')    #寫到result.txt文件resp = scan(self.param)  if resp == "Connection Timeout":result['data'] = respelse:print resptmpfile.write(resp)tmpfile.close()result['code'] = 200  # 執行成功,響應碼為200if "read" in self.action:                              #如果任務動作是"read"f = open("./%s/result.txt" % self.sandbox, 'r')    #讀result.txt文件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# 創建路由"/geneSign",用于生成簽名
@app.route("/geneSign", methods=['GET', 'POST'])
def geneSign():param = urllib.unquote(request.args.get("param", ""))action = "scan"return getSign(action, param)# 創建路由"/De1ta",用于處理任務
@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):  # 檢查是否觸發Web應用防火墻(WAF)return "No Hacker!!!!"task = Task(action, param, sign, ip)  # 創建任務對象return json.dumps(task.Exec())  # 返回任務執行結果的JSON表示# 創建根路由"/",用于返回文本文件內容
@app.route('/')
def index():return open("code.txt", "r").read()# 定義一個用于掃描URL的函數
def scan(param):socket.setdefaulttimeout(1)     # 設置超時時間try:return urllib.urlopen(param).read()[:50]  # 打開URL并讀取前50個字符except:return "Connection Timeout"# 生成簽名的函數
def getSign(action, param): return hashlib.md5(secret_key + param + action).hexdigest()# 計算MD5哈希的函數
def md5(content):return hashlib.md5(content).hexdigest()# waf
def waf(param):check = param.strip().lower()if check.startswith("gopher") or check.startswith("file"): return True  else:return Falseif __name__ == '__main__':app.debug = Falseapp.run(host='0.0.0.0', port=80)  # 啟動Flask應用,監聽在0.0.0.0的80端口上

這里出flag的邏輯就是通過scan掃到flag.txt然后寫入result.txt文件,再用read把result.txt的文件內容讀出來

如果我們想要讀flag.txt,就需要進行scan和read操作,而這兩個操作在Tack類中需要checkSign檢查(對比md5值),那我們就可以用/geneSign知道該md5值(有·return)

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

此時action為scan,所以我們param為flag.txtread

(這里加個read是因為我們在/De1ta中操作的時候需要read,來構建我們需要的sign)

這樣拼接之后就是 secret_keyflag.txtreadscan

because——> return hashlib.md5(secret_key + param + action).hexdigest()

def checkSign(self):
??????? if getSign(self.action, self.param) == self.sign:? # 驗證簽名是否匹配
??????????? return True
??????? else:
??????????? return False

這里就是把我們的action(readscan)和param(flag.txt)傳進去得到的結果和我們傳進去的sign比較

下一步:

讀flag:

這里param=flag.txt與action=readscan 拼接完后為 secret_keyflag.txtreadscan

和上文得到的md5值一致

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/907087.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/907087.shtml
英文地址,請注明出處:http://en.pswp.cn/news/907087.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Halcon 圖像預處理②

非線性圖像分段變化: 先窗體打開圖片 對數非線性變化: 結果圖像的亮度/對比度顯著增加 log_image(Image,LogImag1,e) 參數1:輸入圖像 參數2: 輸出圖像 參數3:底數 log_image(Image,LogImage2,0.1) 圖像結果亮度和…

云原生安全之網絡IP協議:從基礎到實踐指南

🔥「炎碼工坊」技術彈藥已裝填! 點擊關注 → 解鎖工業級干貨【工具實測|項目避坑|源碼燃燒指南】 一、基礎概念 IP協議(Internet Protocol)是互聯網通信的核心協議族之一,負責在設備間傳遞數據包。其核心特性包括&…

QML學習08Text

Text 1、顏色(color)2、獲取寬度和高度(contentWidth、contentHeight)3、字體格式(font)4、文本樣式(textFormat)5、超鏈接 1、顏色(color) //顏色Text {colo…

Python網絡編程深度解析

目錄 一、網絡編程概述 二、TCP與UDP協議詳解 1.TCP協議:可靠傳輸的基石 2.UDP協議:高效但不可靠的傳輸 3. TCP與UDP對比 三、Socket編程模型 1. Socket基礎 2.TCP服務器實現詳解 3. UDP服務器實現詳解 四、進階應用:簡易聊天程序 …

ElasticSearch導讀

ElasticSearch 簡介:ElasticSearch簡稱ES是一個開源的分布式搜素和數據分析引擎。是使用Java開發并且是當前最流行的開源的企業級搜索引擎,能夠達到近實時搜索,它專門設計用于處理大規模的文本數據和實現高性能的全文搜索。它基于 Apache Luc…

【后端高階面經:數據庫篇】18、分布式事務:如何在分庫分表中實現高性能與一致性?

一、分布式事務核心挑戰:分庫分表下的一致性困境 在分布式系統架構中,分庫分表通過將數據分散存儲提升了擴展性和性能,但卻打破了傳統單庫事務的邊界,使得分布式事務成為保障數據一致性的核心難題。其挑戰主要體現在以下三方面: 1.1 ACID特性的分布式撕裂 原子性(Atomi…

Tailwind css實戰,基于Kooboo構建AI對話框頁面(一)

在當今數字化時代,AI 助手已成為網站和應用不可或缺的一部分。本文將帶你一步步使用 Tailwind CSS 和 Kooboo 構建一個現代化的 AI 對話界面框。 一、選擇 Kooboo平臺 的核心優勢 智能提示:在輸入 class 屬性時,會自動觸發 Tailwind CSS 規則…

python學習day2:進制+碼制+邏輯運算符

進制 Python 中的進制表示與轉換 進制的基本概念 二進制、八進制、十進制、十六進制的定義與特點不同進制在計算機科學中的應用場景 Python 中的進制表示 二進制表示:使用 0b 前綴八進制表示:使用 0o 前綴十六進制表示:使用 0x 前綴示例…

ROS2學習(11)------ROS2通信接口

操作系統:ubuntu22.04 IDE:Visual Studio Code 編程語言:C11 ROS版本:2 ROS 2 提供了多種通信接口,用于節點之間的數據交換。這些接口主要包括話題(Topics)、服務(Services)、動作&…

STM32G0xx基于串口(UART)Ymodem協議實現OTA升級包括Bootloader、上位機、應用程序

STM32G0xx基于串口Ymodem協議實現OTA升級包括Bootloader、上位機、應用程序 例程說明一、串口相關的底層配置二、OTA相關的應用層三、Flash相關的操作四、Flash存儲參數相關五、核心部分Ymodem相關六、其他宏配置七、主函數八、使用Python合并文件九、測試結果有疑問歡迎加交流…

Jenkins實踐(6):配置“構建歷史的顯示名稱,加上包名等信息“

Jenkins實踐(6):配置“構建歷史的顯示名稱,加上包名等信息“ 版本:Jenkins 4.262.2 需求:想要在構建歷史中展示,本次運行的是哪個版本或哪個包 操作步驟: 1、先安裝插件Build Name and Description Setter 2、Set Build Name 3、構建歷史處查看展示 插件特性說明 安裝依賴…

快速解決azure aks aad身份和權限問題

現狀分析 AKS cluster 1.31.8啟用aad 身份驗證和kubernetes RBAC 當嘗試執行kubectl get node命令時,系統返回以下錯誤信息: Error from server (Forbidden): nodes is forbidden: User "357517e8-4df5-4daa-88b4-94a84d763ec5" cannot list…

【玩轉騰訊混元大模型】騰訊混元大模型AIGC系列產品深度體驗

【玩轉騰訊混元大模型】騰訊混元大模型AIGC系列產品深度體驗 騰訊推出的系列AI產品:混元大模型、大模型圖像創作引擎、大模型視頻創作引擎、騰訊元寶,共同構成了一個強大的AI生態系統;憑借騰訊自研的大規模預訓練技術和先進的自然語言處理、計…

(自用)Java學習-5.13(Redis,OSS)

核心功能實現 1. 類別導航動態加載 前端實現&#xff1a; // 加載一級分類 $.ajax({url: /category/showFirstMenu?pid0,success: function(resp) {resp.forEach(item > {$(".index-menu").append(<li onmouseover"showSecondMenu(${item.id})">…

2025電工杯A題電工杯數學建模思路代碼文章教學:光伏電站發電功率日前預測問題

完整內容請看文章最下面的推廣群 已更新數據、思路和模型 問題1&#xff1a;基于歷史功率的光伏電站發電特性分析 建模與求解思路&#xff1a; 首先&#xff0c;需要收集光伏電站的歷史發電功率數據、地理位置信息&#xff08;經緯度、海拔、傾角等&#xff09;以及太陽輻照…

Visual Studio 調試中 PDB 與圖像不匹配

Visual Studio 調試中 PDB 與圖像不匹配 在使用 Visual Studio 進行本地或遠程調試時&#xff0c;很多開發者會遇到 PDB 加載失敗、符號不匹配的問題&#xff0c;甚至程序進程未退出&#xff0c;導致 .exe 文件無法成功覆蓋。本文詳細解析了從后臺進程清理、構建產物驗證、模塊…

WebRTC:實時通信的未來之路

WebRTC&#xff1a;實時通信的未來之路 目錄 WebRTC&#xff1a;實時通信的未來之路一、背景介紹二、使用方式三、前途展望 一、背景介紹 隨著互聯網的飛速發展&#xff0c;實時音視頻通信需求日益增長。傳統的音視頻通信多依賴于專有協議和插件&#xff08;如Flash、ActiveX等…

華為OD機試真題——猴子吃桃/愛吃蟠桃的孫悟空(2025B卷:200分)Java/python/JavaScript/C++/C語言/GO六種最佳實現

2025 B卷 200分 題型 本文涵蓋詳細的問題分析、解題思路、代碼實現、代碼詳解、測試用例以及綜合分析; 并提供Java、python、JavaScript、C++、C語言、GO六種語言的最佳實現方式! 本文收錄于專欄:《2025華為OD真題目錄+全流程解析/備考攻略/經驗分享》 華為OD機試真題《猴子…

【Java學習筆記】單例設計模式

單例設計模式 單例模式介紹 1. 所謂類的單例設計模式&#xff0c;就是采取一定的方法保證在整個的軟件系統中 &#xff08;1&#xff09;對某個類只能存在一個對象實例 &#xff08;2&#xff09;并且該類只提供一個取得對象實例的方法 2. 分類&#xff08;兩種方式&#xf…

vue實例 與組件實例

vue實例 與組件實例流程圖 &#x1f9e9; 基本解釋 ? Vue 實例 Vue 實例是通過 new Vue({…}) 創建的對象&#xff0c;是整個應用的根節點。 const vm new Vue({el: #app,data: { msg: Hello Vue } });是整個應用的起點。只有一個根 Vue 實例&#xff08;通常&#xff09;…