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.rhkb.cn/news/12815.html

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

相关文章

uniapp小程序自定义中间凸起样式底部tabbar

我自己写的自定义的tabbar效果图 废话少说咱们直接上代码&#xff0c;一步一步来 第一步&#xff1a; 找到根目录下的 pages.json 文件&#xff0c;在 tabBar 中把 custom 设置为 true&#xff0c;默认值是 false。list 中设置自定义的相关信息&#xff0c; pagePath&#x…

105,【5】buuctf web [BJDCTF2020]Easy MD5

进入靶场 先输入试试回显 输入的值成了password的内容 查看源码&#xff0c;尝试得到信息 什么也没得到 抓包&#xff0c;看看请求与响应里有什么信息 响应里得到信息 hint: select * from admin where passwordmd5($pass,true) 此时需要绕过MD5&#xff08;&#xff09;函…

JVM监控和管理工具

基础故障处理工具 jps jps(JVM Process Status Tool)&#xff1a;Java虚拟机进程状态工具 功能 1&#xff1a;列出正在运行的虚拟机进程 2&#xff1a;显示虚拟机执行主类(main()方法所在的类) 3&#xff1a;显示进程ID(PID&#xff0c;Process Identifier) 命令格式 jps […

【大模型】AI 辅助编程操作实战使用详解

目录 一、前言 二、AI 编程介绍 2.1 AI 编程是什么 2.1.1 为什么需要AI辅助编程 2.2 AI 编程主要特点 2.3 AI编程底层核心技术 2.4 AI 编程核心应用场景 三、AI 代码辅助编程解决方案 3.1 AI 大模型平台 3.1.1 AI大模型平台代码生成优缺点 3.2 AI 编码插件 3.3 AI 编…

机器学习--2.多元线性回归

多元线性回归 1、基本概念 1.1、连续值 1.2、离散值 1.3、简单线性回归 1.4、最优解 1.5、多元线性回归 2、正规方程 2.1、最小二乘法 2.2、多元一次方程举例 2.3、矩阵转置公式与求导公式 2.4、推导正规方程0的解 2.5、凸函数判定 成年人最大的自律就是&#xff1a…

2025最新软件测试面试大全(附答案+文档)

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 1、问&#xff1a;你在测试中发现了一个bug&#xff0c;但是开发经理认为这不是一个bug&#xff0c;你应该怎样解决? 首先&#xff0c;将问题提交到缺陷管理库里…

手写MVVM框架-环境搭建

项目使用 webpack 进行进行构建&#xff0c;初始化步骤如下: 1.创建npm项目执行npm init 一直下一步就行 2.安装webpack、webpack-cli、webpack-dev-server&#xff0c;html-webpack-plugin npm i -D webpack webpack-cli webpack-dev-server html-webpack-plugin 3.配置webpac…

如何自定义软件安装路径及Scoop包管理器使用全攻略

如何自定义软件安装路径及Scoop包管理器使用全攻略 一、为什么无法通过WingetUI自定义安装路径&#xff1f; 问题背景&#xff1a; WingetUI是Windows包管理器Winget的图形化工具&#xff0c;但无法直接修改软件的默认安装路径。原因如下&#xff1a; Winget设计限制&#xf…

数据结构实战之线性表(三)

目录 1.顺序表释放 2.顺序表增加空间 3.合并顺序表 4.线性表之链表实现 1.项目结构以及初始代码 2.初始化链表(不带头结点) 3.链表尾部插入数据并显示 4.链表头部插入数据 5.初始化链表&#xff08;带头结点&#xff09; 6.带头结点的链表头部插入数据并显示 7.带头结…

5.6 Mybatis代码生成器Mybatis Generator (MBG)实战详解

文章目录 前言一、Mybatis Generator简介二、Maven插件运行方式三、生成配置 generatorConfig.xml MyBatis3Simple风格MyBatis3风格MyBatis3DynamicSql风格 四、Java代码运行方式五、MGB生成全部表六、增加Ext包七、Git提交总结 前言 本文我们主要实战Mybatis官方的代码生成器…

