3.【BUUCTF】XSS-Lab1

进入题目页面如下

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

发现题目给出了源码

查看得到本题的源码

分析一下代码

html 复制代码
<!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 参数,值为 test
            window.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,

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

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

进入第二关?level2,

居然不能直接得到flag qyq

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

html 复制代码
<!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 的参数,值为 wait
            window.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 参数,

html 复制代码
/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继续查看源码,并分析

html 复制代码
<!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 参数:

html 复制代码
/level3.php?keyword=' onclick='alert(1)

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

2. 上下文处理不当

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

3. 绕过机制

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

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

进入下一关level4

html 复制代码
<!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 参数:

html 复制代码
/level4.php?keyword=" onfocus=alert('XSS') autofocus="

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

复制代码
<input name="keyword"  value=" onfocus=alert('XSS') autofocus=">

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

成功进入第五关level5

html 复制代码
<!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. 过滤不全面

绕过替换规则 :虽然代码尝试替换 <scripton,但攻击者可以采用其他方式构造恶意脚本。例如,攻击者可以使用大写字母、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:

html 复制代码
/level5.php?keyword="><a href=javascript:alert(1)>

点击">成功进入下一个

level6

html 复制代码
<!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:

html 复制代码
/level6.php?keyword="><a HrEf=javascript:alert(1)>

进入下一关

level7

html 复制代码
<!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. 利用大小写绕过
html 复制代码
/level7.php?keyword="><scrscriptipt>alert(1)</scrscriptipt>

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

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

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

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

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

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

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

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

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

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

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

快来试试

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

查看源码

html 复制代码
<!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 和 arg02
            window.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=arg02
        echo '<embed src="xsf04.swf?'.htmlspecialchars($_GET["arg01"])."=".htmlspecialchars($_GET["arg02"]).'" width=100% heigth=100%>';
    ?>
</body>
</html>
Flash 文件的安全风险

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

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

参数拼接和 URL 构造问题

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

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

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

相关推荐
用户962377954482 小时前
DVWA 靶场实验报告 (High Level)
安全
数据智能老司机5 小时前
用于进攻性网络安全的智能体 AI——在 n8n 中构建你的第一个 AI 工作流
人工智能·安全·agent
数据智能老司机5 小时前
用于进攻性网络安全的智能体 AI——智能体 AI 入门
人工智能·安全·agent
用户962377954486 小时前
DVWA 靶场实验报告 (Medium Level)
安全
red1giant_star6 小时前
S2-067 漏洞复现:Struts2 S2-067 文件上传路径穿越漏洞
安全
用户9623779544810 小时前
DVWA Weak Session IDs High 的 Cookie dvwaSession 为什么刷新不出来?
安全
cipher2 天前
ERC-4626 通胀攻击:DeFi 金库的"捐款陷阱"
前端·后端·安全
一次旅行5 天前
网络安全总结
安全·web安全
DianSan_ERP5 天前
电商API接口全链路监控:构建坚不可摧的线上运维防线
大数据·运维·网络·人工智能·git·servlet
red1giant_star5 天前
手把手教你用Vulhub复现ecshop collection_list-sqli漏洞(附完整POC)
安全