欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

php安全攻防利用文件上传漏洞与绕过技巧详解

程序员文章站 2022-03-04 15:45:57
目录场景二:后端php代码检查content-type字段::$data绕过(windows)前言文件上传漏洞大多出现在可以进行文件上传的地方,如用户头像上传,文档上传处等。该漏洞是一个危害十分大的漏...

前言

文件上传漏洞大多出现在可以进行文件上传的地方,如用户头像上传,文档上传处等。该漏洞是一个危害十分大的漏洞,通过文件上传,攻击者可以上传webshell并进行getshell操作,从而获得系统shell,可执行任意命令。也为后续大型木马的上传,特权提升提供了一个良好的基础。

文件上传漏洞的一些场景

接下来针对文件上传漏洞的一些waf过滤的场景进行说明并进行绕过和利用。

场景一:前端js代码白名单判断.jpg|.png|.gif后缀

在该场景下,防御的姿势是通过js代码对上传的文件后缀进行判断,如果不是.jpg|.png|.gif这三个后缀的文件则不允许上传至后台

绕过方式:

将带有一句话木马的文件后缀名改为xxx.jpg|png|gif,在上传处通过burpsuite进行包拦截并改包,将文件后缀名改为php|jsp等脚本的后缀。上传成功后访问该文件的路径即可getshell。

场景二:后端php代码检查content-type字段

在该场景下,防御的姿势是通过js代码对上传文件请求的content-type字段进行检查,如果不是image/jpeg则不允许上传至后台

绕过方式:

将上传一句话木马文件的request包进行拦截,添加或修改content-type字段为image/jpeg

场景三:代码黑名单判断.asp|.aspx|.php|.jsp后缀

在该场景下,防御姿势是通过后台代码对上传的文件后缀进行判断,如果是.asp|.aspx|.php|.jsp这四个后缀的文件则不允许上传

绕过方式:

当apache的配置文件httpd.conf中存在如下配置时:

addtype application/x-httpd-php .php .phtml .phps .php5 .pht

说明可以通过上传.phtml|.phps|.php5|.pht这些后缀名的文件,且他们都会被解析称后缀为.php的文件。所以可以尝试使用上传xxx.php5这类的文件进行绕过

关于addtype命令的作用:

addtype 指令

作用:在给定的文件扩展名与特定的内容类型之间建立映射
语法:addtype mime-type extension [extension] …
addtype指令在给定的文件扩展名与特定的内容类型之间建立映射关系。mime-type指明了包含extension扩展名的文件的媒体类型。
addtype 是与类型表相关的,描述的是扩展名与文件类型之间的关系。addtype 是与类型表相关的,描述的是扩展名与文件类型之间的关系。

场景四:代码扩大黑名单判断

在该场景下,防御姿势是通过后台代码对上传的文件后缀进行判断,如果是.php|.php5|.php4|.php3|.php2|.php1|.html|.htm|.phtml|.pht|.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"这些后缀的文件则不允许上传

绕过方式——htaccsess:

使用.htaccsess文件进行绕过

.htaccsess文件的作用:

.htaccess文件是apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能iis平台上不存在该文件,该文件默认开启,启用和关闭在httpd.conf文件中配置。

.htaccsess文件的使用条件:

mod_rewrite模块开启。
allowoverride all

构造.htaccess文件,内容如下:

addtype application/x-httpd-php .jpg

这里代码的意思可以让 .jpg后缀名文件格式的文件名以php格式解析,因此达到了可执行的效果。所以我们可以把要上传的php文件的后缀名改为.jpg格式从而绕过

绕过方式——大小写绕过:

如果在黑名单中没有针对大小写进行限制,则可以进行大小写绕过,如将.php后缀改为.php|.php后缀

场景五:一些复合判断

在该场景下,防御姿势除了基本的黑/白名单外,还包括了对一些特定字符的限制,具体情况可以进行fuzz或者有条件可以进行代码审计

空格、点绕过(windows)

当接收文件时,后台代码的限制条件中没有去除文件名首尾的空格(或是没有对.进行拆分)时,可以利用windows系统的命名规则进行绕过:如,将文件后缀改为xxx.phpxxx.php.xxx.php .

在windows下xx.jpg[空格] 或xx.jpg.这两类文件是不允许存在的,若这样命名,windows会默认去除空格或点

还有些情况具体就需要看代码逻辑,比如如果代码只删除一次点且只去除一次首尾空格,在windows环境下就可以用xxx.php. .进行绕过

::$data绕过(windows)

::$data绕过同样利用了windows的特性

ntfs文件系统包括对备用数据流的支持。这不是众所周知的功能,主要包括提供与macintosh文件系统中的文件的兼容性。备用数据流允许文件包含多个数据流。每个文件至少有一个数据流。在windows中,此默认数据流称为:$ data。

即在php+windows的环境下,如果文件名+::$data会把::$data之后的数据当成文件流处理,不会检测后缀名,且保持::$data之前的文件名。

双写绕过

当防御的代码中存在将某些特定后缀进行空字符替换时(如利用str_ireplace函数将.php|.jsp等后缀替换为空字符)

这时候可以将后缀双写,即将php改成pphphp

%00截断

00截断绕过方式需要满足以下条件

php版本小于5.3.4
php.ini的magic_quotes_gpc为off状态
使用move_uploaded_file函数且参数受用户控制

此时move_uploaded_file函数遇到0x00会截断

可以将上传文件后缀改为xx.php%00进行绕过

%0a绕过

%0a绕过方式需要满足以下条件

apache httpd 2.4.0至2.4.29
filematch正则匹配.php|.php5等后缀

该版本apache会通过$匹配后缀,而$匹配时会正则匹配某字符串结尾或以换行符结尾的一个字符串,即php[换行符]会被匹配成php

可以将上传文件后缀改为xx.php%0a进行绕过

图片马绕过

window的cmd命令制作图片马

copy 1.jpg /b + shell.php /a shell.jpg

或是利用其他图片马生成器生成

二次渲染绕过

判断图片格式后用image函数进行二次渲染

绕过方式:

抓包找到二次渲染中未被改动的地方,将一句话马插入该地方,.jpg|.png|.gif三种文件格式不同,所以构造马的方式也不同

注:gif文件最简单,直接用ue等16进制编辑器就可以改,但是jpg和png需要特殊的构造脚本

先将一张正常的jpg图片上传,上传后将服务器存储的二次渲染的图片保存下来。
将保存下来经过服务器二次渲染的那张jpg图片,用此脚本进行处理生成payload.jpg
然后再上传payload.jpg

条件竞争

当上传文件逻辑为:先move_uploaded_file函数将上传文件临时保存,再进行判断,如果不在白名单里则unlink删除,在的话就rename重命名。此时会存在条件竞争

绕过方法:
用burp开启两个intruder模块,一个用于重复上传,另一个用于重复访问。会有一定记录返回执行结果

/.绕过

move_uploaded_file函数参数可控时,可以尝试/.绕过,因为该函数会忽略掉文件末尾的/.,所以可以构造save_path=1.php/.,这样file_ext值就为空,就能绕过黑名单,而move_uploaded_file函数忽略文件末尾的/.可以实现保存文件为.php

以上就是php安全攻防利用文件上传漏洞与绕过技巧详解的详细内容,更多关于php文件上传漏洞利用与绕过技巧的资料请关注其它相关文章!

相关标签: php 安全漏洞