当前位置: 首页 > news >正文

web基础—dvwa靶场(十)XSS

XSS(DOM)

跨站点脚本(XSS)攻击是一种注入攻击,恶意脚本会被注入到可信的网站中。当攻击者使用 web 应用程序将恶意代码(通常以浏览器端脚本的形式)发送给其他最终用户时,就会发生 XSS 攻击。允许这些攻击成功的漏洞很多,并且在 web 应用程序的任何地方都有可能发生,这些漏洞会在使用用户的输入,没有对其进行验证或编码。
攻击者可以使用 XSS 向不知情的用户发送恶意脚本,用户的浏览器并不知道脚本不应该被信任,并将执行 JavaScript。因为它认为脚本来自可信来源,所以恶意脚本可以访问浏览器并作用于该站点的任何 cookie、会话令牌或其他敏感信息,甚至可以重写 HTML 页面的内容。
基于 DOM 的 XSS 是一种特殊的反射型 XSS,通过将 JavaScript 隐藏在 URL 中。基于 DOM 的 XSS 将在页面呈现时被 JavaScript 拉出,而不是在服务时嵌入到页面中。这会使它比其他攻击更隐蔽,WAF 或其他保护读取页面正文时看不到任何恶意内容。
在另一个用户的浏览器中运行你自己的 JavaScript,用它窃取登录用户的 cookie。

        XSS,全称Cross Site Scripting,即跨站脚本攻击,某种意义上也是一种注入攻击,是指攻击者在页面中注入恶意的脚本代码,当受害者访问该页面时,恶意代码会在其浏览器上执行,需要强调的是,XSS不仅仅限于JavaScript,还包括flash等其它脚本语言。根据恶意代码是否存储在服务器中,XSS可以分为存储型的XSS与反射型的XSS。

  DOM—based XSS漏洞是基于文档对象模型Document Objeet Model,DOM)的一种漏洞。DOM是一个与平台、编程语言无关的接口,它允许程序或脚本动态地访问和更新文档内容、结构和样式,处理后的结果能够成为显示页面的一部分。DOM中有很多对象,其中一些是用户可以操纵的,如uRI,location,refelTer等。客户端的脚本程序可以通过DOM动态地检查和修改页面内容,它不依赖于提交数据到服务器端,而从客户端获得DOM中的数据在本地执行,如果DOM中的数据没有经过严格确认,就会产生DOM—based XSS漏洞。

可能触发DOM型XSS的属性:

document.referer属性

window.name属性

location属性

innerHTML属性

documen.write属性

Low Level

在将请求的输入包含在输出文本中之前,Low level 将不检查请求的输入。

源码审计

源码如下,服务器没有任何防御措施。

<?php# No protections, anything goes?> 

接下来我们看一下前端的代码,该页面是个下拉页面,用于选择默认语言。F12 打开,点一点 HTML 标签看到如下 JS 代码。document 表示的是一个文档对象,Location 对象包含有关当前 URL 的信息,href 属性是一个可读可写的字符串,可设置或返回当前显示的文档的完整 URL。也就是说 “document.location.href” 的写法得到页面的 URL,而 indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置,这里用来判断 “default=” 是否在 URL 中。substring(start,stop) 方法用于提取字符串中两个指定下标之间的字符,然后存到 lang 变量中,decodeURI() 函数可对 encodeURI() 函数编码过的 URI 进行解码。document.write 是 JavaScript 中对 document.open 所开启的文档流操作的 API 方法,它能够直接在文档流中写入字符串。

if (document.location.href.indexOf("default=") >= 0) {var lang = document.location.href.substring(document.location.href.indexOf("default=") + 8);document.write("<option value='" + lang + "'>" + decodeURI(lang) + "</option>");document.write("<option value='' disabled='disabled'>----</option>");
}document.write("<option value='English'>English</option>");
document.write("<option value='French'>French</option>");
document.write("<option value='Spanish'>Spanish</option>");
document.write("<option value='German'>German</option>");

选择下拉列表内容,选择的值会赋给 default 并添加到 url 的末尾,再将其传给 option 标签的 value 结点。也就是说我们可以注入一些 JS 代码进去,然后这部分会被包含到 lang 变量中,最终回显到页面上。

攻击方式

