1.首先定位到漏洞文件control/attach.php。
2.这里是上传的逻辑代码,本身的上传没有什么问题。但是在上传之后进行了一次数据库操作,并且直接带入了$clientFile["name"]。
而$_FILES本身是不受addslashes的影响的。所以不受全局过滤的影响。那么我们构造一个上传的表单(_FILES是真的不受影响吗?为什么不亲自测试测试)
3.上传的时候使用burp抓包,修改其中filename字段的值为conf',user(),1,1,0,1) -- a
4.然后看一下数据库中的表。
5.再来看一下mysql日志呢
//文件上传状态,当成功时返回SUCCESS,其余值将直接返回对应字符窜
$state = "SUCCESS";
$clientFile = $_FILES["upfile"];
if (!isset($clientFile)) {
echo "{'state':'文件大小超出服务器配置!','url':'null','fileType':'null'}"; //请修改php.ini中的upload_max_filesize和post_max_size
exit;
}
//格式验证
$current_type = strtolower(strrchr($clientFile["name"], '.'));
if (!in_array($current_type, $config['fileType'])) {
$state = "不支持的文件类型!";
}
//大小验证
$file_size = 1024 * 1024 * $config['fileSize'];
if ($clientFile["size"] > $file_size) {
$state = "文件大小超出限制!";
}
//保存文件
if ($state == "SUCCESS") {
$targetfile = $config['uploadPath'] . gmdate('ym', $this->time) . '/' . random(8) . strrchr($clientFile["name"], '.');
$result = $_ENV['attach']->movetmpfile($clientFile, $targetfile);
if (!$result) {
$state = "文件保存失败!";
} else {
$_ENV['attach']->add($clientFile["name"], $current_type, $clientFile["size"], $targetfile, 0);//这里是漏洞点
}
}
//向浏览器返回数据json数据
echo '{"state":"' . $state . '","url":"' . $targetfile . '","fileType":"' . $current_type . '","original":"' . $clientFile["name"] . '"}';
}</code>
2.这里是上传的逻辑代码,本身的上传没有什么问题。但是在上传之后进行了一次数据库操作,并且直接带入了$clientFile["name"]。
而$_FILES本身是不受addslashes的影响的。所以不受全局过滤的影响。那么我们构造一个上传的表单
3.上传的时候使用burp抓包,修改其中filename字段的值为conf',user(),1,1,0,1) -- a