织梦index.php.bak注入

99ANYc3cd6
预计阅读时长 15 分钟
位置: 首页 织梦建站 正文

漏洞成因分析

1 什么是 .bak 文件?

.bak 是 "backup"(备份)的缩写,在网站开发过程中,开发者经常会修改核心文件(如 index.php),为了防止修改出错导致网站无法访问,他们习惯在修改前将原文件复制一份并重命名为 index.php.bakindex.php.oldindex.php.1 等形式。

织梦index.php.bak注入
(图片来源网络,侵删)

关键问题:这些备份文件如果未经处理就被上传到服务器上,并且没有在 .htaccess 或其他配置文件中禁止访问,那么任何通过浏览器都可以直接下载到它们。

2 index.php.bak 文件泄露了什么?

index.php 是织梦CMS的入口文件,在存在漏洞的旧版本中(如 DedeCMS V5.7 及之前版本),index.php 文件通常会包含一些处理用户请求的代码,处理首页搜索、自定义表单提交等。

通过下载 index.php.bak 文件,攻击者可以获取到原始的、未经混淆的PHP源代码

3 从源代码到SQL注入

攻击者拿到 index.php.bak 文件后,会仔细分析其中的代码,他们重点寻找的是直接接收用户输入(GET或POST参数)并将其拼接到SQL查询语句中,但没有进行充分过滤或参数化查询的代码段。

织梦index.php.bak注入
(图片来源网络,侵删)

在织梦CMS的历史版本中,一个典型的漏洞点出现在处理搜索请求时,在 index.php 中可能会有类似这样的代码片段:

// ... 其他代码 ...
// 假设URL为: /index.php?keyword=test&searchtype=titlekeyword
if ($dopost == 'search') {
    $keyword = empty($keyword) ? '' : stripslashes($keyword);
    $searchtype = empty($searchtype) ? 'titlekeyword' : $searchtype;
    // 关键漏洞点:$keyword 直接被拼接到SQL语句中
    $sql = "SELECT arc.id, arc.title, arc.pubdate, arc.typeid 
            FROM `#@__archives` arc 
            WHERE arc.title LIKE '%".$keyword."%' 
            OR arc.keywords LIKE '%".$keyword."%'";
    $dsql->SetQuery($sql);
    $dsql->Execute();
    // ... 处理查询结果 ...
}
// ... 其他代码 ...

漏洞分析

  1. keyword 参数从URL中获取。
  2. stripslashes() 函数仅仅移除了反斜杠,它是一个很弱的转义函数,无法防止SQL注入。
  3. 最致命的是,$keyword 被直接用 拼接到了 LIKE 子句的SQL语句中。
  4. 这使得攻击者可以构造恶意的 keyword 值,来改变原SQL语句的逻辑,从而执行任意SQL命令。

注入Payload示例: 假设攻击者访问如下URL: http://your-site.com/index.php?keyword=test' UNION SELECT 1,2,3,4,admin_pwd,6,7,8 FROM dede_admin where adminid=1 -- &dopost=search&searchtype=titlekeyword

服务器端执行的SQL语句会变成:

织梦index.php.bak注入
(图片来源网络,侵删)
SELECT arc.id, arc.title, arc.pubdate, arc.typeid 
FROM `#@__archives` arc 
WHERE arc.title LIKE '%test' UNION SELECT 1,2,3,4,admin_pwd,6,7,8 FROM dede_admin where adminid=1 -- %%'
OR arc.keywords LIKE '%test' UNION SELECT 1,2,3,4,admin_pwd,6,7,8 FROM dede_admin where adminid=1 -- %%'

是SQL的注释符,会使得它后面的SQL代码被忽略,这样,原查询的 WHERE 条件就被破坏,查询结果会返回 dede_admin 表中 adminid=1 的用户的密码哈希值,攻击者获取到这些信息后,就可以尝试破解密码或直接登录后台。


漏洞利用步骤

第一步:探测 .bak 文件是否存在

攻击者首先会猜测常见的备份文件名,并用浏览器访问它们。

http://your-site.com/index.php.bak
http://your-site.com/index.php.old
http://your-site.com/index.php.1
http://your-site.com/index.php.txt

如果返回一个文件下载对话框或直接显示文件内容,说明漏洞存在。

第二步:下载并分析源代码

下载 index.php.bak 文件,用文本编辑器(如VS Code, Sublime Text, Notepad++)打开,搜索可能存在危险的函数,如 $_GET, $_POST, mysql_query, query 等,重点关注它们如何处理用户输入。

第三步:构造并执行注入Payload

根据分析到的代码逻辑,确定注入点(如 keyword 参数)、注入类型(UNION联合查询报错注入等)和数据库表结构(织梦默认表前缀为 dede_)。 然后构造恶意的URL,在浏览器中访问,观察页面返回是否包含敏感信息(如用户名、密码哈希、数据库名等)。

第四步:获取权限

一旦通过SQL注入获取了管理员后台的用户名和密码哈希,攻击者就可以使用在线工具或本地工具进行破解,如果密码较弱,很快就能得到明文密码,进而登录后台,进行挂马、篡改网站、获取服务器权限等恶意操作。


防护与修复方案

1 根本性修复(最推荐)

  1. 删除备份文件

    • 这是最直接、最有效的方法,登录你的FTP或服务器,检查网站根目录,找到所有 .bak, .old, .txt 等后缀的备份文件,并彻底删除它们。
    • 定期检查,确保没有新的备份文件被遗留在服务器上。
  2. 禁止访问备份文件

    • 如果某些备份文件确实需要保留(不推荐),可以通过配置服务器的 .htaccess 文件(Apache/Nginx环境)来禁止外部访问。
    • Apache环境 (.htaccess):
      <FilesMatch "\.(bak|old|txt|fla|psd|ini)$">
          Order allow,deny
          Deny from all
      </FilesMatch>
    • Nginx环境 (nginx.conf):
      location ~* \.(bak|old|txt|fla|psd|ini)$ {
          deny all;
      }

2 升级织梦CMS

  • 旧版本的织梦CMS不仅存在这个漏洞,还可能包含其他已知的安全漏洞。将织梦CMS升级到最新稳定版本是修复所有已知漏洞的最佳实践,新版本已经修复了SQL注入的底层问题,采用了更安全的数据库操作方式。

3 代码层面加固(针对未升级的老旧系统)

  • 使用预处理语句(参数化查询):这是防止SQL注入最标准、最有效的方法,将SQL语句和数据分离开,数据库驱动会自动处理数据的转义。

    // 安全的写法 (使用PDO或MySQLi预处理)
    $sql = "SELECT arc.id, arc.title, arc.pubdate, arc.typeid 
            FROM `#@__archives` arc 
            WHERE arc.title LIKE ? OR arc.keywords LIKE ?";
    $stmt = $dsql->Prepare($sql);
    $searchTerm = '%'.$keyword.'%';
    $dsql->Execute($stmt, [$searchTerm, $searchTerm]);
  • 使用安全的数据库操作类:确保你使用的数据库操作类(如织梦的 dsql 类)已经过安全加固,内部对用户输入进行了充分的过滤和转义。

  • 严格的输入验证与过滤

    • 使用 intval() 处理整数。
    • 使用 htmlspecialchars() 输出到HTML时进行转义。
    • 使用白名单机制,只允许特定格式的字符通过。

index.php.bak 注入漏洞的根源在于开发不规范(遗留备份文件)和代码不安全(直接拼接SQL语句)。

对于网站管理员来说,最简单的防护措施就是:定期检查并删除服务器上的所有备份文件,并及时将CMS系统升级到最新版本。 这能从根本上避免此类漏洞的发生。

-- 展开阅读全文 --
头像
织梦后台栏目空白咋回事?
« 上一篇 昨天
dede吊用jquery为何需身份验证?
下一篇 » 昨天

相关文章

取消
微信二维码
支付宝二维码

目录[+]