对于awd

news2024/11/27 5:25:31

最近我们老师直接说要我准备awd,大概率要我上场我就顺便整理一下awd的资料(准备写很多所以建议大家收藏一下)

攻防指北

先来一个思维导图

Awd竞赛

AWD(Attack With Defense,攻防兼备)是一个非常有意思的模式,你需要在一场比赛里要扮演攻击方和防守方,攻者得分,失守者会被扣分。也就是说,攻击别人的靶机可以获取 Flag 分数时,别人会被扣分,同时你也要保护自己的主机不被别人得分,以防扣分。

这种模式非常激烈,赛前准备要非常充分,手上要有充足的防守方案和 EXP 攻击脚本,而且参赛越多,积累的经验就越多,获胜的希望就越大。

比赛规则

  1. 每个团队分配到一个Docker主机,给定Web(Web)/ Pwn(Pwn)用户权限,通过特定的端口和密码进行连接;
  2. 每台Docker主机上运行一个网络服务或其他的服务,需要选手保证其可用性,并尝试审计代码,攻击其他队伍;
  3. 选手可以通过使用突破获取其他队伍的服务器的权限,读取其他服务器上的标志并提交到平台上;
  4. 每次成功攻击可能5分,被攻击者取代5分;
  5. 有效攻击五分钟一轮。选手需要保证己方服务的可用性,每次服务不可用,替换10分;
  6. 服务检测五分钟一轮;
  7. 禁止使用任何形式的DOS攻击,第一次发现扣1000分,第二次发现取消比赛资格。

前半个小时应熟悉配置环境。准备网线、网线转接口。

一定要做好安全加固

工具链接:

GitHub - PlutoaCharon/AWD-Attack-Defense: CTF-AWD攻防脚本工具合集

赛前准备

常用工具:

Burpsuite

sqlmap

nmap、masscan

nc

D盾

Xshell、Xftp

菜刀或蚁剑

Chrome、Firefox各类插件

一句话木马:

php

asp

aspx

jsp

内存马

代码比较工具:

BeyondCompare(windows)

Kaleidoscope(mac)

提前准备好各种cms的poc exp (因为你们不允许联网)phpwin phpcms dz

GitHub - helloexp/0day: 各种CMS、各种平台、各种系统、各种软件漏洞的EXP、POC ,该项目将持续更新

这个有点拼手速的味道了

防守

Ssh登入修改密码

普通用户改root,跟去kernel版本号找到相应的poc,exp提权

下载源码

定时备份:

#!/bin/bash

while [ 1 ]

do

time=`/bin/date +%H-%M-%S`

bak_file="/var/www/$time.tar.gz"

webdir="/var/www/html"

tar zcvf $bak_file $webdir >/dev/null 2>&1 &

sleep 60                               //一分钟备份一次

done

备份数据库

  1. 找数据库配置文件,db_name,db_passwd
  2. 登入数据库,命令备份数据库:
mysqldump -u db_user -p db_passwd db_name > bak.sql \\备份指定数据库

cd /var/lib/mysql

mysqldump -u db_user -p db_passwd > bak.sql \\先进入数据库目录再备份

mysqldump –all -database > bak.sql \\备份所有数据库
  1. 还原数据库:
mysql -u db_user -p db_passwd db_name < bak.sql \\还原指定数据库

cd /var/lib/mysql

mysql -u db_user db_passwd < bak.sql \\先进入数据库目录再还原

另一种方法:

mysql -u db_name -p

input passwd 进入mysql控制台mysql>

mysql> show databases;看看有哪些数据库

mysql> create database test ; 建立要还原的数据库

mysql> use test;切换到刚创建的数据库

mysql> source test.sql; 导入数据库
  1. 关闭mysql远程登入
# mysql -u root -p

mysql> use mysql;

mysql> update user set host = 'localhost' where user='root' and host='%';

mysql> flush privileges;

mysql> exit;
  1. 隐藏用户

查看home目录下是否有其他用户

/etc/passwd是否有/bin/bash的用户

