php安全攻防利用文件上传漏洞与绕过技巧详解
前言
文件上传漏洞大多出现在可以进行文件上传的地方,如用户头像上传,文档上传处等。该漏洞是一个危害十分大的漏洞,通过文件上传,攻击者可以上传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.php
、xxx.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文件上传漏洞利用与绕过技巧的资料请关注猪先飞其它相关文章!
相关文章
- 这篇文章主要介绍了源码分析系列之json_encode()如何转化一个对象,对json_encode()感兴趣的同学,可以参考下...2021-04-22
- PHP去除html、css样式、js格式的方法很多,但发现,它们基本都有一个弊端:空格往往清除不了 经过不断的研究,最终找到了一个理想的去除html包括空格css样式、js 的PHP函数。...2013-08-02
- index.php怎么打开?初学者可能不知道如何打开index.php,不会的同学可以参考一下本篇教程 打开编辑:右键->打开方式->经文本方式打开打开运行:首先你要有个支持运行PH...2017-07-06
PHP中func_get_args(),func_get_arg(),func_num_args()的区别
复制代码 代码如下:<?php function jb51(){ print_r(func_get_args()); echo "<br>"; echo func_get_arg(1); echo "<br>"; echo func_num_args(); } jb51("www","j...2013-10-04- 这篇文章主要介绍了PHP编程 SSO详细介绍及简单实例的相关资料,这里介绍了三种模式跨子域单点登陆、完全跨单点域登陆、站群共享身份认证,需要的朋友可以参考下...2017-01-25
- 这篇文章主要介绍了PHP实现创建以太坊钱包转账等功能,对以太坊感兴趣的同学,可以参考下...2021-04-20
- 这篇文章主要为大家详细介绍了php微信公众账号开发之五个坑,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2016-10-02
- 这篇文章主要介绍了PHP如何通过date() 函数格式化显示时间,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-11-13
ThinkPHP使用心得分享-ThinkPHP + Ajax 实现2级联动下拉菜单
首先是数据库的设计。分类表叫cate.我做的是分类数据的二级联动,数据需要的字段有:id,name(中文名),pid(父id). 父id的设置: 若数据没有上一级,则父id为0,若有上级,则父id为上一级的id。数据库有内容后,就可以开始写代码,进...2014-05-31- 这篇文章主要介绍了golang与php实现计算两个经纬度之间距离的方法,结合实例形式对比分析了Go语言与php进行经纬度计算的相关数学运算技巧,需要的朋友可以参考下...2016-07-29
- 这篇文章主要介绍了PHP正则表达式过滤html标签属性的相关内容,实用性非常,感兴趣的朋友参考下吧...2016-05-06
- 这篇文章主要为大家详细介绍了php构造方法中析构方法在继承中的表现,感兴趣的小伙伴们可以参考一下...2016-04-15
- 这篇文章主要介绍了thinkPHP中多维数组的遍历方法,以简单实例形式分析了thinkPHP中foreach语句的使用技巧,需要的朋友可以参考下...2016-01-12
- 这篇文章主要介绍了PHP如何使用cURL实现Get和Post请求,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-07-11
- 今天我给大家分享的是在不刷新页面的前提下,使用PHP+jQuery+Ajax实现多图片上传的效果。用户只需要点击选择要上传的图片,然后图片自动上传到服务器上并展示在页面上。...2015-03-15
- 这篇文章主要介绍了PHP简单实现生成txt文件到指定目录的方法,简单对比分析了PHP中fwrite及file_put_contents等函数的使用方法,需要的朋友可以参考下...2016-04-28
- 这篇文章主要介绍了php判断邮箱地址是否存在的方法,php判断邮箱地址是否存在的方法有两种,感兴趣的朋友可以参考一下...2016-02-18
- 下面小编就为大家带来一篇thinkphp自定义权限管理之名称判断方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2017-04-03
- 在php中switch是选择,if else也有同理,但是它们肯定是有区别的,那么我们来看看它们两者的区别在哪里呢,下面先看switch case语句吧。 switch($id){ case 1: ...2016-11-25
- Sodium 出现的目的也是为了代替Mcrypt这个原来的加密扩展。在 PHP7.2 之后,Mcrypt已经被移除,在PHP7.1时就已经被标记为过时。不过,Sodium扩展的应用也并不是很多,大部分情况下我们都会使用OpenSSL来进行加密操作,所以,我们这篇文章只做了解即可。...2021-06-17