目录
第十四关:存储型XSS
1.打开靶场
2.源码分析
3.渗透实战
第十四关:存储型XSS
本文通过《webug3靶场第十四关 存储型XSS》来进行存储型XSS关卡的渗透实战。
存储型 XSS(Stored Cross - Site Scripting),也被称为持久型 XSS,是跨站脚本攻击(XSS)的一种类型。它的特点是攻击者将恶意脚本存储在目标网站的服务器端数据库、文件系统等持久化存储介质中。当其他用户访问包含该恶意脚本的页面时,恶意脚本会被浏览器执行,从而导致攻击发生。
存储型XSS漏洞对比上一关卡的反射型XSS漏洞,,最主要的区别如下所示。
- 存储型 XSS:攻击者把恶意脚本提交到目标网站的服务器,这些脚本会被持久化保存,像存储在数据库、文件系统里。当其他用户访问包含此恶意脚本的页面时,脚本就会在其浏览器中执行。比如在论坛的留言板、评论区,攻击者输入恶意脚本,若网站未对输入进行严格过滤,脚本就会被保存,之后其他用户浏览该留言或评论时,恶意脚本就会执行。
- 反射型 XSS:攻击者通过诱导用户点击包含恶意脚本的链接来发动攻击。用户点击链接后,服务器会接收链接中的恶意脚本,并将其原样反射到响应页面中,随后在用户浏览器里执行。例如在搜索框中,若网站对输入过滤不严格,攻击者可构造包含恶意脚本的搜索链接,诱导用户点击,服务器返回的搜索结果页面就会包含该恶意脚本。
整理来讲,两者区别如下所示。
对比维度 | 存储型 XSS | 反射型 XSS |
---|---|---|
攻击方式 | 攻击者提交恶意脚本至服务器并持久保存,用户访问含该脚本页面时执行 | 攻击者诱导用户点击含恶意脚本链接,服务器将脚本反射到响应页面执行 |
数据存储 | 恶意脚本存于服务器端,持久存在 | 恶意脚本不存于服务器,仅临时包含在响应中 |
影响范围 | 影响所有访问含脚本页面的用户,范围广、持续久 | 仅影响点击恶意链接的用户 |
检测难度 | 相对容易,可扫描服务器数据发现 | 较困难,脚本临时存在于响应中 |
防范难度 | 需严格过滤验证输入、清理检查存储数据,难度大 | 对输入输出严格过滤编码,避免脚本注入执行 |
1.打开靶场
如下所示打开靶场,第14关卡如下图红框所示。
点击第十四关,完整的URL地址如下所示。
http://192.168.71.1/webug3/pentest/test/10/
很明显这是一个留言区,页面显示了已有的多条留言信息。
这个留言板可能存在存储型XSS漏洞。
2.源码分析
如下所示对传入的留言参数并未进行任何检查过滤,而是直接存储到数据库中,很明显可以通过注入XSS语句形成XSS存储型漏洞。
<?php
//禁用错误报告error_reporting(0);
header("Content-Type: text/html;charset=utf-8");
require_once 'conn.php';
include'./key/config/sql.php';if(isset($_POST["comment"]))
{#$comment=$_POST["comment"];</script>中等级别
$date=date('y-m-d h:i:s',time());$query = "insert into comment(content, time) values('".$_POST['comment']."', '".$date."') ";//构建查询语句$result = mysql_query($query);//执行查询
if (!$result) {die("could not to the database\n" . mysql_error());
}
if (mysql_numrows($result)<=0) {echo "<script type='text/javascript'>alert('提交成功!');location.href='index.php'</script>";
}else{echo "<script type='text/javascript'>alert('提交失败,请重新提交!');location.href='index.php'</script>";
}
}
?>
<!DOCTYPE html>
<head>
<meta http-equiv=Content-Type content="text/html;charset=utf-8">
<title>评论区</title>
<meta name="description" content="Test">
<meta name="author" content="MRYE+">
</head>
<body>
你觉得学好渗透需要自学哪几本书?
<form action="" method="post">
<input type="text" id="comment" name="comment" /><input type="submit" id="submit" name="submit" value="留言"/>
</form>
<hr/>
<?php$query = "select * from comment ";//构建查询语句$result = mysql_query($query);//执行查询
while($result_row=mysql_fetch_row(($result)))//取出结果并显示
{
$id=$result_row[0];
$content=$result_row[1];
$time=$result_row[2];
echo "序号为:".$id."</br>";
echo "评论为:".$content."</br>";
echo "评论时间:".$time."</br>";
echo "<hr/>";
echo "<hr/>";
}?>
</body>
</html>
这个漏洞是因为XSS内容未经过滤,并直接存入数据库,导致出现异常。
$query = "insert into comment(content, time) values('".$_POST['comment']."', '".$date."') ";
3.渗透实战
获取cookie的XSS注入命令如下所示。
<script>alert(document.cookie)</script>
向留言板中输入如上语句。
点击留言,接下来弹框获取到cookie信息,如下所示渗透成功。
这之后,每次再进入到留言板界面,都会有弹出cookie的弹框,存储型XSS获取成功
4.存储型XSS漏洞防范
防御层面 | 具体防御方法 | 原理 |
---|---|---|
输入验证 | 白名单验证 | 只允许符合特定规则的字符(如字母、数字、部分特定符号)输入,阻止恶意脚本代码中的特殊字符(如<script> 等)进入系统,从源头防止恶意脚本注入。 |
长度限制 | 限制用户输入内容的长度,避免攻击者利用长串恶意代码绕过过滤机制,减少恶意脚本成功注入的可能性。 | |
输出编码 | HTML 实体编码 | 将用户输入内容中的特殊字符(如< 编码为< 、> 编码为> 等)转换为 HTML 实体,使浏览器将其作为普通文本显示,而不是解析为可执行的脚本代码。 |
JavaScript 编码 | 对输出到 JavaScript 环境中的内容进行编码,如对单引号(' )、双引号(" )等进行转义处理,防止恶意脚本破坏 JavaScript 代码结构并执行。 | |
服务器端安全策略 | 定期漏洞扫描 | 使用专业安全工具定期扫描服务器,检查是否存在存储型 XSS 漏洞,及时发现并修复潜在的安全隐患。 |
权限控制 | 严格控制用户对服务器资源的访问权限,避免未授权用户上传恶意脚本,降低存储型 XSS 攻击风险。 | |
更新系统和应用 | 及时更新服务器操作系统、Web 应用程序及相关组件,修复已知的安全漏洞,防止攻击者利用旧版本漏洞进行攻击。 | |
设置 HTTP 安全头 | Content - Security - Policy(CSP) | 通过设置 CSP 头,明确指定页面允许加载的资源来源,阻止浏览器从非信任源加载脚本,限制恶意脚本的执行环境。 |
开发规范与意识 | 安全编码培训 | 对开发人员进行安全编码培训,使其了解存储型 XSS 的原理和危害,掌握正确的输入验证、输出编码等安全开发技巧。 |
代码审查 | 在开发过程中,对代码进行严格审查,检查是否存在可能导致存储型 XSS 漏洞的代码逻辑错误,如未对用户输入进行过滤就直接存储和使用。 |