目录
文件上传漏洞利用介绍
1.绕过js验证
2.绕过MIME-TYPE验证
3.绕过基于黑名单验证
基于文件后缀名验证介绍
基于文件后缀名验证方式的分类
基于黑名单验证代码分析
利用apache配置文件.htaccess进行绕过
大小写绕过
空格绕过
点号绕过
特殊符号绕过
路径拼接绕过
双写绕过
4.绕过白名单验证
00截断
5.图片webshell上传绕过
文件上传漏洞利用介绍
1.绕过js验证
js验证代码分析
burpsuit剔除js验证
对于js前端验证,直接删除js代码之后就可以绕过js验证
2.绕过MIME-TYPE验证
验证MEMI-TYPE代码分析
查看源代码分析,使用$_FILE["upload_file"]["type"]获取上传文件的MIME-TYPE类型。其中upload_file是在表单中定义的。
burpsuit绕过MIME-TYPE验证
利用burpsuit工具截断http请求,在repeater重放修改MIME-TYPE类型绕过验证。image/jpeg
3.绕过基于黑名单验证
基于文件后缀名验证介绍
对于文件上传模块来说,尽量避免上传可执行文件。为了防止上传脚本文件需要设置对应的验证方式。最简单的就是设置文件后缀名验证
基于文件后缀名验证方式的分类
1.基于白名单验证:只针对白名单中有的后缀名,文件才能上传成功。
2.基于黑名单验证:只针对黑名单中没有的后缀名,文件才能上传成功。
基于黑名单验证代码分析
对于黑名单中的后缀名筛选。绕过黑名单可以通过寻找“漏网之鱼”,
寻找某些可以被作为脚本执行同时也不在黑名单中。
burpsuite绕过黑名单验证
利用burpsuite工具截断http请求,利用intruder模块进行枚举后缀名,寻找黑名单中没有过滤的后缀名。
利用apache配置文件.htaccess进行绕过
htaccess文件是apache服务器的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件拓展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。
SetHandler application/x-httpd-php
设置当前目录下所有文件都使用PHP解析,那么无论上传任何文件,只要文件内容符合PHP语言代码规范,就会当作PHP执行,不符合则会报错。
配置http.conf文件
在apache中如果需要启动.htaccess,必须在http.conf中设置AllowOverride
在黑名单中,没有对.htaccess进行过滤,可以直接上传.htaccess来设置使用php解析任意文件。
制作图片phpinfo探针并上传
phpinfo();
?>
保存为1.jpg进行上传即可。
大小写绕过
windows系统下,对文件名大小写不敏感,例如:test.php和 TEST.phP是一样的。
linux系统下,对文件名的大小写敏感,例如:test.php和TEST.phP是不一样的。
基于黑名单验证的代码分析
没有利用 strtolower($file_ext)全部转换为小写
可以清晰的看出,黑名单中增加了.htaccess的检验,但是缺少了对上传文件名获取的小写转换
利用burpsuite修改文件名进行绕过
空格绕过
基于黑名单验证的代码分析
没有利用trim($file_ext)去除最后面得空格
windiws系统下,对文件名中空格会被作为空处理,程序中的检验代码却不能自动删除空格。从而绕过黑名单。
针对这样的情况需要使用burpsuite截断http请求后,修改对应的文件名 添加空格。
点号绕过
基于黑名单验证的代码分析
没有利用deldot($file_name)去掉最后面得点
windows系统下,文件后缀名最后一个点会被自动去除
例如 windows下新建一个1.php. 文件,会自动更正为1.php
特殊符号绕过
基于黑名单验证的代码分析
没有利用str_ireplace('::DATA', ' ' ' ,$file_ext)去除特殊符号。
windwos系统下,如果上传的文件名中test.php::$DATA会在服务器上生成一个test.php的文件,其中内容和所上传的文件内容相同,并且被解析。
利用burpsuite修改文件名进行上传
路径拼接绕过
例如:
新建一个 1.php. .文件,deldot删除最后一个点之后,不能进行删除,trim删除空格,那么最终上传的文件名为1.php. ,利用windows自动去除最后一个点,导致成功上传1.php
双写绕过
基于黑名单验证的代码分析
str_ireplace()函数替换字符串中的一些字符(不区分大小写)
代码编写过程中,只对黑名单中的内容进行空替换,因为只替换一次所以造成双写绕过
例如:1.phphpp
4.绕过白名单验证
00截断
0x00是十六进制表示方法,是ascii为0的字符。在有些函数处理时,会把这个字符当作结束符。
系统对文件名读取时,如果遇到0x00,就会认为读取已结束。
在php5.3之后的版本中完全修复了00截断,并且00截断受限于GPC,addslashes函数。
GET型00截断
GET型提交的内容会被自动进行URL编码
POST型00截断
在POST请求中,%00不会被自动解码,需要在16进制中进行修改00
5.图片webshell上传绕过
在服务器的PHP代码中,对于用户上传的文件做文件类型检验,检查文件格式是否符合上传规范。可以检查文件二进制格式的前几个字节,从而判断文件类型是否正确。
针对这种情况直接新建1.jpg,其中代码内容如下
GIF98A
phpinfo();
?>
文件包含漏洞代码解析
在PHP中,使用include、require、include_once、require_once函数包含的文件都会被当作PHP代码执行,无论文件的名称是什么,
只要文件内容符合PHP代码规范,都会当作PHP代码执行。
图片webshell需要结合文件包含漏洞一起使用