HTML DOM 有个 alert() 方法,用于显示带有一条指定消息和一个 OK 按钮的警告框。document.cookie 里面可以读到 cookie 信息,我们可以把 cookie 放在一个 alert() 生成的警告框中,回显时就会得到我们想要的信息了。注入的payload 如下所示:

<script>alert(document.cookie)</script>


注入 payload 之后,前端的代码中会加入下面这个结点。

Medium Level

开发人员尝试添加一个简单的模式匹配删除对 “<script” 的任何引用,以此禁用任何 JavaScript,攻击者需要找到一种不使用脚本标记运行 JavaScript 的方法。

源码审计

前端代码不变,后端代码如下所示。array_key_exists() 函数检查某个数组中是否存在指定的键名,如果键名存在返回 true,键名不存在则返回 false。stripos(string,find,start) 函数查找字符串在另一字符串中第一次出现的位置(不区分大小写),header() 函数向客户端发送原始的 HTTP 报头。也就是说现在服务器通过一个模式匹配,过滤了 “script” 标签,我们就不能直接注入 JS 代码了。

<?php// Is there any input?
if (array_key_exists("default", $_GET) && !is_null ($_GET[ 'default'])){$default = $_GET['default'];# Do not allow script tagsif (stripos ($default, "<script") !== false){header ("location: ?default=English");exit;}
}?> 

攻击方式

这种防御形同虚设,因为我们可以直接注入标签将 cookie 显示出来。HTML 的 < img > 标签定义 HTML 页面中的图像,该标签支持 onerror 事件,在装载文档或图像的过程中如果发生了错误就会触发。使用这些内容构造出 payload 如下,因为我们没有图片可供载入,因此会出错从而触发 onerror 事件输出 cookie。

English</option></select><img src = 1 onerror = alert(document.cookie)>

注入 payload 之后,前端的代码中会加入下面这个结点。

High Level

开发人员现在设置了白名单,只允许传递语言单词作为参数.你必须找到一种方法来运行你的代码,不要让它传到服务器上。

源码审计

前端代码不变,后端代码如下所示。服务器设置了白名单,default 参数只接受 French,English,German 以及 Spanish 这几个单词。

<?php// Is there any input?
if (array_key_exists("default", $_GET) && !is_null ($_GET['default'])){# White list the allowable languagesswitch ($_GET['default']){case "French":case "English":case "German":case "Spanish":# okbreak;default:header ("location: ?default=English");exit;}
}?> 

攻击方式

可以在注入的 payload 中加入注释符 “#”,注释后边的内容不会发送到服务端,但是会被前端代码所执行。

Impossible Level

大多数情况下浏览器都会对 URL 中的内容进行编码,这会阻止任何注入的 JavaScript 被执行。

<?php# Don't need to do anything, protction handled on the client side?>

服务器不需要多做什么,在客户端会对 URL 进行编码。

if (document.location.href.indexOf("default=") >= 0) {var lang = document.location.href.substring(document.location.href.indexOf("default=") + 8);document.write("<option value='" + lang + "'>" + (lang) + "</option>");document.write("<option value='' disabled='disabled'>----</option>");
}document.write("<option value='English'>English</option>");
document.write("<option value='French'>French</option>");
document.write("<option value='Spanish'>Spanish</option>");
document.write("<option value='German'>German</option>");

总结与防御

DOM 型 XSS 是特殊的反射性 XSS,是基于 DOM 文档对象模型的漏洞。DOM (Document Object Model) 译为文档对象模型,是 HTML 和 XML 文档的编程接口,可以使程序和脚本能动态访问和更新文档的内容、结构和样式。HTML 标签作为结点构成了 DOM 节点树,树中的节点都可以通过 JavaScript 进行访问。
 


当网页被浏览器请求是,浏览器会为页面创建一个顶级的 Document object 文档对象,然后生成各个子文档的对象,每个页面都会对应一个文档对象,每个文档对象都包含属性、方法和事件。Document object 文档对象可以通过 JavaScript 脚本进行编辑,客户端可以通过 DOM 修改页面的内容,从而获取 DOM 中的数据在本地执行。由于这个漏洞存在于前端,因此 DOM 型 XSS 漏洞不需要和服务器交互。
XSS 的攻击方式为攻击者请求一个带有 payload 的 URL,服务器的响应不会以任何形式包含攻击者的脚本。当时当用户的浏览器处理这个响应时,DOM 对象就会处理 XSS 代码。XSS 漏洞的修复方式有以下 2 种:

  1. 过滤输入的字符,例如 “ ' ”,“ " ”,“<”,“>” 等非法字符;
  2. 对输出到页面的数据进行编码

XSS(Reflected)

XSS攻击需要具备两个条件:

  • 需要向web页面注入恶意代码;
  • 这些恶意代码能够被浏览器成功的执行

XSS反射型漏洞

反射型XSS,顾名思义在于“反射”这个一来一回的过程。反射型XSS的触发有后端的参与,而之所以触发XSS是因为后端解析用户在前端输入的带有XSS性质的脚本或者脚本的data URI编码,后端解析用户输入处理后返回给前端,由浏览器解析这段XSS脚本,触发XSS漏洞。因此如果要避免反射性XSS,则必须需要后端的协调,在后端解析前端的数据时首先做相关的字串检测和转义处理;同时前端同样也许针对用户的数据做excape转义,保证数据源的可靠性

基本原理就是通过给别人发送带有恶意脚本代码参数的URL,当URL地址被打开时,特定的代码参数会被HTML解析,执行,如此就可以获取用户的COOIKE,进而盗号登陆。

特点是:非持久化 必须用户点击带有特定参数的链接才能引起。
XSS反射型攻击,恶意代码并没有保存在目标网站,通过引诱用户点击一个链接到目标网站的恶意链接来实施攻击的。

Low Level

Low level will not check the requested input, before including it to be used in the output text.
将请求的输入包含在输出文本中之前,Low level 将不检查请求的输入。

源码审计

源码如下,服务器只是判断了 name 参数是否为空,如果不为空的话就直接打印出来。服务器并没有对 name 参数做任何的过滤和检查,存在明显的 XSS 漏洞。

<?phpheader ("X-XSS-Protection: 0");// Is there any input?
if(array_key_exists("name", $_GET) && $_GET['name'] != NULL){// Feedback for end userecho '<pre>Hello ' . $_GET['name'] . '</pre>';
}?> 

攻击方式

HTML DOM 有个 alert() 方法,用于显示带有一条指定消息和一个 OK 按钮的警告框。document.cookie 里面可以读到 cookie 信息,我们可以把 cookie 放在一个 alert() 生成的警告框中,回显时就会得到我们想要的信息了。注入的payload 如下所示:

<script>alert(document.cookie)</script> 


注入 payload 之后,前端的代码中会加入下面这个结点。

Medium Level

The developer has tried to add a simple pattern matching to remove any references to "< script >", to disable any JavaScript.
开发人员尝试添加一个简单的模式匹配来删除对 “< script >” 的任何引用,从而禁用任何 JavaScript 脚本。

源码审计

源码如下,array_key_exists() 函数检查某个数组中是否存在指定的键名,如果键名存在返回 true,键名不存在则返回 false。str_replace() 函数替换字符串中的一些字符(区分大小写),此处会检查 name 参数中是否有 “< script >”,如果有则替换为空。

<?phpheader ("X-XSS-Protection: 0");// Is there any input?
if(array_key_exists("name", $_GET) && $_GET['name'] != NULL){// Get input$name = str_replace('<script>', '', $_GET['name']);// Feedback for end userecho "<pre>Hello ${name}</pre>";
}?> 

攻击方式

虽然服务器把 “< script >” 过滤了,但是这并没有什么用,因为将该标签大写也能起到相同的效果。使用大写绕过构造 payload:

<SCRIPT>alert(document.cookie)</SCRIPT>

当然绕过方式不唯一,使用双写绕过也行。

<sc<script>ript>alert(/xss/)</script>

High Level

开发人员相信可以通过删除模式 “<script” 来禁用所有的 JavaScript。

源码审计

源码如下,preg_replace() 函数执行一个正则表达式的搜索和替换,“*” 代表一个或多个任意字符,“i” 代表不区分大小写。也就是说 “< script >” 标签在这里被完全过滤了,但是我们可以通过其他的标签例如 img、body 等标签的事件或者iframe 等标签的 src 注入 JS 攻击脚本。

<?phpheader ("X-XSS-Protection: 0");// Is there any input?
if(array_key_exists("name", $_GET) && $_GET['name'] != NULL){// Get input$name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET['name']);// Feedback for end userecho "<pre>Hello ${name}</pre>";
}?> 

攻击方式

这种防御形同虚设,因为我们可以直接注入标签将 cookie 显示出来。HTML 的 < img > 标签定义 HTML 页面中的图像,该标签支持 onerror 事件,在装载文档或图像的过程中如果发生了错误就会触发。使用这些内容构造出 payload 如下,因为我们没有图片可供载入,因此会出错从而触发 onerror 事件输出 cookie。

<img src = 1 onerror = alert(document.cookie)>

Impossible Level

Using inbuilt PHP functions (such as "htmlspecialchars()"), its possible to escape any values which would alter the behaviour of the input.
使用内置的 PHP 函数(例如 “htmlspecialchars()”),可以转义任何会改变输入行为的值。

<?php// Is there any input?
if(array_key_exists("name", $_GET) && $_GET['name'] != NULL ) {// Check Anti-CSRF tokencheckToken($_REQUEST['user_token'], $_SESSION['session_token'], 'index.php' );// Get input$name = htmlspecialchars($_GET['name']);// Feedback for end userecho "<pre>Hello ${name}</pre>";
}// Generate Anti-CSRF token
generateSessionToken();?> 

htmlspecialchars() 函数用于把预定义的字符 "<" 和 ">" 转换为 HTML 实体,防止了我们注入 HTML 标签。例如我们注入 “”,htmlspecialchars 函数会将 < 和 > 转换成 html 实体而不是当做标签,所以我们插入的语句并不会被执行。同时加入 Anti-CSRF token 防护 CSRF 攻击,进一步提高安全性。

总结与防御

跨站脚本 (Cross-Site Scripting) 是一种针对 Web 程序的代码注入型漏洞攻击,它允许攻击者将恶意脚本注入网页,使得其他用户浏览网页时收到影响。所谓反射型 XSS 就是提交了恶意脚本实现的 XSS 仅对这次访问产生了影响,并非持久性的 XSS 攻击。
XSS 的攻击方式为攻击者请求一个带有 payload 的 URL,服务器的响应不会以任何形式包含攻击者的脚本。XSS 漏洞的修复方式有以下 2 种:

  1. 过滤输入的字符,例如 “ ' ”,“ " ”,“<”,“>” 等非法字符;
  2. 对输出到页面的数据进行编码

XSS(Stored)

XSS存储型攻击,攻击者事先将恶意代码上传或储存到漏洞服务器中,只要受害者浏览包含此恶意代码的页面就会执行恶意代码。这就意味着只要访问了这个页面的访客,都有可能会执行这段恶意脚本,因此储存型XSS的危害会更大。因为存储型XSS的代码存在于网页的代码中,可以说是永久型的。

  存储型 XSS 一般出现在网站留言、评论、博客日志等交互处,恶意脚本存储到客户端或者服务端的数据库中。

Low Level

在将请求的输入包含在输出文本中之前,Low level 将不检查输入的任何的请求。

源码审计

源码如下,trim(string,charlist) 函数用于移除字符串两侧的空白字符或其他预定义字符,charlist 参数可以规定从字符串中删除哪些字符。stripslashes() 函数用于删除反斜杠,可用于清理从数据库中或者从 HTML 表单中取回的数据。mysqli_real_escape_string() 函数用于对字符串中的特殊字符进行转义,使得这个字符串是一个合法的 SQL 语句。GLOBALS 是引用全局作用域中可用的全部变量,是一个包含了全部变量的全局组合数组。
源码的用意是输入一个名字和一段文本,然后网页把输入的信息加入到数据库中,同时服务器也会将服务器的内容回显到网页上。

<?phpif(isset($_POST['btnSign'])){// Get input$message = trim($_POST['mtxMessage']);$name    = trim($_POST['txtName']);// Sanitize message input$message = stripslashes($message);$message = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $message ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));// Sanitize name input$name = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $name ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));// Update database$query  = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );";$result = mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );//mysql_close();
}?>

例如我们随便输入一个名字和一个文本,点击提交,网页会把这些内容加入数据库并回显。
 


打开数据库查看,这些文本的确被加入了数据库。
 


源码对我们输入的 message 和 name 并没有进行 XSS 过滤,直接将数据存储在数据库中,存在存储型 XSS 漏洞。

攻击方式

直接在 Message 注入 payload,服务器成功弹出页面。这种攻击是永久性的,每次切换到这个页面都会弹出,除非开发者删除数据库内容。

<script>alert('xss')</script>


 


查看网页源码,我们注入的 JS 脚本已经被插入了。

Medium Level

开发人员已经添加了一些保护,但是并不是每个区域都有这样的防护。

源码审计

源码如下,addslashes() 函数在每个双引号前添加反斜杠,返回在预定义字符之前添加反斜杠的字符串。strip_tags() 函数用于剥去字符串中的 HTML、XML 以及 PHP 的标签,htmlspecialchars() 函数用于把预定义的字符 "<" 和 ">" 转换为 HTML 实体。
可以看到 Message 参数对所有的 XSS 都进行了过滤,但是 name 参数只是过滤了 < script > 标签而已,我们可以对 name 参数进行注入。

<?phpif(isset($_POST['btnSign'])){// Get input$message = trim($_POST['mtxMessage']);$name    = trim($_POST['txtName']);// Sanitize message input$message = strip_tags(addslashes($message));$message = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $message ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));$message = htmlspecialchars( $message );// Sanitize name input$name = str_replace('<script>', '', $name);$name = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $name ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));// Update database$query  = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );";$result = mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );//mysql_close();
}?> 

攻击方式

由于 name 参数有输入限制,因此我们需要抓包改参数,注入的 JS 脚本可以用大小写绕过。

<SCRIPT>alert('xss')</SCRIPT> 


注入 payload 后,服务器成功弹出页面。

High Level

The developer believe they have disabled all script usage by removing the pattern "<script".
开发人员相信他们通过模式匹配 “<s
cript”,禁用了所有脚本的使用。

源码审计

源码如下,preg_replace() 函数执行一个正则表达式的搜索和替换,“*” 代表一个或多个任意字符,“i” 代表不区分大小写。也就是说 name 参数 “< script >” 标签在这里被完全过滤了,但是我们可以通过其他的标签例如 img、body 等标签的事件或者iframe 等标签的 src 注入 JS 攻击脚本。

<?phpif(isset($_POST['btnSign'])){// Get input$message = trim($_POST['mtxMessage']);$name    = trim($_POST['txtName']);// Sanitize message input$message = strip_tags(addslashes($message));$message = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $message ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));$message = htmlspecialchars($message);// Sanitize name input$name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $name );$name = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $name ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));// Update database$query  = "INSERT INTO guestbook (comment, name) VALUES ('$message', '$name');";$result = mysqli_query($GLOBALS["___mysqli_ston"],  $query) or die('<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>');//mysql_close();
}?> 

攻击方式

HTML 的 < img > 标签定义 HTML 页面中的图像,该标签支持 onerror 事件,在装载文档或图像的过程中如果发生了错误就会触发。使用这些内容构造出 payload 如下,因为我们没有图片可供载入,因此会出错从而触发 onerror 事件。

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

仍然是抓包之后改参数,放包后成功弹出页面。

Impossible Level

使用内置的PHP函数(例如 “htmlspecialchars()”),可以转义任何会改变输入行为的值。

<?phpif(isset($_POST['btnSign'])){// Check Anti-CSRF tokencheckToken($_REQUEST['user_token'], $_SESSION['session_token'], 'index.php');// Get input$message = trim($_POST['mtxMessage']);$name    = trim($_POST['txtName']);// Sanitize message input$message = stripslashes($message);$message = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $message ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));$message = htmlspecialchars( $message );// Sanitize name input$name = stripslashes($name);$name = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $name ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));$name = htmlspecialchars($name);// Update database$data = $db->prepare('INSERT INTO guestbook ( comment, name ) VALUES ( :message, :name );');$data->bindParam(':message', $message, PDO::PARAM_STR);$data->bindParam(':name', $name, PDO::PARAM_STR);$data->execute();
}// Generate Anti-CSRF token
generateSessionToken();?> 

源码在 high 级别的基础上对 name 参数也进行了更严格的过滤,导致 name 参数也无法进行 JS 脚本注入。同时加入 Anti-CSRF token 防护 CSRF 攻击,进一步提高安全性。

总结与防御

跨站脚本 (Cross-Site Scripting) 是一种针对 Web 程序的代码注入型漏洞攻击,它允许攻击者将恶意脚本注入网页,使得其他用户浏览网页时收到影响。所谓存储型 XSS 又称为持久型 XSS,攻击脚本会被永久保存在目标服务器的数据库或文件中,具有更高的隐蔽性。
存储型 XSS 的攻击常见于论坛、博客或留言等需要提交文本的页面,攻击者将攻击脚本和文本一起注入。当文本被服务器存储下来时,恶意脚本也会被永久存放与服务器的数据库或文件中。当其他用户访问这个含有恶意脚本的页面时,恶意脚本会在用户的浏览器中执行。XSS 漏洞的修复方式有以下 2 种:

  1. 过滤输入的字符,例如 “ ' ”,“ " ”,“<”,“>” 等非法字符;
  2. 对输出到页面的数据进行编码

相关文章:

web基础—dvwa靶场(十)XSS

XSS(DOM) 跨站点脚本&#xff08;XSS&#xff09;攻击是一种注入攻击&#xff0c;恶意脚本会被注入到可信的网站中。当攻击者使用 web 应用程序将恶意代码&#xff08;通常以浏览器端脚本的形式&#xff09;发送给其他最终用户时&#xff0c;就会发生 XSS 攻击。允许这些攻击成…...

搜索引擎onesearch3实现解释和升级到Elasticsearch v8系列(五)-聚合

聚合 聚合基于Query结果的统计&#xff0c;执行过程是搜索的一部分&#xff0c;Onesearch支持0代码构建聚合&#xff0c;聚合目前完全在引擎层 0代码聚合 上图是聚合的配置&#xff0c;包括2个pdm文档聚合统计 termsOfExt term桶聚合&#xff0c;统计ext&#xff0c;如&…...

Pandas中df常用方法介绍

目录 常用方法df.columnsdf.indexdf.valuesdf.Tdf.sort_index()df.sort_values() 案例 常用方法 df.columns df.columns 是 Pandas 中 DataFrame 对象的一个属性&#xff0c;用于获取 DataFrame 中的列标签&#xff08;列名&#xff09;。 基本语法如下&#xff1a; df.col…...

LabVIEW中AVI帧转图像数据

在LabVIEW中&#xff0c;有时需要将AVI视频文件的帧转换为图像数据进行进一步处理。下面详细讲解了如何从AVI视频提取单帧并将其转换为图像数据集群&#xff0c;以便与其他图像处理VI兼容。 问题背景&#xff1a; 用户已经拥有能够处理JPEG图像数据集群的VI&#xff0c;现在希…...

并发与并行的区别:深入理解Go语言中的核心概念

在编程中,并发与并行的区别往往被忽视或误解。很多开发者在谈论这两个概念时,常常把它们混为一谈,认为它们都指“多个任务同时运行”。但实际上,这种说法并不完全正确。如果我们深入探讨并发和并行的区别,会发现它不仅是词语上的不同,更是编程中非常重要的抽象层次,特别…...

小小扑克牌算法

1.定义一个扑克牌类Card&#xff1a; package democard; public class Card {public String suit;//表示花色public int rank;//表示牌点数Overridepublic String toString() {return "{"suit rank"}";}//实例方法&#xff0c;初始化牌的点数和花色public…...

【第34章】Spring Cloud之SkyWalking分布式日志

文章目录 前言一、准备1. 引入依赖 二、日志配置1. 打印追踪ID2. gRPC 导出 三、完整日志配置四、日志展示1. 前端2. 后端 总结 前言 前面已经完成了请求的链路追踪&#xff0c;这里我们通过SkyWalking来处理分布式日志&#xff1b; 场景描述&#xff1a;我们有三个服务消费者…...

easy-es动态索引支持

背景 很多项目目前都引入了es&#xff0c;由于es弥补了mysql存储及搜索查询的局限性&#xff0c;随着技术的不断迭代&#xff0c;原生的es客户端使用比较繁琐不直观&#xff0c;上手代价有点大&#xff0c;所以easy-es框架就面世了&#xff0c;学习成本很低&#xff0c;有空大…...

SWC(Speedy Web Compiler)

概述 SWC 由 Rust 编写&#xff0c; 既可用于编译&#xff0c;也可用于打包。 对于编译&#xff0c;它使用现代 JavaScript 功能获取 JavaScript / TypeScript 文件并输出所有主流浏览器支持的有效代码。 SWC在单线程上比 Babel 快 20 倍&#xff0c;在四核上快 70 倍。 简…...

【计算机网络】传输层协议UDP

目录 一、端口号1.1 端口号范围划分1.2 认识知名端口号 二、UDP协议2.1 UDP协议端格式2.2 UDP的特点2.3 UDP的缓冲区2.4 UDP使用注意事项2.5 基于UDP的应用层协议 一、端口号 传输层协议负责数据的传输&#xff0c;从发送端到接收端。端口号标识一个主机上进行通信的不同的应用…...

Docker+PyCharm远程调试环境隔离解决方案

DockerPyCharmMiniconda实现深度学习代码远程调试和环境隔离 本文详细介绍了如何在局域网环境下&#xff0c;利用Docker、PyCharm和Miniconda构建一个高效的深度学习远程调试平台。首先在服务器&#xff08;server&#xff09;上&#xff0c;通过Docker构建包含不同CUDA环境的镜…...

数字化转型的理论框架对比:从多维视角指导企业成功变革对比DPBOKIT4ITCOBITTOGAF

数字化转型的多维框架解析 在数字化时代&#xff0c;企业如何有效实现数字化转型已成为其生存和发展的关键问题。然而&#xff0c;市场上关于数字化管理的各种框架和理论并存&#xff0c;企业需要根据自身的需求选择最适合的指导路径。本文将通过对几个核心理论框架的对比&…...

【C++掌中宝】深入解析C++命名空间:有效管理代码的利器

文章目录 前言1. namespace 的价值2. namespace 的定义3. 命名空间的本质4. 嵌套的命名空间5. 命名空间的使用6. using 指令7. 补充结语 前言 假设这样一种情况&#xff0c;当一个班上有两个名叫 Zara 的学生时&#xff0c;为了明确区分它们&#xff0c;我们在使用名字之外&am…...

2024/9/21 leetcode 21.合并两个有序链表 2.两数相加

目录 21.合并两个有序链表 题目描述 题目链接 解题思路与代码 2.两数相加 题目描述 题目链接 解题思路与代码 --------------------------------------------------------------------------- 21.合并两个有序链表 题目描述 将两个升序链表合并为一个新的 升序 链表并返…...

Python学习的主要知识框架

Python的主要学习知识点非常广泛且深入&#xff0c;但我可以为您概括一些核心的学习领域&#xff0c;帮助您系统地掌握Python编程。以下是Python学习的主要知识框架&#xff1a; 1. Python基础语法 数据类型&#xff1a;整数、浮点数、字符串、布尔值、列表、元组、字典、集合…...

LLaMA-Factory 使用 alpaca 格式的数据集

LLaMA-Factory 使用 alpaca 格式的数据集 flyfish alpaca 格式最初与Stanford大学的一个研究项目相关联&#xff0c;该项目旨在通过少量高质量的数据来微调大型语言模型。它受到了Alpaca模型&#xff08;一种基于LLaMA的指令跟随模型&#xff09;的影响&#xff0c;该模型是在…...

【Mysql】Mysql数据库基础

1.❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; Hello, Hello~ 亲爱的朋友们&#x1f44b;&#x1f44b;&#xff0c;这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章&#xff0c;请别吝啬你的点赞❤️❤️和收藏&#x1f4d6;&#x1f4d6;。如果你对我的…...

一文彻底让你搞懂轨迹规划(总结)

机器人在运行中不可避免的会进行运动&#xff0c;那么就会产生出轨迹规划的概念。 轨迹规划的特点&#xff1a;用一定的函数形式表示控制量&#xff08;位置&#xff0c;速度&#xff0c;加速度&#xff09;的控制律&#xff0c;根据约束或最优目标&#xff0c;求取控制控制参…...

windows C++ 并行编程-异步消息块(二)

overwrite_buffer 类 concurrency::overwrite_buffer 类与 unbounded_buffer 类类似&#xff0c;只不过 overwrite_buffer 对象仅存储一条消息。 此外&#xff0c;当目标接收来自 overwrite_buffer 对象的消息时&#xff0c;不会从缓冲区中删除该消息。 因此&#xff0c;多个目…...

【软件基础知识】什么是 API,详细解读

想象一下,你正在使用智能手机上的天气应用。你打开应用,瞬间就能看到实时天气、未来预报,甚至是空气质量指数。但你有没有想过,这些数据是如何神奇地出现在你的屏幕上的?答案就在三个字母中:API。 API,全称Application Programming Interface(应用程序编程接口),是现代软件世…...

计算机四级-计算机网络

一、基础知识 1.对计算机网络发展具有重要影响的广域网是&#xff1a;ARPANET 随机争用型的介质访问控制方法起源于&#xff1a;ALOHANET 2.计算机网络发展阶段&#xff1a; A&#xff09;第一阶段的主要成果是计算机技术与通信技术的结合 B&#xff09;第二阶段的主要成果…...

【linux 获取时间】

linux 获取时间接口 我们在开发调试过程中&#xff0c;可能遇到一些和调用时序相关的问题&#xff0c;为了查看哪个步骤先调用&#xff0c;哪个步骤后调用&#xff0c;我们可以使用函数打印或者主动trace堆栈…但是有的时候我们需要排查2个接口调用的时间间隔&#xff0c;我们可…...

Dockerfile部署xxljob

使用Dockerfile部署xxljob 1. 背景 我们在使用定时任务调度时&#xff0c;通常会使用xxljob容器化部署xxljob&#xff0c;通常使用 docker pull xuxueli/xxl-job-admin:2.4.0 拉取镜像并启动容器。这种方式对于x86架构服务器来说&#xff0c;没有任何问题。但是在arm架构的服…...

Conda新建python虚拟环境问题

Conda新建python虚拟环境问题&#xff1a; 【问题1】 conda create --name yolov8 python3.10 -y Retrieving notices: …working… done Channels: defaults Platform: win-64 Collecting package metadata (repodata.json): failed UnavailableInvalidChannel: HTTP 404 NO…...

这几个优秀的工具网站真心值得推荐——搜嗖工具箱

即时工具 https://www.67tool.com/ 这是一个专注提升效率的办公工具网站&#xff1b;这也是一个拥有260多款自研在线工具和200多个客户端离线工具的服务网站&#xff1b;这还是一个可以满足包括视频处理、音频处理、图片处理、文档处理、文档转换、办公辅助、图表生成、文本工…...

ESP32开发 -- VSCODE+PlatformIO环境安装

参看官网安装&#xff1a;PlatformIO IDE for VSCode 一、安装PlatformIO IDE 参看&#xff1a;日常生活小技巧 – Visual Studio Code 简单使用 扩展中搜索platformIO IDE 当安装完提示重启之后。 打开一个要创建新工程的文件夹&#xff1a; 点击 Create New Project&…...

MySQL--导入SQL文件(命令行导入)

MySQL--导入SQL文件 一、前言二、导入SQL文件 一、前言 用可视化编辑工具编写&#xff0c;并且在控制台输入命令行在MySQL中导入SQL文件。 在导入SQL文件之前查看了目前存在的数据库 **目标&#xff1a;**在可视化编辑工具(这里以word文档为例&#xff09;中编写SQL语句&…...

【C#基础】函数传参大总结

目录 前言参数是值类型的情况1. 按值传递&#xff08;Pass by Value&#xff09;2. 按引用传递&#xff08;Pass by Reference&#xff09;使用 ref使用 in 3. 输出参数传递&#xff08;Output Parameters&#xff09;参数修饰符对比小结 参数是引用类型的情况1. 按值传递类对象…...

初学51单片机之IO口上下拉电阻相关

本案本来是描述一下I2C总线的&#xff0c;在此之前推荐一下B站一个UP关于时序图的讲解 I2C入门第一节-I2C的基本工作原理_哔哩哔哩_bilibili 不过在描述I2C前先简单的探讨下51单片机IO口下拉电阻的基本情况&#xff0c;事实上这个问题困扰笔者很长时间了&#xff0c;这次也是一…...

Resnet50网络——口腔癌病变识别

一 数据准备 1.导入数据 import matplotlib.pyplot as plt import tensorflow as tf import warnings as w w.filterwarnings(ignore) # 支持中文 plt.rcParams[font.sans-serif] [SimHei] # 用来正常显示中文标签 plt.rcParams[axes.unicode_minus] False # 用来正常显示负…...