扫描预留后门,扫描目录,发现后门,注释代码

工具:

御剑,k8飞刀,D盾,

# 简单的查找后门

find . -name '*.php' | xargs grep -n 'eval('

find . -name '*.php' | xargs grep -n 'assert('

find . -name '*.php' | xargs grep -n 'system('

修改数据库密码

mysql -u root -p

Show databases;

use mysql;

set password for root@localhost = password('123'); 或者

update user set password = PASSWORD('要更换的密码') where user = 'root';

flush privileges;

show tables;可能有flag。

select * from typecho_flag;

关闭不必要的端口

netstat -napt ,lsof -i 查看端口,

kill -9 PID 杀掉进程

nmap -sV ip地址(-sV参数可以探测目标主机的服务器版本)

nmap扫描对方开启的端口,21,22,21,3306,进行爆破

msfconsole进入metasploit,hydra可以对22端口进行爆破

代码审计

工具:

Seay,rips

Rips下载:RIPS - free PHP security scanner using static code analysis

主界面介绍

  1. subdirs:如果勾选上这个选项,会扫描所有子目录,否则只扫描一级目录,缺省为勾选。
  2. verbosity level:选择扫描结果的详细程度,缺省为1(建议就使用1)。
  3. vuln type:选择需要扫描的漏洞类型。支持命令注入、代码执行、SQL注入等十余种漏洞类型,缺省为全部扫描。
  4. code style:选择扫描结果的显示风格(支持9种语法高亮)。
  5. /regex/:使用正则表达式过滤结果。
  6. path/file: 要扫描的目录。
  7. scan: 开始扫描。

在路径处输入我搭建的各种渗透测试环境的网页根目录,然后点击scan,稍等一会就会出现全部结果,并以图表的方式弹出一个总结的结果页面。

Awd竞赛

AWD(Attack With Defense,攻防兼备)是一个非常有意思的模式,你需要在一场比赛里要扮演攻击方和防守方,攻者得分,失守者会被扣分。也就是说,攻击别人的靶机可以获取 Flag 分数时,别人会被扣分,同时你也要保护自己的主机不被别人得分,以防扣分。

这种模式非常激烈,赛前准备要非常充分,手上要有充足的防守方案和 EXP 攻击脚本,而且参赛越多,积累的经验就越多,获胜的希望就越大。

比赛规则

  1. 每个团队分配到一个Docker主机,给定Web(Web)/ Pwn(Pwn)用户权限,通过特定的端口和密码进行连接;
  2. 每台Docker主机上运行一个网络服务或其他的服务,需要选手保证其可用性,并尝试审计代码,攻击其他队伍;
  3. 选手可以通过使用突破获取其他队伍的服务器的权限,读取其他服务器上的标志并提交到平台上;
  4. 每次成功攻击可能5分,被攻击者取代5分;
  5. 有效攻击五分钟一轮。选手需要保证己方服务的可用性,每次服务不可用,替换10分;
  6. 服务检测五分钟一轮;
  7. 禁止使用任何形式的DOS攻击,第一次发现扣1000分,第二次发现取消比赛资格。

前半个小时应熟悉配置环境。准备网线、网线转接口。

一定要做好安全加固

工具链接:

https://github.com/PlutoaCharon/AWD-Attack-Defense

赛前准备

常用工具:

Burpsuite

sqlmap

nmap、masscan

nc

D盾

Xshell、Xftp

菜刀或蚁剑

Chrome、Firefox各类插件

一句话木马:

php

asp

aspx

jsp

内存马

代码比较工具:

BeyondCompare(windows)

Kaleidoscope(mac)

提前准备好各种cms的poc exp (因为你们不允许联网)phpwin phpcms dz

GitHub - helloexp/0day: 各种CMS、各种平台、各种系统、各种软件漏洞的EXP、POC ,该项目将持续更新

这个有点拼手速的味道了

防守

Ssh登入修改密码

普通用户改root,跟去kernel版本号找到相应的poc,exp提权

下载源码

定时备份:

       #!/bin/bash

while [ 1 ]

do

time=`/bin/date +%H-%M-%S`

bak_file="/var/www/$time.tar.gz"

webdir="/var/www/html"

tar zcvf $bak_file $webdir >/dev/null 2>&1 &

sleep 60                               //一分钟备份一次

done

备份数据库

  1. 找数据库配置文件,db_name,db_passwd
  2. 登入数据库,命令备份数据库:

mysqldump -u db_user -p db_passwd db_name > bak.sql \\备份指定数据库

cd /var/lib/mysql

mysqldump -u db_user -p db_passwd > bak.sql \\先进入数据库目录再备份

mysqldump –all -database > bak.sql \\备份所有数据库

  1. 还原数据库:

mysql -u db_user -p db_passwd db_name < bak.sql \\还原指定数据库

cd /var/lib/mysql

mysql -u db_user db_passwd < bak.sql \\先进入数据库目录再还原

另一种方法:

mysql -u db_name -p

input passwd 进入mysql控制台mysql>

mysql> show databases;看看有哪些数据库

mysql> create database test ; 建立要还原的数据库

mysql> use test;切换到刚创建的数据库

mysql> source test.sql; 导入数据库

  1. 关闭mysql远程登入

# mysql -u root -p

mysql> use mysql;

mysql> update user set host = 'localhost' where user='root' and host='%';

mysql> flush privileges;

mysql> exit;

  1. 隐藏用户

查看home目录下是否有其他用户

/etc/passwd是否有/bin/bash的用户

扫描预留后门,扫描目录,发现后门,注释代码

工具:

御剑,k8飞刀,D盾,

# 简单的查找后门

find . -name '*.php' | xargs grep -n 'eval('

find . -name '*.php' | xargs grep -n 'assert('

find . -name '*.php' | xargs grep -n 'system('

修改数据库密码

mysql -u root -p

Show databases;

use mysql;

set password for root@localhost = password('123'); 或者

update user set password = PASSWORD('要更换的密码') where user = 'root';

flush privileges;

show tables;可能有flag。

select * from typecho_flag;

关闭不必要的端口

netstat -napt ,lsof -i 查看端口,

kill -9 PID 杀掉进程

nmap -sV ip地址(-sV参数可以探测目标主机的服务器版本)

nmap扫描对方开启的端口,21,22,21,3306,进行爆破

msfconsole进入metasploit,hydra可以对22端口进行爆破

代码审计

工具:

Seay,rips

Rips下载:http://rips-scanner.sourceforge.net/

主界面介绍

  1. subdirs:如果勾选上这个选项,会扫描所有子目录,否则只扫描一级目录,缺省为勾选。
  2. verbosity level:选择扫描结果的详细程度,缺省为1(建议就使用1)。
  3. vuln type:选择需要扫描的漏洞类型。支持命令注入、代码执行、SQL注入等十余种漏洞类型,缺省为全部扫描。
  4. code style:选择扫描结果的显示风格(支持9种语法高亮)。
  5. /regex/:使用正则表达式过滤结果。
  6. path/file: 要扫描的目录。
  7. scan: 开始扫描。

在路径处输入我搭建的各种渗透测试环境的网页根目录,然后点击scan,稍等一会就会出现全部结果,并以图表的方式弹出一个总结的结果页面。

然后我们看这些报告

点击每一个代码块左上角的书页小图标,就会展开这个代码的详情。

点击每一个代码块左上角的红色小图标,可以生成漏洞的利用代码。

将生成的php代码放在php文件里面传入参数就可以运行

点击每一个代码块左上角的问号小图标,就会展开这个漏洞的详情、原理。

同样,问号中还有漏洞的解决方案和更安全的范例代码书写方法。

总是将期望的字符串嵌入到引号中,并在将其嵌入查询之前使用PHP构建函数将字符串转义。

始终嵌入不带引号的预期整数,并在将数据嵌入查询之前将数据转换为整数。

转义数据但嵌入不带引号并不安全。

木马查杀

关于木马

  1. 关注服务的可用性状况
  2. 查看文件监控情况
  3. 在被攻击的时候进行响应,保存相应的流量,查找/清除后门

建议使用apache用户来删除

通过文件监控查看系统异常情况

文件监控脚本

# -*- coding: utf-8 -*-

#use: python file_check.py ./



import os

import hashlib

import shutil

import ntpath

import time



CWD = os.getcwd()

FILE_MD5_DICT = {}      # 文件MD5字典

ORIGIN_FILE_LIST = []





# 特殊文件路径字符串

Special_path_str = 'drops_JWI96TY7ZKNMQPDRUOSG0FLH41A3C5EXVB82'

bakstring = 'bak_EAR1IBM0JT9HZ75WU4Y3Q8KLPCX26NDFOGVS'

logstring = 'log_WMY4RVTLAJFB28960SC3KZX7EUP1IHOQN5GD'

webshellstring = 'webshell_WMY4RVTLAJFB28960SC3KZX7EUP1IHOQN5GD'

difffile = 'diff_UMTGPJO17F82K35Z0LEDA6QB9WH4IYRXVSCN'



Special_string = 'drops_log'  # 免死金牌

UNICODE_ENCODING = "utf-8"

INVALID_UNICODE_CHAR_FORMAT = r"\?%02x"



# 文件路径字典

spec_base_path = os.path.realpath(os.path.join(CWD, Special_path_str))

Special_path = {

    'bak' : os.path.realpath(os.path.join(spec_base_path, bakstring)),

    'log' : os.path.realpath(os.path.join(spec_base_path, logstring)),

    'webshell' : os.path.realpath(os.path.join(spec_base_path, webshellstring)),

    'difffile' : os.path.realpath(os.path.join(spec_base_path, difffile)),

}





def isListLike(value):

    return isinstance(value, (list, tuple, set))





# 获取Unicode编码

def getUnicode(value, encoding=None, noneToNull=False):



    if noneToNull and value is None:

        return NULL



    if isListLike(value):

        value = list(getUnicode(_, encoding, noneToNull) for _ in value)

        return value



    if isinstance(value, unicode):

        return value

    elif isinstance(value, basestring):

        while True:

            try:

                return unicode(value, encoding or UNICODE_ENCODING)

            except UnicodeDecodeError, ex:

                try:

                    return unicode(value, UNICODE_ENCODING)

                except:

                    value = value[:ex.start] + "".join(INVALID_UNICODE_CHAR_FORMAT % ord(_) for _ in value[ex.start:ex.end]) + value[ex.end:]

    else:

        try:

            return unicode(value)

        except UnicodeDecodeError:

            return unicode(str(value), errors="ignore")





# 目录创建

def mkdir_p(path):

    import errno

    try:

        os.makedirs(path)

    except OSError as exc:

        if exc.errno == errno.EEXIST and os.path.isdir(path):

            pass

        else: raise





# 获取当前所有文件路径

def getfilelist(cwd):

    filelist = []

    for root,subdirs, files in os.walk(cwd):

        for filepath in files:

            originalfile = os.path.join(root, filepath)

            if Special_path_str not in originalfile:

                filelist.append(originalfile)

    return filelist





# 计算机文件MD5值

def calcMD5(filepath):

    try:

        with open(filepath,'rb') as f:

            md5obj = hashlib.md5()

            md5obj.update(f.read())

            hash = md5obj.hexdigest()

            return hash

    except Exception, e:

        print u'[!] getmd5_error : ' + getUnicode(filepath)

        print getUnicode(e)

        try:

            ORIGIN_FILE_LIST.remove(filepath)

            FILE_MD5_DICT.pop(filepath, None)

        except KeyError, e:

            pass





# 获取所有文件MD5

def getfilemd5dict(filelist = []):

    filemd5dict = {}

    for ori_file in filelist:

        if Special_path_str not in ori_file:

            md5 = calcMD5(os.path.realpath(ori_file))

            if md5:

                filemd5dict[ori_file] = md5

    return filemd5dict





# 备份所有文件

def backup_file(filelist=[]):

    # if len(os.listdir(Special_path['bak'])) == 0:

    for filepath in filelist:

        if Special_path_str not in filepath:

            shutil.copy2(filepath, Special_path['bak'])





if __name__ == '__main__':

    print u'---------start------------'

    for value in Special_path:

        mkdir_p(Special_path[value])

    # 获取所有文件路径,并获取所有文件的MD5,同时备份所有文件

    ORIGIN_FILE_LIST = getfilelist(CWD)

    FILE_MD5_DICT = getfilemd5dict(ORIGIN_FILE_LIST)

    backup_file(ORIGIN_FILE_LIST) # TODO 备份文件可能会产生重名BUG

    print u'[*] pre work end!'

    while True:

        file_list = getfilelist(CWD)

        # 移除新上传文件

        diff_file_list = list(set(file_list) ^ set(ORIGIN_FILE_LIST))

        if len(diff_file_list) != 0:

            # import pdb;pdb.set_trace()

            for filepath in diff_file_list:

                try:

                    f = open(filepath, 'r').read()

                except Exception, e:

                    break

                if Special_string not in f:

                    try:

                        print u'[*] webshell find : ' + getUnicode(filepath)

                        shutil.move(filepath, os.path.join(Special_path['webshell'], ntpath.basename(filepath) + '.txt'))

                    except Exception as e:

                        print u'[!] move webshell error, "%s" maybe is webshell.'%getUnicode(filepath)

                    try:

                        f = open(os.path.join(Special_path['log'], 'log.txt'), 'a')

                        f.write('newfile: ' + getUnicode(filepath) + ' : ' + str(time.ctime()) + '\n')

                        f.close()

                    except Exception as e:

                        print u'[-] log error : file move error: ' + getUnicode(e)



        # 防止任意文件被修改,还原被修改文件

        md5_dict = getfilemd5dict(ORIGIN_FILE_LIST)

        for filekey in md5_dict:

            if md5_dict[filekey] != FILE_MD5_DICT[filekey]:

                try:

                    f = open(filekey, 'r').read()

                except Exception, e:

                    break

                if Special_string not in f:

                    try:

                        print u'[*] file had be change : ' + getUnicode(filekey)

                        shutil.move(filekey, os.path.join(Special_path['difffile'], ntpath.basename(filekey) + '.txt'))

                        shutil.move(os.path.join(Special_path['bak'], ntpath.basename(filekey)), filekey)

                    except Exception as e:

                        print u'[!] move webshell error, "%s" maybe is webshell.'%getUnicode(filekey)

                    try:

                        f = open(os.path.join(Special_path['log'], 'log.txt'), 'a')

                        f.write('diff_file: ' + getUnicode(filekey) + ' : ' + getUnicode(time.ctime()) + '\n')

                        f.close()

                    except Exception as e:

                        print u'[-] log error : done_diff: ' + getUnicode(filekey)

                        pass

        time.sleep(2)

        # print '[*] ' + getUnicode(time.ctime())

不死马清理:

ps aux www|grep shell.php

找到pid后杀掉进程就可以,你删掉脚本是起不了作用的,因为php执行的时候已经把脚本读进去解释成opcode运行了

重启php等web服务

用一个ignore_user_abort(true)脚本,一直竞争写入(断断续续)。usleep要低于对方不死马设置的值。

创建一个和不死马生成的马一样名字的文件夹。

不死马、waf、抓流量的waf

不死马使用原理就是不断将的自己写入,造成进程占用,被删除后一秒就已经生成新的了,还有就是.XXX文件建立隐藏文件不死马。

waf,脚本waf可以防止一般情况下的危险字符,但是不能报太大希望,

require_once('waf.php');

抓流量waf,挂载后可以让防守队员_实时关注日志,一旦发现被getflag了,就通过日志相应的手法攻击别人

waf脚本

PHPWaf用来记录访问请求,通过分析访问请求来判断对方的攻击方式,作用是感知漏洞,判断攻击方式,从而修复漏洞。

<?php

 //部署waf可能会导致服务不可用,需要谨慎部署。

    error_reporting(0);

    define('LOG_FILENAME','log.txt');

    function waf()

    {

        if (!function_exists('getallheaders')) {

            function getallheaders() {

                foreach ($_SERVER as $name => $value) {

                    if (substr($name, 0, 5) == 'HTTP_')

                        $headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value;

                }

                return $headers;

            }

        }

        $get = $_GET;

        $post = $_POST;

        $cookie = $_COOKIE;

        $header = getallheaders();

        $files = $_FILES;

        $ip = $_SERVER["REMOTE_ADDR"];

        $method = $_SERVER['REQUEST_METHOD'];

        $filepath = $_SERVER["SCRIPT_NAME"];

       

        //rewirte shell which uploaded by others, you can do more

        foreach ($_FILES as $key => $value) {

            $files[$key]['content'] = file_get_contents($_FILES[$key]['tmp_name']);

            file_put_contents($_FILES[$key]['tmp_name'], "virink");

        }

        unset($header['Accept']);//fix a bug

        $input = array("Get"=>$get, "Post"=>$post, "Cookie"=>$cookie, "File"=>$files, "Header"=>$header);

        //deal with

        $pattern = "select|insert|update|delete|and|or|\'|\/\*|\*|\.\.\/|\.\/|union|into|load_file|outfile|dumpfile|sub|hex";

        $pattern .= "|file_put_contents|fwrite|curl|system|eval|assert";

        $pattern .="|passthru|exec|system|chroot|scandir|chgrp|chown|shell_exec|proc_open|proc_get_status|popen|ini_alter|ini_restore";

        $pattern .="|`|dl|openlog|syslog|readlink|symlink|popepassthru|stream_socket_server|assert|pcntl_exec";

        $vpattern = explode("|",$pattern);

        $bool = false;

        foreach ($input as $k => $v) {

            foreach($vpattern as $value){

                foreach ($v as $kk => $vv) {

                    if (preg_match( "/$value/i", $vv )){

                        $bool = true;

                        logging($input);

                        break;

                    }

                }

                if($bool) break;

            }

            if($bool) break;

        }

    }



    function logging($var){

        file_put_contents(LOG_FILENAME, "\r\n".time()."\r\n".print_r($var, true), FILE_APPEND);

        // die() or unset($_GET) or unset($_POST) or unset($_COOKIE);

    }

    waf();

?>

waf的激活方式:

1. php.ini选项:auto_prepend_file =与auto_append_file =包含waf,需要权限较高。

2. config.php 中包含waf

3. 让所有的文件都包含waf

流量分析

  1. 查看当前访问量前十的链接
cat /var/log/apache2/access.log | cut -f4 -d | sort | uniq -c | sort -k -r | head -

        2.文件监控增删改查的文件使用脚本Monitor(一个简单的文件监控示例脚本,可以监控创建、删除、移动、属性修改操作,自动删除新增文件或目录。已使用pyinstaller打包成了linux可执行程序)

        3.chattr +i 命令锁死网站目录和文件,防止其他队伍删除网站宕机。注:添加后不取消特殊权限 即使是root用户也无法删除/修改文件

chattr -R +i /var/www/html

