• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

[CISCN2019 华东南赛区]Web4

武飞扬头像
一夜至秋.
帮助1

[CISCN2019 华东南赛区]Web4

学新通

点击就进入了百度的页面,但是发现了url也发生了变化 学新通

学新通

尝试一下任意文件读取(/etc/passwd)

学新通

学新通

尝试一下读取flag

学新通

学新通

f12查看发现了cookie中的session为jwt格式,可能为flask伪造

学新通

先去解密一下session(https://jwt.io/) 

学新通

学新通

解密结果为www-data,如果是flask伪造的话需要找到secret_key,而在网上搜索flask有关信息时发现里面可能存在一个app.py文件

学新通

然后再去任意文件哪里查找有没有app这样的关键词,但是只发现了app并没有发现app.py

学新通

尝试读取一下app.py

学新通 学新通

整理如下代码:

  1.  
    # encoding:utf-8
  2.  
    import re, random, uuid, urllib
  3.  
    from flask import Flask, session, request
  4.  
     
  5.  
    app = Flask(__name__)
  6.  
    random.seed(uuid.getnode())
  7.  
    app.config['SECRET_KEY'] = str(random.random()*233)
  8.  
    app.debug = True
  9.  
     
  10.  
    @app.route('/')
  11.  
    def index():
  12.  
    session['username'] = 'www-data'
  13.  
    return 'Hello World! Read somethings'
  14.  
     
  15.  
    @app.route('/read')
  16.  
    def read():
  17.  
    try:
  18.  
    url = request.args.get('url')
  19.  
    m = re.findall('^file.*', url, re.IGNORECASE)
  20.  
    n = re.findall('flag', url, re.IGNORECASE)
  21.  
    if m or n:
  22.  
    return 'No Hack'
  23.  
    res = urllib.urlopen(url)
  24.  
    return res.read()
  25.  
    except Exception as ex:
  26.  
    print str(ex)
  27.  
    return 'no response'
  28.  
     
  29.  
    @app.route('/flag')
  30.  
    def flag():
  31.  
    if session and session['username'] == 'fuck':
  32.  
    return open('/flag.txt').read()
  33.  
    else:
  34.  
    return 'Access denied'
  35.  
    if __name__=='__main__':
  36.  
    app.run(
  37.  
    debug=True,
  38.  
    host="0.0.0.0"
  39.  
    )
学新通

审计代码可得确实是session伪造,并且告诉我们username必须是fuck(if session and session['username'] == 'fuck': ),以及secret_key要利用随机数求得(app.config['SECRET_KEY'] = str(random.random()*233) ),但是种子需要用到uuid.getnode函数(random.seed(uuid.getnode()) ),uuid.getnode函数用于获得网络接口的mac地址,如果机器具有多个网络接口,则返回通用管理的mac地址,而不是通过本地管理的mac地址返回。管理的mac地址保证是全局唯一的。如果getnode函数无法获取mac地址,则他会按照rfc 4122中的建议返回带有多播位得随机48位数字。uuid.getnode函数,是网卡mac地址的十进制数,使用(/sys/class/net/eth0/address)读取一下

学新通

学新通

找到地址之后按照源代码中的提示,生成secret_key

学新通

学新通

然后去linux中使用flask-session-cookie-manager-master(GitHub - noraj/flask-session-cookie-manager: Flask Session Cookie Decoder/Encoder)构造出新的session,使用命令(python3 flask_session_cookie_manager3.py decode -c 'eyJ1c2VybmFtZSI6eyIgYiI6ImQzZDNMV1JoZEdFPSJ9fQ.Yw8ANw.2tf4dnk4ntx3KEsZf7HC8ByAGlA' -s '105.264175525')(python3 flask_session_cookie_manager3.py encode -s '105.264175525' -t "{'username': b'fuck'}"

学新通

然后返回原页面修改session即可

学新通

url直接读取flag

学新通

学新通

完结撒花

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhfigbfg
系列文章
更多 icon
同类精品
更多 icon
继续加载