BUUCTF | [De1CTF 2019]SSRF Me


 解法一字符串拼接

1.得到簽名sign

http://8fa4531c-1164-49b7-a700-70e77e6aacb7.node3.buuoj.cn/geneSign?param=flag.txtread

 2.添加Cookie發送請求得到flag

Cookie: action=readscan;sign=cf8d4365c9b27a29b29e025a7ed25fa6

 原理:

1.分析源碼

#! /usr/bin/env python #encoding=utf-8
from flask import Flask from flask import 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) 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 #generate Sign For Action Scan.
@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)
View Code

 2.傳入一個param,/geneSign路由會返回的一個sign

 

 3.通過cookie得到一個sign,到時候回傳到exec()中去跟getSign()產生的sign校驗,所以這里直接傳一個getSign()產生的sign。通過cookie傳入一個action參數,看后面的Exec()可以知道action="readscan"。根據提示param=flag.txt,所以這個sign應該是md5('xxxflag.txtreadscan'),但是action在geneSign()寫死了為"action"。

 

  • 不妨假設 secert_key 是 xxx ,那么在開始訪問 /geneSign?param=flag.txt 的時候,返回的 md5 就是 md5('xxx' + 'flag.txt' + 'scan') ,在 python 里面上述表達式就相當於 md5(xxxflag.txtscan) ,這就很有意思了。

  • 直接構造訪問 /geneSign?param=flag.txtread ,拿到的 md5 就是 md5('xxx' + 'flag.txtread' + 'scan') ,等價於 md5('xxxflag.txtreadscan') ,這就達到了目標。

 


 解法二文件包含:

1.得到sign

2.得到flag

 

 

 原理:

 

Python 2.x - 2.7.16 urllib.fopen支持local_file導致LFI(CVE-2019-9948):https://bugs.python.org/issue35907

 

這里是使用的 urllib.urlopen(param) 去包含的文件,所以可以直接加上文件路徑 flag.txt 或 ./flag.txt 去訪問,也可以使用類似的 file:///app/flag.txt 去訪問,但是 file 關鍵字在黑名單里,可以使用 local_file 代替。​ 如果使用 urllib2.urlopen(param) 去包含文件就必須加上 file ,否則會報 ValueError: unknown url type: /path/to/file 的錯誤

當不存在協議的時候,默認使用file協議讀取

可以使用local_file:繞過,例如 local_file:flag.txt路徑就是相對腳本的路徑  local_file://就必須使用絕對路徑(協議一般都是這樣)
PS:local-file:///proc/self/cwd/flag.txt也可以讀取,因為/proc/self/cwd/代表的是當前路徑

 

 


 解法三:哈希拓展攻擊

 我們可以在不知道salt的具體內容的情況下,計算出任意的md5(salt+message+padding+append)值

對於本題來說就是 md5(secert_key + 'flag.txt' + 'scan') 的值延拓成 md5(secert_key + 'flag.txt' + 'readscan') 的值

由於我本機的hashpump老是安裝失敗就不復現了Orz  Hash Length Extension Attack

 


參考:

https://blog.csdn.net/weixin_44255856/article/details/98946266

https://xz.aliyun.com/t/5927

https://www.cnblogs.com/20175211lyz/p/11440316.html

https://joychou.org/web/hash-length-extension-attack.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM