织梦CMS (DedeCMS) 登录页面的XSS注入漏洞及处理方案

在使用织梦CMS (DedeCMS) 时,有时会遇到登录页面的XSS(跨站脚本)注入漏洞。本文将详细介绍这一漏洞的原因及具体的处理措施,帮助您提升网站的安全性。

图片[1]-织梦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('&amp;', '&lt;', '&gt;'), $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:过滤后的参数显示不正确

解决方案

  1. 检查过滤函数:确保过滤函数正确无误,特别是正则表达式的匹配和替换。
  2. 调试输出:在过滤前后打印参数值,检查过滤效果。

问题2:过滤函数影响正常功能

解决方案

  1. 逐步调试:逐步添加过滤规则,观察每一步的影响,确保不会误过滤正常内容。
  2. 白名单机制:对于某些必须保留的特殊字符,可以采用白名单机制,只允许特定字符通过。

问题3:性能问题

解决方案

  1. 优化正则表达式:简化复杂的正则表达式,提高匹配效率。
  2. 缓存结果:对于频繁使用的参数,可以考虑缓存过滤后的结果,减少重复计算。

六、结语

通过本文的详细指导,您应该已经能够诊断并解决织梦CMS登录页面的XSS注入漏洞。安全性的提升不仅能够保护用户信息,还能增强网站的可信度。希望本篇文章对您有所帮助!如果有任何问题或建议,欢迎在评论区留言交流。

© 版权声明
THE END
喜欢就支持一下吧
点赞8赞赏 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容