内容目录
- # 一、客户检测报告
- • 事件URL
- • 事件类型
- • 转码前的注册方式
- • 原理
- # 二、XSS注入分析
- • 漏洞分析
- • 影响
- # 三、处理方式
- • 方法1:过滤JS关键字
- —— 代码示例
- • 方法2:转义特殊符号及HTML关键字
- —— 代码示例
- # 四、如何使用
- • 示例
- # 五、常见问题与解决方案
- • 问题1:过滤后的参数显示不正确
- • 问题2:过滤函数影响正常功能
- • 问题3:性能问题
- # 六、结语
在使用织梦CMS (DedeCMS) 时,有时会遇到登录页面的XSS(跨站脚本)注入漏洞。本文将详细介绍这一漏洞的原因及具体的处理措施,帮助您提升网站的安全性。
一、客户检测报告
事件URL
深色版本http://127.0.0.1/mgr/login.php?gotopage=%22%3E%3Cinput%20type=%22text%22%20onInput=alert(1)%3E%3Cx=%22
事件类型
- 漏洞类型:KingCms门户系统存储型XSS
转码前的注册方式
深色版本http://127.0.0.1/mgr/login.php?gotopage="><input type="text" onInput=alert(1)><x="
原理
攻击者利用目标表单页面上的一个隐藏域 <input name="gotopage" value="${gotopage}">
实现注入,通过在URL中插入恶意脚本,导致XSS攻击。
二、XSS注入分析
漏洞分析
XSS(跨站脚本)攻击是一种常见的安全漏洞,攻击者通过在网页中插入恶意脚本,诱使用户执行这些脚本,从而窃取用户信息或进行其他恶意操作。在织梦CMS的登录页面中,gotopage
参数未经过充分的过滤和转义,导致攻击者可以通过构造特定的URL来注入恶意脚本。
影响
- 用户信息泄露:攻击者可以通过XSS攻击获取用户的敏感信息,如登录凭证。
- 网站被篡改:攻击者可以修改页面内容,展示恶意信息或重定向用户到恶意网站。
- 信任度下降:XSS攻击会影响用户对网站的信任度,损害品牌形象。
三、处理方式
方法1:过滤JS关键字
代码示例
php深色版本function xss_clean1($var) {
$ra = array(
'/([\x00-\x08,\x0b-\x0c,\x0e-\x19])/',
'/script/i',
'/javascript/i',
'/vbscript/i',
'/onload/i',
'/onunload/i',
'/onchange/i',
'/onsubmit/i',
'/onreset/i',
'/onselect/i',
'/onblur/i',
'/onfocus/i',
'/onabort/i',
'/onkeydown/i',
'/onkeypress/i',
'/onkeyup/i',
'/onclick/i',
'/ondblclick/i',
'/onmousedown/i',
'/onmousemove/i',
'/onmouseout/i',
'/onmouseover/i',
'/onmouseup/i',
'/onunload/i'
);
$var = preg_replace($ra, '', $var);
return htmlspecialchars($var, ENT_QUOTES);
}
方法2:转义特殊符号及HTML关键字
代码示例
php深色版本function xss_clean2($data) {
// Fix &entity\n;
$data = str_replace(array('&', '<', '>'), array('&', '<', '>'), $data);
$data = preg_replace('/(&#*\w+)[\x00-\x20]+;/u', '$1;', $data);
$data = preg_replace('/(&#x*[0-9A-F]+);*/iu', '$1;', $data);
$data = html_entity_decode($data, ENT_COMPAT, 'UTF-8');
// Remove any attribute starting with "on" or xmlns
$data = preg_replace('#(<[^>]+?[\x00-\x20"\'])(?:on|xmlns)[^>]*+>#iu', '$1>', $data);
// Remove javascript: and vbscript: protocols
$data = preg_replace('#([a-z]*)[\x00-\x20]*=[\x00-\x20]*([`\'"]*)[\x00-\x20]*j[\x00-\x20]*a[\x00-\x20]*v[\x00-\x20]*a[\x00-\x20]*s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:#iu', '$1=$2nojavascript...', $data);
$data = preg_replace('#([a-z]*)[\x00-\x20]*=([\'"]*)[\x00-\x20]*v[\x00-\x20]*b[\x00-\x20]*s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:#iu', '$1=$2novbscript...', $data);
$data = preg_replace('#([a-z]*)[\x00-\x20]*=([\'"]*)[\x00-\x20]*-moz-binding[\x00-\x20]*:#u', '$1=$2nomozbinding...', $data);
// Only works in IE: <span style="width: expression(alert('Ping!'));"></span>
$data = preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?expression[\x00-\x20]*\([^>]*+>#i', '$1>', $data);
$data = preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?behaviour[\x00-\x20]*\([^>]*+>#i', '$1>', $data);
$data = preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:*[^>]*+>#iu', '$1>', $data);
// Remove namespaced elements (we do not need them)
$data = preg_replace('#</*\w+:\w[^>]*+>#i', '', $data);
do { // Remove really unwanted tags
$old_data = $data;
$data = preg_replace('#</*(?:applet|b(?:ase|gsound|link)|embed|frame(?:set)?|i(?:frame|layer)|l(?:ayer|ink)|meta|object|s(?:cript|tyle)|title|xml)[^>]*+>#i', '', $data);
} while ($old_data !== $data);
return $data;
}
四、如何使用
在接收页面,用这两个函数分别过滤所有的参数:
php深色版本$gotopage = xss_clean1($gotopage);
$gotopage = xss_clean2($gotopage);
示例
假设您的登录页面代码如下:
php深色版本<?php
// 引入必要的文件
require_once 'config.php';
// 接收gotopage参数
$gotopage = isset($_GET['gotopage']) ? $_GET['gotopage'] : '';
// 过滤参数
$gotopage = xss_clean1($gotopage);
$gotopage = xss_clean2($gotopage);
// 输出表单
?>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>织梦CMS登录页面</title>
</head>
<body>
<form action="login.php" method="post">
<label for="username">用户名:</label>
<input type="text" id="username" name="username" required>
<br>
<label for="password">密码:</label>
<input type="password" id="password" name="password" required>
<br>
<input type="hidden" name="gotopage" value="<?php echo htmlspecialchars($gotopage); ?>">
<button type="submit">登录</button>
</form>
</body>
</html>
五、常见问题与解决方案
问题1:过滤后的参数显示不正确
解决方案:
- 检查过滤函数:确保过滤函数正确无误,特别是正则表达式的匹配和替换。
- 调试输出:在过滤前后打印参数值,检查过滤效果。
问题2:过滤函数影响正常功能
解决方案:
- 逐步调试:逐步添加过滤规则,观察每一步的影响,确保不会误过滤正常内容。
- 白名单机制:对于某些必须保留的特殊字符,可以采用白名单机制,只允许特定字符通过。
问题3:性能问题
解决方案:
- 优化正则表达式:简化复杂的正则表达式,提高匹配效率。
- 缓存结果:对于频繁使用的参数,可以考虑缓存过滤后的结果,减少重复计算。
六、结语
通过本文的详细指导,您应该已经能够诊断并解决织梦CMS登录页面的XSS注入漏洞。安全性的提升不仅能够保护用户信息,还能增强网站的可信度。希望本篇文章对您有所帮助!如果有任何问题或建议,欢迎在评论区留言交流。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
暂无评论内容