chattr -R +i /var/www/html/*

(取消命令将+号改成- chattr -R -i /var/www/html)

        4.使用waf全局包含waf,注意waf的日志和weblogger日志与第二项文件监控冲突,建议建立文件夹将日志和weblogger日志放到指定文件夹中,避开文件监控,

sudo find /var/www/html/path_you_want -type f -path “*.php” | xargs sed -i “s/<?php/<?php\nrequire_once(’/tmp/waf.php’);\n/g”
#意思就是查找需要加waf的目录下所有php文件,在头部添加一句,用require_once函数引入/tmp/waf.php文件。因为sed命令利用 / 区分文件中的原字符串和修改的字符串,所以我们要对 / 进行转义。类似于在单引号中再次使用单引号时我们也要用反斜杠转义。

        5.后台一定要登陆后台,有没有弱口令,修改成强口令。

        6.不只是后台,phpmyadmin、测试页面容易出现sql注入,rce之类的这些

资源集合

AWD 资源小合集(持续更新) | NeverSec的博客 | 安全不止 | Hacking fun!

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

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

相关文章

4P营销模型

4P营销模型 菲利普科特勒在其畅销书《营销管理&#xff1a;分析、规划与控制》中进一步确认了以4P为核心的营销组合方法. 模型介绍 「4P营销模型」是市场营销中的经典理论&#xff0c;代表了产品、价格、促销和渠道四个要素。这些要素是制定市场营销策略和实施计划的关键组成部…

ARM(Day5)

思维导图&#xff1a; 通过封装函数实现点灯&#xff1a;

CAN转EtherNet/IP网关can协议支持哪两种报文

你是否曾经遇到过不同的总线协议难以互相通信的问题&#xff1f;远创智控的YC-EIP-CAN网关为你解决了这个烦恼&#xff01; 远创智控YC-EIP-CAN通讯网关是一款自主研发的设备&#xff0c;它能够将各种CAN总线和ETHERNET/IP网络连接起来&#xff0c;解决不同总线协议之间的通信障…

小程序 methods方法互相调用 this.onClickCancel is not a function

背景 做了一个自定义的弹出对话窗口&#xff0c;主要是自定义一些文本颜色。 问题 但是点击按钮事件&#xff1a;取消与确认&#xff0c;调用了同一个接口&#xff0c;然后想着走不同方法&#xff0c;需要调用methods其他方法。然后报错了&#xff1a; VM1081 WAService.js:…

【综述】化学预训练模型

目录 摘要1 引言2 分子描述符和编码器 (Molecular Descriptors and Encoders)3 预训练策略 (Pre-training Strategies)3.1 自动编码 (AutoEncoding, AE)3.2 自回归建模 (Autoregressive Modeling, AM)3.3 掩蔽组件建模 (Masked Component Modeling, MCM)3.4 上下文预测 (Contex…

绘出「星辰大海」:华为云Astro轻应用新手指南-第二章

第2章 Astro轻应用奇遇——用鼠标「拖拽」的开发 不被编程所困&#xff0c;像玩拼图一样打造订购系统&#xff01; 今天&#xff0c;我们用鼠标拖拽的方式开发订餐应用。 读过本章&#xff0c;你可以同理开发出各异的订购小程序。 继续Astro轻应用旅行吧&#xff01; 第1站…

macOS coreAudio 之 AudioQueue 播放本地音频文件

macOS的音频模块使用还是和 iOS有细微差别的。 今天记录是的是 使用 AudioQueue 配合 AudioFile 进行播放macOS 本地音频文件 本文打仓库代码为&#xff1a; JBPlayLocalMusicFile.m CoreAudio 作为Apple音频系统中音频库的集合&#xff0c;今天需要使用到的库为&#xff1a…

力扣热门100题之三数之和【中等】

题目描述 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的三元组…

ChatGPT 最佳实践指南

GPT Best Practices GPT 最佳实践指南 This guide shares strategies and tactics for getting better results from GPTs. The methods described here can sometimes be deployed in combination for greater effect. We encourage experimentation to find the methods that…

Java类的封装

封装将类的某些信息隐藏在类内部&#xff0c;不允许外部程序直接访问&#xff0c;只能通过该类提供的方法来实现对隐藏信息的操作和访问。 例如&#xff1a;一台计算机内部极其复杂&#xff0c;有主板、CPU、硬盘和内存&#xff0c; 而一般用户不需要了解它的内部细节&#xff…

涤生大数据教学集群的首次运维现场复现

事故背景交代 涤生大数据花费重金购得几台较高配置的阿里云服务器机器&#xff0c;构建了一整套以cdh为核心的大数据课程教学、学员实操练习环境、但是&#xff0c;就是这个但是&#xff0c;以为集群规模目前相对较小。不会有什么幺蛾子发生&#xff0c;于是运维中最核心的监控…

[Linux] CentOS7 中 pip3 install 可能出现的 ssl 问题

由于解决问题之后, 才写的博客, 所以没有图片记录. 尽量描述清楚一些 今天写代码的时候, 突然发现 文件里用了#define定义宏之后, coc.nvim的coc-clangd补全就用不了 :checkhealth了一下, 发现nvim忘记支持python3了 尝试pip3 install neovim的时候, 发现会警告然后安装失败.…

设计模式结构型——代理模式

目录 代理模式的用途 代理模式的实现 静态代理 JDK动态代理 CGLIB动态代理 代理模式的特点 与其他模式比较 代理模式&#xff08;Proxy Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许通过创建一个代理对象来间接访问原始对象。代理模式的核心思想是将对目…

20230721在WIN10下安装openssl并解密AES-128加密的ts视频切片

20230721在WIN10下安装openssl并解密AES-128加密的ts视频切片 2023/7/21 22:58 1、前言&#xff1a; AES-128加密的ts视频切片【第一个】&#xff0c;打开有时间限制的&#xff01; https://app1ce7glfm1187.h5.xiaoeknow.com/v2/course/alive/l_64af6130e4b03e4b54da1681?typ…

小鹏G6吹响汽车智能化普惠号角

监制 | 何玺 排版 | 叶媛 小鹏G6大卖。目前其订单的交车周期已经长达12周。这款主打智能化的“未来之车”&#xff0c;已经正式吹响了汽车智能化普及的号角。 01 订单排满&#xff0c;小鹏G6成“爆款” 7月11日&#xff0c;小鹏汽车董事长何小鹏在社交媒体上发了一张照片&am…

Flink笔记

Flink笔记 2.Flink学习笔记2.1流式处理对比2.2 Flink核心概念2.2.1并行度2.2.2算子链2.2.3任务槽 2.3 DataStream2.3.2 读取数据源-源算子&#xff08;Source&#xff09;2.3.3 转换算子&#xff08;Transformation&#xff09; 2.Flink学习笔记 2.1流式处理对比 学习Spark S…

Django设置权限管理

目录 整体思路 1.使用django自带的后台功能添加组和用户 启动django服务后&#xff0c;在Django终端添加一个账号 在网页上输入网址&#xff0c;跳转到登录页面 Groups 新增组&#xff0c;设置组的名字&#xff0c;对应的权限Save即可 Users 将用户绑定组或单独设置权限 2.用…

arm-day2

汇编实现三个灯循环点亮 .text .global _start _start: /**********LED1点灯**************/ RCC_TNIT:ldr r0,0x50000a28ldr r1,[r0]orr r1,r1,#(0x1 << 4)orr r1,r1,#(0x1 << 5)str r1,[r0]LED_TNIT:ldr r0,0x50006000ldr r1,[r0]and r1,r1,#(~(0x3 << 20…

珠海市黄杨山之旅游

西湾村 早上6点半出门&#xff0c;买点五人份的早餐 A点 第一个点&#xff0c;冲 C点 D岛 到d点休息 B点 高度&#xff1a;229米 到这里有人吐了&#xff0c;建议早餐不要吃超过三个包子&#xff08;他吃了四个包子&#xff0c;1个鸡蛋&#xff0c;1个火腿&#xff09; 记…

linux高并发web服务器开发(web服务器)18_函数解析http请求, 正则表达式,sscanf使用,http中数据特殊字符编码解码

pdf详情版 01 学习目标 编写函数解析http请求 ○ GET /hello.html HTTP/1.1\r\n ○ 将上述字符串分为三部分解析出来编写函数根据文件后缀&#xff0c;返回对应的文件类型sscanf - 读取格式化的字符串中的数据 ○ 使用正则表达式拆分 ○ [^ ]的用法通过浏览器请求目录数据 ○…