代码逻辑错误导致文件上传getshell
Verify version:Thinkphp5.1.41/Thinkphp5.0.24
Install:composer create-project topthink/think tp 5.xxx
测试版本:Thinkphp5.1.41
如果用户直接
像这样使用thinkphp的move方法:像官方文档一样添加上传控制器:https://www.kancloud.cn/manual/thinkphp5_1/354121
namespace appindexcontroller;
class Upload
{
public function index(){
// 获取表单上传文件 例如上传了001.jpg
$file = request()->file('image');
// 移动到框架网站目录/uploads/ 目录下
$info = $file->move( './uploads');
if($info){
// 成功上传后 获取上传信息
// 输出 jpg
echo $info->getExtension();
// 输出 20160820/42a79759f284b767dfcb2a0197904287.jpg
echo $info->getSaveName();
// 输出 42a79759f284b767dfcb2a0197904287.jpg
echo $info->getFilename();
}else{
// 上传失败获取错误信息
echo $file->getError();
}
}
}
会导致后缀为php的文件直接上传
因为在thinkphplibrarythinkFile.php
第272行是允许的
public function checkImg()
{
$extension = strtolower(pathinfo($this->getInfo('name'), PATHINFO_EXTENSION));
/* 对图像文件进行严格检测 */
if (in_array($extension, ['gif', 'jpg', 'jpeg', 'bmp', 'png', 'swf']) && !in_array($this->getImageType($this->filename), [1, 2, 3, 4, 6, 13])) {
$this->error = 'illegal image files';
return false;
}
return true;
}
我认为问题是 true 和 false 写反了。和 !in_array getImageType
逻辑应该是?
public function checkImg()
{
$extension = strtolower(pathinfo($this->getInfo('name'), PATHINFO_EXTENSION));
/* 对图像文件进行严格检测 */
if (in_array($extension, ['gif', 'jpg', 'jpeg', 'bmp', 'png', 'swf']) && in_array($this->getImageType($this->filename), [1, 2, 3, 4, 6, 13])) {
return true;
}
return false;
}
原文始发于微信公众号(Ots安全):Thinkphp 文件上传漏洞(CVE-2022-44289)
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论