文件上传漏洞(二)

文件上传漏洞

绕过,攻击方法

文件上传目录可控%00截断

upload-labs第1到10关中使用的是黑名单检测,之后的关卡就是白名单检测,白名单检测比黑名单监测较为安全。

如果使用白名单检测,但是目录参数可控,并且满足gpc关闭,php版本小于5.3.4,我们就可以尝试%00截断。

环境upload-labs关卡:11

代码分析:

img

可以看到使用白名单检测,但是有一个$_GET['save_path']参数允许用户传递的目录参数,我们可以上传phpinfo.php文件并抓包,修改文件名为phponfo.jpg,修改save_path参数为:../upload/phpinfo.php%00.jpg.

img

可以看到上传成功,去文件夹看一下:

img

注:这里save_path参数不加.jpg也是可以的,因为代码并没有对目录参数进行白名单对比,主要是%00截断:

img

原理分析:

将文件名修改为phpinfo.jpg用来绕过白名单,save_path将参数修改为../upload/phpinfo.php%00.jpg,主要是使用%00将后面的目录截断(服务器未开启gpc%不被转移的情况下),源代码:

1
2
3
4
5
6
7
8
9
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 = '上传出错!';
}

$img_path = $_GET[‘save_path’].”/“.rand(10, 99).date(“YmdHis”).”.”.$file_ext;,正常情况下文件路径会被拼接为../upload/新文件名.文件名后缀,然后move_uploaded_file()函数移动上传的文件到路径,我们传递参数后文件路径就会变为../upload/phpinfo.php%00/新文件名.php,%00将后面的截断掉了,所以结果其实是../upload/phpinfo.php,之后move_uploaded_file()函数移动我们上传的文件到该目录下成功完成上传漏洞。

POST下目录可控%00截断

如果路径参数使用的是POST传输,那么我们需要对%00进行解码才会有效:

关卡:12:

代码分析:

img

​ 和上一关卡的代码是一样的,只不过改为了POST传输目录参数,我们也是和上一关一样,上传phpinfo.php文件然后抓包,修改文件名为phpinfo.jpg绕过白名单,修改修改save_path参数为:../upload/phpinfo.php%00.jpg,但是要对%00进行一次URL解码。
img

查看文件夹:

img


文件上传绕过文件头检测

不同文件,头文件不尽相同,有的时候回去文件头进行检测,如果不是图片格式,那么就会禁止上传。

常见文件头
JPEG (jpg),文件头:FFD8FF
PNG (png),文件头:89504E47
GIF (gif),文件头:47494638
TIFF (tif),文件头:49492A00
Windows Bitmap (bmp),文件头:424D

我们可以制作图片马,将PHP代码附加在图片上,在通过文件包含漏洞来进行读取。

copy 1.gif/b+phpinfo.php/a phpinfo.gif # Windows下使用copy制作图片马
cat phpinfo.php >> 1.jpg # Linux将webshell追加到图片中

环境:upload-labs关卡:13

代码分析:

img

由代码可见定义了getReailFileType()函数用来读取文件前两个字节并判断是否为图片文件。

我们可以先制作图片马:

img

我们用记事本打开这个图片:

img

拉到最后可以发现已经追加上去了,我们吧这个图片上传:

image-20220831171016586

上传成功,但是执行里面的PHP代码我们需要借助文件包含漏洞

1
http://127.0.0.1/include.php?file=upload/1120220831170953.jpg

img


文件上传绕过二次渲染

二次渲染会减少图片的体积,提高服务器性能,所以很多服务器会对上传的图片进行二次渲染,这是如果图片中包含webshell,很大可能会被渲染掉.

我们可以上传一张图片,然后再下载这个渲染后的图片,使用HexEd、HxDHexEdito等工具打开,查看重复的地方之后用PHP代码进行覆盖就可以绕过。

尽量使用GIF图片,gif 图片在二次渲染后,与原图片差别不会太大。
环境upload-labs关卡:16

代码分析:

img

由代码可知其获取了图片的基础信息后根据图片的格式进行二次渲染,我们先找一张GIF图片进行上传:

img

之后在将上传后的图片与上传前的图片放到HxDHexEdito工具中作对比,然后把PHP代码写入到两张图片相同的地方:

img

之后我们再上传这张图片,并访问其链接:

img

成功,如果不成功一定不要硬盯着一张图片试,去另找一张图片!!!


文件上传条件竞争漏洞

条件竞争:多个线程同时访问同一个代码、变量、文件等没有进行锁操作或者同步操作。


文件上传绕过文件名可控

文件上传时,保存的文件名可被用户修改,类似于路径可控,我们也可以使用%00截断或中间件配合漏洞使用:


文件上传数组绕过

有时服务器会允许用户数组上传或命名,但是逻辑不严谨,就会容易出现漏洞,这种漏洞白盒审计发现居多,黑盒下难以发现。


文件上传中间件漏洞

1,iis6.0的 ‘1.PHP;1.jpg’
2,apache某些版本的 ‘1.php.a’
3,nginx0.83 ‘1.jpg%00php’
4,phpcgi 漏洞(nginx iis7 或者以上) 上传图片后 1.jpg。访问 1.jpg/1.php 也会解析成php。
5,Apache HTTPD 换行解析漏洞(CVE-2017-15715)
6,apache 通过 mod_php 来运行脚本,其 2.4.0-2.4.29 中存在 apache 换行解析漏洞,在解析 php 时 xxx.php\x0A 将被按照 PHP 后缀进行解析,导致绕过一些服务器的安全策略
等等。。。


文件名后缀

.php
.php5
.php4
.php3
.php2
.html
.htm
.phtml
.pht
.pHp
.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

参考链接:https://blog.csdn.net/m0_53820621/article/details/126644983