这不仅仅是一个技术点的讲解,更会包含其历史背景、成因、利用方式、修复方案以及如何防范,力求让你全面理解这个安全问题。
漏洞概述
织梦CMS是国内非常流行的网站建设系统,其早期版本(尤其是V5.7及之前)的留言板功能存在一个经典的基于堆叠查询的SQL注入漏洞,攻击者通过精心构造的请求,可以向数据库中执行恶意的SQL命令,从而可能获取网站数据库信息、添加管理员账户、甚至获取服务器权限。
这个漏洞的核心问题在于,程序没有对用户提交的留言内容进行严格的过滤和转义,导致用户输入的恶意SQL代码被拼接到数据库查询语句中并成功执行。
漏洞成因分析
要理解这个漏洞,我们首先要看看织梦CMS留言板处理用户提交数据的流程,这个漏洞通常发生在留言板提交或留言回复这两个环节。
核心原因:未严格过滤用户输入
在早期的织梦CMS中,处理留言提交的PHP文件(通常是plus/guestbook.php)会接收来自表单的数据,
msg(留言内容)tid(回复的留言ID,如果是回复的话)username(留言者姓名)arcticle(留言文章ID)
漏洞最常出现在对 msg 或 tid 这类参数的处理上,程序没有使用足够强大的安全函数(如dede_addslashes)来对输入进行转义,或者没有进行严格的白名单/黑名单过滤。
关键技术点:堆叠查询
这是织梦留言板注入能够“为所欲为”的关键,普通的SQL注入通常只能联合查询(UNION SELECT)来获取数据,功能有限,而堆叠查询允许攻击者执行多条SQL语句,只要用分号()隔开即可。
一个正常的查询可能是:
SELECT * FROM dede_guestbook WHERE id = 1;
一个堆叠查询可以是:
SELECT * FROM dede_guestbook WHERE id = 1; INSERT INTO dede_admin (userid, pwd, type) VALUES ('hacker', 'e10adc3949ba59abbe56e057f20f883e', 'superadmin');
这条语句会先查询ID为1的留言,然后紧接着执行第二条语句,向管理员表中插入一个新的超级管理员账户。
漏洞利用条件
- 目标网站:运行了存在漏洞的织梦CMS版本(如DedeCMS V5.7 SP1及更早版本)。
- 权限要求:通常需要留言板功能对游客开放,如果需要登录才能留言,那么利用门槛会变高。
- 网站配置:
data/common.inc.php文件中的数据库连接信息 ($cfg_dbhost,$cfg_dbuser,$cfg_dbpwd,$cfg_dbname) 必须可以被读取或猜测到,在默认配置下,这个文件在网站根目录外,但一些不安全的配置可能会将其暴露或泄露。
漏洞利用流程(模拟攻击者视角)
假设我们找到一个存在漏洞的织梦网站 http://www.target.com,并且其留言板对游客开放。
第1步:寻找注入点
攻击者会访问留言板页面,http://www.target.com/plus/guestbook.php,在提交留言的表单中,尝试在“留言内容”或“回复”等字段中输入简单的SQL测试语句,
- 单引号 :用于测试程序是否对单引号进行了过滤,如果页面报错或显示异常,则说明存在注入点。
and 1=1和and 1=2:用于判断是布尔盲注还是其他类型注入。
第2步:确认漏洞类型(堆叠查询)
在确认存在注入点后,攻击者会尝试使用堆叠查询来执行一个无害但可观察的命令, 中输入:
'); SELECT 1,2,3,4,5,6,7,8,9,10 INTO OUTFILE 'C:/wamp64/tmp/test.txt' --
(这里的是注释符,会忽略后面的SQL代码)
如果网站服务器是Windows系统且wamp64是默认安装路径,并且Web服务器(如Apache/Nginx)对该目录有写入权限,那么攻击者就可以在 C:/wamp64/tmp/ 目录下创建一个名为 test.txt 的文件,通过访问这个文件,可以确认堆叠查询漏洞是存在的。
第3步:执行恶意操作(提权示例)
一旦确认了堆叠查询可用,攻击者就可以执行更危险的命令,比如创建一个管理员账户。
假设织梦CMS的管理员表是 dede_admin,字段是 userid 和 pwd(密码是MD5加密的)。
攻击者在留言内容中输入以下payload:
'); INSERT INTO dede_admin (userid, pwd, type) VALUES ('attacker', 'e10adc3949ba59abbe56e057f20f883e', 'superadmin'); --
e10adc3949ba59abbe56e057f20f883e是密码123456的MD5值。
提交后,这条SQL语句就会被执行,向dede_admin表中插入一个新的管理员账户,攻击者就可以用 attacker/123456 的账号登录网站后台。
修复方案与防范措施
如果你是网站管理员,请立即采取以下措施:
立即修复(治标)
-
升级到最新安全版本:这是最根本、最有效的办法,织梦官方已经在新版本中修复了这些已知的SQL注入漏洞,请务必从织梦CMS官方网站下载并升级到最新的稳定版。
-
手动修复(如果无法立即升级):
-
文件:打开
/plus/guestbook.php文件。 -
定位:找到处理
msg,tid,username等POST或GET变量的代码段。 -
过滤:对这些变量使用
dede_addslashes()函数进行强制转义。// 修复前 $msg = $_POST['msg']; // 修复后 $msg = dede_addslashes($_POST['msg']); $tid = isset($_POST['tid']) ? intval($_POST['tid']) : 0; // 对ID类参数使用intval强制转为整数 $username = dede_addslashes($_POST['username']);
-
注意:手动修复可能不全面,容易遗漏,强烈建议升级。
-
长期防范(治本)
- 最小权限原则:确保网站运行的用户(如
www-data,IIS_IUSRS)对服务器只有必要的读写权限,禁止其拥有执行命令或修改系统文件的权限。 - 关闭不必要的功能:如果网站不需要留言板功能,直接在后台关闭它,这是最简单粗暴但有效的方法。
- 输入验证与过滤:
- 白名单验证:对于像留言ID这样的数字参数,只允许数字通过,使用
is_numeric()或intval()函数。 - 黑名单过滤:过滤掉SQL关键字(如
SELECT,INSERT,UPDATE,DELETE,UNION,SCRIPT等)和特殊字符(如 , , , , , , ),但黑名单容易被绕过,白名单更可靠。
- 白名单验证:对于像留言ID这样的数字参数,只允许数字通过,使用
- 使用预处理语句:这是预防SQL注入的黄金标准,虽然织梦CMS的老旧代码大量使用字符串拼接,但在开发新功能时,应尽量采用PDO或MySQLi的预处理语句(Prepared Statements)。
- 定期备份数据:即使网站被攻破,有备份也能让你快速恢复,将损失降到最低。
- 关注安全资讯:关注织梦官方的安全公告和第三方安全平台(如Seebug, CVE等)的信息,及时了解新漏洞并打上补丁。
五. 重要提醒
关于漏洞信息的披露和利用
- 负责任的披露:如果你发现了某个网站存在此漏洞,正确的做法是不要公开利用细节,而是通过网站官方的漏洞提交渠道或私下联系网站管理员,告知其存在风险并提供修复建议,公开详细的利用方法会“教坏”一些人,导致大量网站被攻击。
- 法律风险:未经授权对任何网站进行漏洞扫描、利用和攻击都是违法行为,本文档仅用于学习和了解安全原理,提高自身安全意识,严禁用于任何非法用途。
希望这份详细的解析能帮助你全面了解织梦CMS留言板SQL注入漏洞,安全无小事,防患于未然。
