通过文件上传进行Getshell的不同骚姿势(万字解说)"

admin 2026-10-17 09:16:47 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

cover_image文件扩展名检测

黑名单检测:

黑名单的安全性比白名单低很多,服务器端,一般会有个专门的blacklist文件,里面会包含常见的危险脚本文件类型,例如:html | htm | php | php2 | hph3 | php4 | php5 | asp | aspx | ascx | jsp | cfm | cfcbat | exe | com | dll | vbs | js | reg | cgi | htaccess | asis | sh等等。黑名单则可以通过对关键函数的各类混淆变化来绕过。

黑名单扩展名过滤,限制不够全面:IIS默认支持解析.asp | .cdx | .asa | .cer等

<?php
function getExt($filename){
   //sunstr - 返回字符串的子串
   //strripos — 计算指定字符串在目标字符串中最后一次出现的位置(不区分大小写)
   return substr($filename,strripos($filename,'.')+1);
   }
   if($_FILES[\"file\"][\"error\"] > 0)
   {
   echo \"Error: \" . $_FILES[\"file\"][\"error\"] . \"\";
   }

   else{

   $black_file = explode(\"|\",\"php|jsp|asp\");//允许上传的文件类型组

   $new_upload_file_ext = strtolower(getExt($_FILES[\"file\"][\"name\"])); //取得被.隔开的最后字符串

   if(in_array($new_upload_file_ext,$black_file))

   {

       echo \"文件不合法\";
       die();

       }

   else{

       $filename = time().\".\".$new_upload_file_ext;

       if(move_uploaded_file($_FILES['file']['tmp_name'],\"upload/\".$filename))

       {

           echo \"Upload Success\";

           }

     }
}
?>

白名单检测:

仅允许指定的文件类型上传,比如仅允许上传jpg | gif | doc | pdf等类型的文件,其他文件全部禁止。
针对白名单检测,可以在满足要求的文件后插入木马脚本语句来绕过。

文件内容检测

文件幻数检测:

  • JPG : FF D8 FF E0 00 10 4A 46 49 46
  • GIF : 47 49 46 38 39 61 (GIF89a)
  • PNG: 89 50 4E 47

绕过方法
在文件幻数后面加上自己的一句话木马就行了。

文件相关信息检测:

一般就是检查图片文件的大小,图片文件的尺寸之类的信息。

绕过方法:
伪造好文件幻数,在后面添加一句话木马之后,再添加一些其他的内容,增大文件的大小。

文件加载检测:

这个是最变态的检测,一般是调用API或者函数去进行文件加载测试,常见的是图像渲染测试,再变态一点的甚至是进行二次渲染。
绕过方法:

  • 针对渲染加载测试:代码注入绕过
  • 针对二次渲染测试:攻击文件加载器

通常,对于文件内容检查的绕过,就是直接用一个结构完整的文件进行恶意代码注入即可。

简化的演示代码:

<?php
var_dump(getimagesize(\"shell.php\"));
?>

加上GIF头内容

二次渲染

imagecreatefromjpeg二次渲染它相当于是把原本属于图像数据的部分抓了出来,再用自己的API 或函数进行重新渲染在这个过程中非图像数据的部分直接就隔离开了

if (isset($_POST['submit'])){
    // 获得上传文件的基本信息,文件名,类型,大小,临时文件路径
    $filename = $_FILES['upload_file']['name'];
    $filetype = $_FILES['upload_file']['type'];
    $tmpname = $_FILES['upload_file']['tmp_name'];

    $target_path=UPLOAD_PATH.basename($filename);

    // 获得上传文件的扩展名
    $fileext= substr(strrchr($filename,\".\"),1);

    //判断文件后缀与类型,合法才进行上传操作
    if(($fileext == \"jpg\") && ($filetype==\"image/jpeg\")){
        if(move_uploaded_file($tmpname,$target_path))
        {
            //使用上传的图片生成新的图片
            $im = imagecreatefromjpeg($target_path);

            if($im == false){
                $msg = \"该文件不是jpg格式的图片!\";
                @unlink($target_path);
            }else{
                //给新图片指定文件名
                srand(time());
                $newfilename = strval(rand()).\".jpg\";
                $newimagepath = UPLOAD_PATH.$newfilename;
                imagejpeg($im,$newimagepath);
                //显示二次渲染后的图片(使用用户上传图片生成的新图片)
                $img_path = UPLOAD_PATH.$newfilename;
                @unlink($target_path);
                $is_upload = true;
            }
        } else {
            $msg = \"上传出错!\";
        }

    }else if(($fileext == \"png\") && ($filetype==\"image/png\")){
        if(move_uploaded_file($tmpname,$target_path))
        {
            //使用上传的图片生成新的图片
            $im = imagecreatefrompng($target_path);

            if($im == false){
                $msg = \"该文件不是png格式的图片!\";
                @unlink($target_path);
            }else{
                 //给新图片指定文件名
                srand(time());
                $newfilename = strval(rand()).\".png\";
                $newimagepath = UPLOAD_PATH.$newfilename;
                imagepng($im,$newimagepath);
                //显示二次渲染后的图片(使用用户上传图片生成的新图片)
                $img_path = UPLOAD_PATH.$newfilename;
                @unlink($target_path);
                $is_upload = true;
            }
        } else {
            $msg = \"上传出错!\";
        }

    }else if(($fileext == \"gif\") && ($filetype==\"image/gif\")){
        if(move_uploaded_file($tmpname,$target_path))
        {
            //使用上传的图片生成新的图片
            $im = imagecreatefromgif($target_path);
            if($im == false){
                $msg = \"该文件不是gif格式的图片!\";
                @unlink($target_path);
            }else{
                //给新图片指定文件名
                srand(time());
                $newfilename = strval(rand()).\".gif\";
                $newimagepath = UPLOAD_PATH.$newfilename;
                imagegif($im,$newimagepath);
                //显示二次渲染后的图片(使用用户上传图片生成的新图片)
                $img_path = UPLOAD_PATH.$newfilename;
                @unlink($target_path);
                $is_upload = true;
            }
        } else {
            $msg = \"上传出错!\";
        }
    }else{
        $msg = \"只允许上传后缀为.jpg|.png|.gif的图片文件!\";
    }
}

本关综合判断了后缀名、content-type,以及利用imagecreatefromgif判断是否为gif图片,最后再做了一次二次渲染。

绕过方法
图片木马

Name = getname(http requests)//假如这一步获取到的文件名是dama.asp .jpg
Type = gettype(name)//而在该函数中,是从后往前扫描文件扩展名,所以判断为jpg文件
If(type == jpg)
SaveFileToPath(UploadPath.name , name)//但在这里却是以0x00作为文件名截断,最后以dama.asp存入路径里

1、截断条件: PHP版本小于5.3.4,php的magic_quotes_gpc为OFF状态时,可用%00来代替\x00实现文件上传的绕过。Ctrl+shift+u
2、若文件名可控制,可以尝试构造类似于1.asp\\x00.JPG的方式来进行绕过白名单检测机制;
3、若文件路径可控制,可以尝试构造文件路径为1.asp\\x00,文件名为符合白名单的扩展名的方式来进行绕过白名单检测机制

利用格式:

test.php(0x00).jpg
test.php%00.jpg

操作方法:
上传dama.jpg,Burp抓包,将文件名改为dama.php%00.jpg,选中%00,进行url-decode。

具体操作:
上传一句话木马
7.上传.htaccess文件绕过:

(适用于黑名单检测方式,黑名单中未限制.htaccess)

.htaccess叫分布式配置文件,它提供了针对目录改变配置的方法——在一个特定的文档目录中放置一个包含一个或多个指令的文件,以作用于此目录及其所有子目录;

该文件仅在Apache平台上存在,IIS平台上不存在该文件,该文件默认开启,启用和关闭在httpd.conf文件中配置。该文件的写法如下:
第一种:

<FilesMatch \"a.jpg\">
  SetHandler application/x-httpd-php
</FilesMatch>

保存为.htaccess文件。该文件的意思是,只要遇到文件名中包含有”a.jpg”字符串的任意文件,统一执行。如果这个\"a.jpg\"的内容是一句话木马,即可利用中国菜刀进行连接

第二种:

AddType application/x-httpd-php    .jpg

.htaccess文件可以实现很多特殊功能,其中一个功能可以修改扩展名的解析方式,如:在.htaccess文件中添加以下内容,可以将.jpg文件解析为PHPAddTypeapplication/x-httpd-php .jpg;

把.htaccess 上传后,且上传成功后,再上传内容为一句话的jpg文件

具体操作:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .(php.|php3.) /index.php
RewriteRule .(pHp.|pHp3.) /index.php
RewriteRule .(phP.|phP3.) /index.php
RewriteRule .(Php.|Php3.) /index.php
RewriteRule .(PHp.|PHp3.) /index.php
RewriteRule .(PhP.|PhP3.) /index.php
RewriteRule .(pHP.|pHP3.) /index.php
RewriteRule .(PHP.|PHP3.) /index.php
</IfModule>

具体操作:
上传一句话木马,使用burp抓包转到repeater模块

www.xxxx.com/UploadFiles/image/1.jpg/1.php
www.xxxx.com/UploadFiles/image/1.jpg %00.php
www.xxxx.com/UploadFiles/image/1.jpg/ %20.php