YCCMS代码审计(新手教学方向)
字数 1391 2025-08-25 22:58:40
YCCMS代码审计教学文档
前言
YCCMS是一款存在多个常见漏洞的内容管理系统,本教学文档将详细分析其存在的安全漏洞,包括未授权更改管理员账号密码、任意文件删除和任意文件上传等漏洞,帮助新手理解这些漏洞的成因及修复方法。
基础知识
YCCMS采用MVC框架:
- Model:存放数据文件(model文件夹)
- View:存放视图文件(view文件夹)
- Controller:存放控制器文件(controller文件夹)
漏洞分析
1. 未授权更改管理员账号密码
漏洞描述
在未登录的情况下,通过构造特定URL可更改数据库中admin账号的用户名和密码。
漏洞利用
构造URL修改username、password和notpassword参数即可更改管理员账号。
代码分析
漏洞位于controller/AdminAction.class.php中的update函数:
public function update(){
if(isset($_POST['send'])){
// 验证输入是否为空
if(validate::isNullString($_POST['username'])) Tool::t_back('用户名不能为空','?a=admin&m=update');
if(validate::isNullString($_POST['password'])) Tool::t_back('密码不能为空!','?a=admin&m=update');
if(!(validate::checkStrEquals($_POST['password'], $_POST['notpassword']))) Tool::t_back('两次密码不一致!','?a=admin&m=update');
$this->_model->username=$_POST['username'];
$this->_model->password=sha1($_POST['password']);
$_edit=$this->_model->editAdmin();
// ...
}
}
editAdmin()函数位于model/AdminModel.class.php:
public function editAdmin(){
$_sql="UPDATE my_admin SET username='$this->username', password='$this->password' WHERE id=1 LIMIT 1";
return parent::update($_sql);
}
漏洞成因
- 缺少权限验证,未检查用户是否登录
- 直接拼接用户输入到SQL语句中
- 固定更新id=1的管理员账号
修复建议
- 添加权限验证
- 对输入进行严格过滤
- 使用参数化查询
2. 任意文件删除
漏洞描述
在未登录情况下,通过构造POST请求可删除服务器上的任意文件。
漏洞利用
POST请求示例:
POST /admin/?a=pic&m=delall HTTP/1.1
...
pid%5B0%5D=../1.txt&chkall=on&send=%E5%88%A0%E9%99%A4%E9%80%89%E4%B8%AD%E5%9B%BE%E7%89%87t
代码分析
漏洞位于controller/PicAction.class.php中的delall函数:
public function delall(){
if(isset($_POST['send'])){
if(validate::isNullString($_POST['pid'])) tool::layer_alert('没有选择任何图片!','?a=pic',7);
$_fileDir=ROOT_PATH.'/uploads/';
foreach($_POST['pid'] as $_value){
$_filePath=$_fileDir.$_value;
if(!unlink($_filePath)){
tool::layer_alert('图片删除失败,请设权限为777!','?a=pic',7);
}else{
header('Location:?a=pic');
}
}
}
}
漏洞成因
- 未对用户输入的路径进行过滤
- 直接拼接用户输入到文件路径中
- 缺少权限验证
修复建议
- 添加权限验证
- 对输入路径进行严格过滤
- 限制可删除的文件范围
3. 任意文件上传(两种方式)
第一种上传方式
漏洞描述
通过伪造Content-Type可上传任意文件。
代码分析
漏洞位于controller/CallAction.class.php中的upLoad函数:
public function upLoad() {
if (isset($_POST['send'])) {
$_logoupload = new LogoUpload('pic',$_POST['MAX_FILE_SIZE']);
$_path = $_logoupload->getPath();
// ...
}
}
LogoUpload类位于public/class/LogoUpload.class.php:
private function checkType() {
if (!in_array($this->type,$this->typeArr)) {
Tool::alertBack('警告:LOGO图片必须是PNG格式!');
}
}
private $typeArr = array('image/png','image/x-png');
漏洞成因
仅检查Content-Type,可被伪造
第二种上传方式
漏洞描述
同样通过伪造Content-Type上传任意文件。
代码分析
漏洞位于controller/CallAction.class.php中的xhUp函数:
public function xhUp() {
if (isset($_GET['type'])) {
$_fileupload = new FileUpload('filedata',10);
$_err=$_fileupload->checkError();
$_path = $_fileupload->getPath();
// ...
}
}
FileUpload类位于public/class/FileUpload.class.php:
private function checkType() {
if (!in_array($this->type,$this->typeArr)) {
Tool::alertBack('警告:不合法的上传类型!');
}
}
private $typeArr = array('image/jpeg','image/pjpeg','image/png','image/x-png','image/gif');
上传漏洞修复建议
- 使用文件内容检测而非Content-Type
- 使用白名单验证文件扩展名
- 设置上传目录不可执行
- 重命名上传文件
4. 其他漏洞
- 验证码重放漏洞:验证码可重复使用
- 反射型XSS漏洞:
http://xxx.xxx/admin/?a=html&art=<sCrIpT>alert(1)<%2FsCrIpT>&m=arts
总结与修复方案
- 权限控制:对所有敏感操作添加权限验证
- 输入过滤:
- SQL注入:使用参数化查询
- 文件操作:严格过滤路径中的特殊字符
- 文件上传:使用白名单验证文件类型和内容
- 安全配置:
- 设置上传目录不可执行
- 限制文件操作的范围
- 验证码安全:使用一次性验证码
参考资源
CMS下载地址: http://ahdx.down.chinaz.com/202003/yccms_v3.4.rar
通过本教学文档,新手可以学习到常见Web漏洞的代码审计方法和修复方案,提高代码安全意识。