DeepSeek:全栈开发者视角下的AI革命者

目录​​​​​​​ DeepSeek&#xff1a;全栈开发者视角下的AI革命者 写在前面 一、DeepSeek的诞生与定位 二、DeepSeek技术架构的颠覆性突破 1、解构算力霸权&#xff1a;从MoE架构到内存革命 2、多模态扩展的技术纵深 3、算法范式的升维重构 4、重构AI竞争规则 三、…

(篇一)基于PyDracula搭建一个深度学习的界面之添加启动界面

文章目录 基于PyDracula搭建一个深度学习的界面插入一个启动界面1启动页面的资源如何加载与管理&#xff1f;2启动界面的代码如何写&#xff1f; 基于PyDracula搭建一个深度学习的界面 插入一个启动界面 1启动页面的资源如何加载与管理&#xff1f; 1. 问题一 启动界面包含一…

无人机图传模块 wfb-ng openipc-fpv,4G

openipc 的定位是为各种模块提供底层的驱动和linux最小系统&#xff0c;openipc 是采用buildroot系统编译而成&#xff0c;因此二次开发能力有点麻烦。为啥openipc 会用于无人机图传呢&#xff1f;因为openipc可以将现有的网络摄像头ip-camera模块直接利用起来&#xff0c;从而…

拍照对比,X70 PRO与X90 PRO+的细节差异

以下是局部截图&#xff08;上X70P下X90PP&#xff09; 对比1 这里看不出差异。 对比2 X90PP的字明显更清楚。 对比3 中下的字&#xff0c;X90PP显然更清楚。

深度探索 C 语言操作符:从基础到实战应用

前言&#xff1a; 在 C 语言的编程体系中&#xff0c;操作符就像是一个个精密的齿轮&#xff0c;相互配合驱动着程序的运转。熟练掌握操作符的使用&#xff0c;不仅能编写出高效、简洁的代码&#xff0c;还能深入理解程序运行的底层逻辑。接下来&#xff0c;让我们一同深入探索…

从零开始实现一个双向循环链表:C语言实战

文章目录 1链表的再次介绍2为什么选择双向循环链表&#xff1f;3代码实现&#xff1a;从初始化到销毁1. 定义链表节点2. 初始化链表3. 插入和删除节点4. 链表的其他操作5. 打印链表和判断链表是否为空6. 销毁链表 4测试代码5链表种类介绍6链表与顺序表的区别7存储金字塔L0: 寄存…

简单本地部署deepseek(软件版)

Download Ollama on Windows 下载 下载安装 winr 输入 cmd 然后输入ollama -v&#xff0c;出现ollama版本&#xff0c;安装成功 deepseek-r1 选择1.5b 输入 cmd 下面代码 ollama run deepseek-r1:1.5b 删除deepseek的代码如下&#xff1a; ollama rm deepseek-r1:1.5b 使用…

21.2.1 基本操作

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 Excel的基本操作步骤&#xff1a; 1、打开Excel&#xff1a;定义了一个Application对象&#xff1a; Microsoft.Office.Interop.E…

SGlang 专为大模型设计的高效服务框架

SGlang 是一种专为大型语言模型&#xff08;LLM&#xff09;和视觉语言模型&#xff08;VLM&#xff09;设计的高效服务框架&#xff0c;旨在提升模型的推理速度和灵活性。以下是关于 SGlang 框架的详细介绍&#xff1a; 1. 框架背景与目标 SGlang 是一种快速服务框架&#x…

基于SpringBoot+vue高效旅游管理系统

Spring Boot后端与Vue前端融合&#xff1a;构建高效旅游管理系统 目录 一、项目简介 二、开发技术与环境配置 2.1 SpringBoot框架 2.2 Java语言简介 2.3 Vue的介绍 2.4 mysql数据库介绍 2.5 B/S架构 三、系统功能实现 四、系统项目截图 登录页面 后台管理页面 用户…