简述
自己学习,文件上传&解析漏洞的整理,大佬绕过
免责声明
不可对未授权的网站进行测试,仅可在靶场上练习,否则后果自负
文件上传概述
文件上传是个很强势的一个漏洞,你想想,如果可以上传文件,没有对文件进行过滤,那么我们是不是就可以上传木马病毒,那么木马可以干嘛,木马可以获取服务器的绝对权限,webshell,所以若网站有文件上传的功能,对用户所上传的文件做限制必须要谨慎谨慎再谨慎的
文件上传发生原理
有个鬼原理啊,无非就是在正常的上传功能的地方,有些人恶意上传了带有恶意代码的文件,而服务器又出现漏洞,可以解析包含恶意代码的文件,恶意代码中有获取webshell的权限,从而导致服务器的shell被恶意的人所控制
PHP文件上传常用的函数
一、获取前端所上传的文件信息
-
- $_FILES[“file”][“name”] – 上传文件的名称
- $_FILES[“file”][“type”] – 上传文件的类型
- $_FILES[“file”][“size”] – 上传文件的大小,以字节计
- $_FILES[“file”][“tmp_name”] – 存储在服务器的文件的临时副本的名称
- $_FILES[“file”][“error”] – 由文件上传导致的错误代码
二、文件处理函数
-
-
fopen() 函数用于在 PHP 中打开文件
-
fclose() 函数用于关闭打开的文件
-
feof() 函数检测是否已到达文件末尾(EOF)
-
fgets() 函数用于从文件中逐行读取文件。
-
fgetc() 函数用于从文件中逐字符地读取文件。
- is_uploaded_file() 函数判断指定的文件是否是通过 HTTP POST 上传的。
-
move_uploaded_file() 函数将上传的文件移动到新位置。
-
file_exists() 函数检查文件或目录是否存
-
end() 函数将内部指针指向数组中的最后一个元素,并输出。
-
explode() 函数使用一个字符串分割另一个字符串,并返回由字符串组成的数组。
-
in_array() 函数搜索数组中是否存在指定的值。
-
文件上传防御方式与绕过
一、js前端验证:
- 判断方式:在浏览加载文件,但还未点击上传按钮时便弹出对话框,(进一步确定可以通过配置浏览器HTTP代理(没有流量经过代理就可以证明是客户端JavaScript检测))内容如:只允许传.jpg/.jpeg/.png后缀名的文件,而此时并没有发送数据包。
- 验证代码:
function CheckFileType() { var objButton=document.getElementById("Button1");//上传按钮 var objFileUpload=document.getElementById("FileUpload1"); var objMSG=document.getElementById("msg");//显示提示信息用DIV var FileName=new String(objFileUpload.value);//文件名 var extension=new String(FileName.substring(FileName.lastIndexOf(".")+1,FileName.length));//文件扩展名 if(extension=="jpg"||extension=="JPG")//可以另行添加扩展名 { objButton.disabled=false;//启用上传按钮 objMSG.innerHTML="文件检测通过"; } else { objButton.disabled=true;//禁用上传按钮 objMSG.innerHTML="请选择正确的文件上传"; } }
- 绕过方式:将需要上传的恶意代码文件类型改为允许上传的类型,例如将shell.asp改为shell.jpg上传,配置Burp Suite代理进行抓包,然后再将文件名shell.jpg改为shell.asp 上传页面,审查元素,修改JavaScript检测函数(具体方法:可以使用firbug之类的插件把它禁掉)
二、服务端MIME类型检测:
- MIME的作用:使客户端软件,区分不同种类的数据,例如web浏览器就是通过MIME类型来判断文件是GIF图片,还是可打印的PostScript文件。web服务器使用MIME来说明发送数据的种类, web客户端使用MIME来说明希望接收到的数据种类。
- MIME验证代码:
-
绕过方法:配置Burp Suite代理进行抓包,将Content-Type修改为image/gif,或者其他允许的类型然后在对应目录生成shell.jpg
三、服务端文件扩展名检测
- 黑名单检测:黑名单的安全性比白名单低很多,服务器端,一般会有个专门的blacklist文件,里面会包含常见的危险脚本文件类型,例如:html | htm | php | php2 | hph3 | php4 | php5 | asp | aspx | ascx | jsp | cfm | cfc | bat | exe | com | dll | vbs | js | reg | cgi | htaccess | asis | sh |phtm | shtm |inc等等。黑名单扩展名过滤,限制不够全面:IIS默认支持解析.asp | .cdx | .asa | .cer等
- 验证代码:
0) { echo "Error: " . $_FILES["file"]["error"] . "
"; } else{ $black_file = explode("|","php|jsp|asp");//允许上传的文件类型组 $new_upload_file_ext = strtolower(getExt($_FILES["file"]["name"])); //取得被.隔开的最后字符串 if(in_array($new_upload_file_ext,$black_file)) { echo "文件不合法"; die(); } else{ $filename = time().".".$new_upload_file_ext; if(move_uploaded_file($_FILES['file']['tmp_name'],"upload/".$filename)) { echo "Upload Success"; } } } ?> - 绕过方法:不被允许的文件格式.php,但是可以上传文件名为shell.php_(下划线是空格),IIS支持,linux不支持,详细见下面的特殊文件名绕过描述;
- 白名单检测:仅允许指定的文件类型上传,比如仅与需上传jpg | gif | doc等类型的文件,其他全部禁止
- 绕过方法:
-
文件名大小写绕过:用像 AsP,pHp 之类的文件名绕过黑名单检测
-
名单列表绕过:用黑名单里没有的名单进行攻击,比如黑名单里没有 asa 或 cer 之类
-
特殊文件名绕过:比如发送的 http 包里把文件名改成 test.asp. 或 test.asp_(下划线为空格),这种命名方式 在 windows 系统里是不被允许的,所以需要在 burp 之类里进行修改,然后绕过验证后,会 被 windows 系统自动去掉后面的点和空格,但要注意 Unix/Linux 系统没有这个特性
-
0x00截断:文件名后缀就一个%00字节,可以截断某些函数对文件名的判断。在许多语言函数中处理函数中,处理字符串中在扩展名检测这大部分都是 asp 的程序有这种漏洞,给个简单的伪代码
-
二次渲染
-
解析漏洞绕过
-
四、服务端文件内容检测
- 文件特征检测
- 绕过方法
- 文件幻术:也就是通过各个图片的特征头加在最前面,用来欺骗防御,然后后面加上webshell代码
JPG : FF D8 FF E0 00 10 4A 46 49 46
GIF : 47 49 46 38 39 61 (GIF89a)
PNG: 89 50 4E 47
- 文件相关信息检测
- 绕过方法
- 伪造好文件头,然后在后面加一些正常的数据
- 当文件严格限制了信息和后缀的时候
-
绕过方法
-
二次渲染:通过对bp抓包查看上传的图片有哪个地方没有被渲染到,则在哪个地方添加代码
-
图片木马制作(图片木马需要配合解析漏洞来执行相应的代码)
- Copy命令制作
- copy 1.jpg/b+1.asp/a 2.jpg(a表示ascii文件/b表示二进制形式)
- Ps插入
- 用PS(photoshop)打开图片
- 文件→文件简介插入你需要的木马代码3.文件→保存(保存:覆盖源文件 你也可以另存为你想要的其它格式)
-
图片属性版权填写webshell:需要找图片,有的图片无法填写
- Copy命令制作
-
五、防御
- 将文件上传目录的所有用户执行权限全部取消
-
判断文件类型
在判断文件类型时,可以结合使用MIME Type、后缀检查等方式。在文件类型检查中,强烈推荐白名单方式,黑名单的方式已经 无数次被证明是不可靠的。此外, 对于图片的处理,可以使用压缩函数或者resize函数,在处理图片的同时破坏图片中可能包含的 HTML代码,或者在使用白名单的时候,使用分割字符串(上传来的文件名),使用”.”来分割,仅允许分割后,字符串只有两个,一 个是文件名,一个是文件扩展名。
-
使用随机数改写文件名和文件路径
文件上传如果要执行代码,则需要用户能够访问到这个文件。在某些环境中,用户能上传,但不能访问。如果应用了随机数改写了文件名和路径,将极大地增加攻击的成本。再来就是像shell.php.rar和crossdomain.xml这种文件,都将因为重命名而无法攻击。
-
单独设置文件服务器的域名
把网站服务器和文件服务器分开,但是要保证,文件服务器的安全级别很高,且保证上传文件是相对高的可靠,直接把上传的图片等文件存储在文件服务器,并在文件服务器把所有目录设置为可读可写不可执行
-
二次渲染
原理:将上传的图片重新保存为一个新的图片,将里面可能含有的的可执行代码删除
解析漏洞
一、Apache解析漏洞:
- abc.php.xxx.xx.xx(那么这个文件会被apache容器解析成php文件,因为apache解析文件名的步骤是从文件末尾开始找文件后缀名,见到xx。不认识,之后继续向前找,xxx.也不认识,继续向前,当走到.php的时候,认识这个后缀,并解析这个后缀)
- .htaccess
- 若此文件中输入对应的代码,那么该文件目录下的所有文件将以php文件来执行
二、IIS6.0解析漏洞
- asp;1.jpg(会将1.jpg解析成asp文件格式)
- abc.asp;time.jpg(会将1.jpg解析成asp文件格式)
- abc.asp/time.jpg(abc.asp是个目录,iis6.0会将这个目录下的文件按照asp方式进行解析)
三、IIS 7.0&7.5畸形解析漏洞
- 默认fast-cgi开启状况下,在一个文件路径后面加上/xx.php会将原来的文件解析为php文件