phpcms上传导致getshell详解及案例
warning:
这篇文章距离上次修改已过236天,其中的内容可能已经有所变动。
Getshell是指通过网站漏洞上传恶意脚本文件(如PHP脚本)到服务器,并获得与服务器相关的系统权限,这是一种严重的安全问题。PHPCMS是一个开源的内容管理框架,如果在使用PHPCMS进行文件上传功能时未对上传的文件进行严格的验证和限制,就可能导致Getshell漏洞。
原理简介:
- 文件上传功能存在安全漏洞。
- 攻击者上传恶意脚本文件,如
shell.php
。 - 脚本被服务器解析执行,攻击者获得服务器权限。
防御措施:
- 使用专业的文件上传模块,如
move_uploaded_file()
函数,并确保文件上传后立即移动到安全目录。 - 对上传的文件进行严格的验证,包括文件类型、大小、格式等。
- 设置不允许执行权限的目录权限,如禁止PHP执行。
- 定期进行安全审计和漏洞扫描,及时修复漏洞。
案例分析:
假设有一个PHPCMS网站,其上传文件处理代码存在漏洞,如下:
$target_path = '/uploads/';
$target_path = $target_path . basename( $_FILES['uploadedfile']['name']);
move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path);
攻击者可以通过修改HTTP请求中的$_FILES['uploadedfile']['name']
字段来上传恶意文件,例如:
POST /upload.php HTTP/1.1
Host: yoursite.com
Content-Disposition: form-data; name="uploadedfile"; filename="shell.php"
Content-Type: image/jpeg
<?php system($_REQUEST['cmd']); ?>
防御措施:
$target_path = '/uploads/';
$target_path = $target_path . basename($_FILES['uploadedfile']['name']);
$allowed_types = array('image/jpeg', 'image/png');
if(in_array($_FILES['uploadedfile']['type'], $allowed_types)) {
if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) {
// 文件上传成功处理
} else {
// 文件上传失败处理
}
} else {
// 文件类型不允许处理
}
在这个改进的代码中,我们只允许上传jpeg和png类型的图片文件,并且在文件移动到目标目录后立即进行处理,而不是等到后续的脚本执行。同时,上传目录权限应该被设置为不允许执行PHP脚本。
评论已关闭