PHP代码审计学习(9)——文件上传
文件上传漏洞
文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。常见场景是web服务器允许用户上传图片或者普通文本文件保存,而用户绕过上传机制上传恶意代码并执行从而控制服务器。显然这种漏洞是getshell最快最直接的方法之一,需要说明的是上传文件操作本身是没有问题的,问题在于文件上传到服务器后,服务器怎么处理和解释文件。
挖掘思路
这个比较好找,黑盒就在找页面到上传点就好了,白盒找相关的上传函数
前提
文件可上传
知道文件上传的路径
上传文件可以被访问
上传文件可以被执行
案例
还是直接上DVWA的吧(我太菜了)
LOW
访问页面,直接上传.php文件
查看源码
并未做任何过滤而且给出了上传文件保存的位置,直接上传一句话就可以。(插眼)
Medium
查看源码
发现增加了一个文件类型和大小判断,但是$_FILES[‘uploaded’][‘name’]这里没有任何处理,所以上传php文件,抓包修改它的文件类型,也就是Content-Type值为image/jpeg
High
用到了substr函数对字符串进行分割,同时用strpos函数匹配.号最后出现的位置。
关键代码
这里对上传文件的类型做了限制,结合刚才判断.号位置的语句,首先可以把.php.jpg方法PASS掉。
同上一关一样,抓包修改文件类型,因为都没有对MIME进行严格判断。
Impossible级别
加入了token防止CSRF,对文件内容进行了严格的过滤,而且对上传的文件进行md5重命名,没有给上传恶意文件的机会
文件上传姿势
1、客户端JS检测
这个比较常见也比较简单,一般都是在网页上写一段javascript脚本,校验上传文件的后缀名,有白名单形式也有黑名单形式。
function check() { var filename = document.getElementById("file"); var str = filename.value.split("."); var ext = str[str.length-1]; if(ext=='jpg'||ext=='png'||ext=='jpeg'||ext=='gif') { return true; } else { alert("仅允许上传png/jpeg/gif类型的文件!") return false; } return false; }
这段代码就是检测我们上传的文件的后缀名,只允许png/jpeg/gif,判断该类检测的方法:选择一个禁止上传类型的文件上传,当点击确定按钮之后,浏览器立即弹窗提示禁止上传,一般就可以断定为客户端JavaScript检测。
绕过这个很好绕,因为是在前端,所以设置代理,先将文件改为允许的类型上传绕过前端,然后再抓包将文件类型改回来
2、服务端MIME检测(Content-Type检测)
这个就是DVWA的Medium级别,校验请求头content-type字段绕过
<?php if($_FILES['userfile']['type']!="image/gif") {//检测Content-type echo"错误文件类型"; exit; } $uploaddir='uploads/'; //上传路径 $uploadfile=$uploaddir.basename($_FILES['userfile']['name']); if(move_uploaded_file($_FILES['userfile']['tmp_name'],$uploadfile)) { echo"文件上传成功.\n"; } else { echo"文件上传失败.\n"; } ?>
使用burp代理,修改Content-Type的参数
3、服务端文件扩展名检测
比较一下,白名单比黑名单更安全,一般有个专门的 blacklist 文件,里面会包含常见的危险脚本文件。如.php、.jsp、.py等,但经常会出现漏网之鱼
绕过方法:
文件名大小写绕过:
使用Asp、PhP之类的文件名绕过黑名单检测
名单列表绕过:
用黑名单里没有的名单进行攻击,比如很名单中没有的asa或者cer之类
特殊文件名绕过:
比如在发送的HTTP包中,将文件名改为”dama.asp.”或者”dama.asp_”(下划线为空格),这种命名方式在window系统里是不被允许的,所以需要在Burp Suite中抓包修改,上传之后,文件名会被window自动去掉后面的点或者空格,需要注意此种方法仅对window有效,Unix/Linux系统没有这个特性。
0x00截断绕过:
操作方法:上传dama.jpg,Burp抓包,将文件名改为dama.php%00.jpg,选中%00,进行url-decode。
上传.htaccess文件攻击:(适用于黑名单检测方式,黑名单中未限制.htaccess)
该文件仅在Apache平台上存在,IIS平台上不存在该文件,该文件默认开启,启用和关闭在httpd.conf文件中
解析调用/漏洞绕过
https://www.cnblogs.com/Lee-404/p/12919552.html
.user.ini文件绕过(适用于黑名单检测方式,黑名单中未限制.user.ini)
https://www.cnblogs.com/Lee-404/p/12838790.html CTF题
https://wooyun.js.org/drops/user.ini%E6%96%87%E4%BB%B6%E6%9E%84%E6%88%90%E7%9A%84PHP%E5%90%8E%E9%97%A8.html //.user.ini讲解
文件头绕过
在木马内容基础上再加了一些文件信息,有点像下面的结构
GIF89a
<?php phpinfo(); ?>
多个Content-Disposition
在IIS的环境下,上传文件时如果存在多个Content-Disposition的话,IIS会取第一个Content-Disposition中的值作为接收参数,而如果waf只是取最后一个的话便会被绕过,
文件上传防御
-
文件扩展名服务端白名单校验。
-
文件内容服务端校验。
-
上传文件重命名。
-
隐藏上传文件路径。
参考链接
https://www.cnblogs.com/wangtanzhi/p/12243206.html#autoid-0-5-0
https://www.secpulse.com/archives/95987.html