![](https://img-blog.csdnimg.cn/img_convert/78fea39631651dc920835044d73b0c94.png)
影响范围:v1.7.5-v1.8.3
先抛出payload,再进行代码分析
前台getshell
首先,访问http://127.0.0.1/ourphp20180718/function/editor/php/upload_json.php?upload_file=1
![1553849472925.png 1553849472925.png](https://img-blog.csdnimg.cn/img_convert/71f967fb3b94d2e755708aadde83b8f7.png)
获取到:
<!--12345||7Hv9WqglWlPJZPgrFVUvpFnP4DmuTCn1-->
构造出:
口令码:12345
安全校验码:7Hv9WqglWlPJZPgrFVUvpFnP4DmuTCn1glWlPJ(跟上图比多了后面六个字符,具体看后面代码分析)
![1553850023077.png 1553850023077.png](https://img-blog.csdnimg.cn/img_convert/b8fc8afbed1b80e614e207ef89cd7087.png)
进行文件编辑,写入代码,修改后缀名,直接getshell
![1553850170685.png 1553850170685.png](https://img-blog.csdnimg.cn/img_convert/60a0f32dac7129fbaddb16457a396b75.png)
![1553850216097.png 1553850216097.png](https://img-blog.csdnimg.cn/img_convert/e99071694cf1fdbc2cbe44c0442b24cc.png)
![1553850246161.png 1553850246161.png](https://img-blog.csdnimg.cn/img_convert/433114dc82c756ab3a03dfe9e4b00d88.png)
代码分析
跟进 function\editor\php\upload_json.php
![1554101421627.png 1554101421627.png](https://img-blog.csdnimg.cn/img_convert/63a3fb140ddacc96e147581c3a55ed7b.png)
继续跟进uploadsafe()
函数,在function\editor\php\JSON.php
238行
function uploadsafe()
{
global $ourphp;
return '<!--'.$ourphp['validation'].'||'.substr($ourphp['safecode'], 0, 32).'-->';
}
由此可知,只要在前端给参数upload_file
传任意值,就会返回validation
口令码和safecode
安全码的前32位
继续跟,看安全码是如何生成的,在function\install\index.php
288行
$ourphp_safecode = getRandomString(32);
$safecode6 = substr($ourphp_safecode , 6 , 6);
$str_f = '$';
$str_tmp = "<?php
/*
* Ourphp - CMS建站系统
* Copyright (C) 2014 ourphp.net
* 开发者:哈尔滨伟成科技有限公司
* -------------------------------
* 网站配置文件 (2016-10-22)
* -------------------------------
*/
define('OURPHPNO', true);
define('WEB_ROOT',substr(dirname(__FILE__), 0, -7));
include '".$mysql_file."';
".$str_f."ourphp = array(
'webpath' => '/', // 网站路径
'validation' => '12345', // 口令码
'adminpath' => 'client/manage', // 管理员默认目录
'mysqlurl' => '".$ourphp_dburl."', // 数据库链接地址
'mysqlname' => '".$ourphp_dbname."', // 数据库登录账号
'mysqlpass' => '".$ourphp_dbpass."', // 数据库登录密码
'mysqldb' => '".$ourphp_mydb."', // 数据库表名
'filesize' => '5000000', // 附件上传最大值
'safecode' => '".$ourphp_safecode.$safecode6."', // 安全校验码
'mysqltype' => '".$mysql_type."',
);
".$str_f."db = new OurPHP_Mysql(
".$str_f."ourphp['mysqlurl'],
".$str_f."ourphp['mysqlname'],
".$str_f."ourphp['mysqlpass'],
".$str_f."ourphp['mysqldb']
);
?>";
![1554102571176.png 1554102571176.png](https://img-blog.csdnimg.cn/img_convert/3d515a4236a5f11abdbe40603b7d5366.png)
由此可知,安全码是通过随机取一个32位字符,然后取32位的第6位之后的6位字符,拼接到后面形成
由此就能得到后台访问的关键口令码和安全码
再跟后台的文件管理模块,在\client\manage\ourphp_filebox.php
45行
![1554102899673.png 1554102899673.png](https://img-blog.csdnimg.cn/img_convert/ddd5857035a8db19c6a77fa93fb80079.png)
由此可知,只要口令码、安全校验码正确就可以对文件进行操作(编辑、重命名)
而且,835行的后缀名过滤,可用大小写绕过了
![1554103007652.png 1554103007652.png](https://img-blog.csdnimg.cn/img_convert/f45c1fa97efc95a3e837f5a091a399cc.png)
至此,payload就可以构造好啦