文件上传漏洞
一.文件上传绕过验证的类型:
1.JS验证—可用bp一键remove
2.MIME-type验证—可用bp中的代理抓包截取修改第二个Content-Type
Content-Type: application/octet-stream,后面改成Content-Type:常见的类型 --+达成绕过校验的效果
3.黑名单绕过
(1)可能黑名单没有相应的可以表示php的后缀名(php2,php3,php4,phtml)
(2)使用 .htaccess后缀表示修改解析上传文件方式(SetHandler application/x-httpd-php -所有上传文件解析为php类型)
(3)可能没有进行对上传文件的小写转换
(4)空格输入
(5)特殊符号(::$DATA)文件流
(6). 号绕过 (1.php.)
(7)路径拼接绕过 (1.php.+空格+.)
(8)双写绕过 (1.pphphp)
(9)00截断绕过 (%00)
文件上传客户端验证-JS验证
1.JS验证代码分析
2.Berpsuite剔除响应JS
3.浏览器审计工具剔除JS
4.上传webshell,蚁剑连接
1.JS验证代码分析:
1.1.代码审计
1.2.定义允许上传的文件类型:.jpg .png .gif
1.3判断上传文件类型是否允许上传
(使用JS脚本检测)
如何绕过JS脚本?
1.去掉对应的JS脚本
1.1使用burpsuite剔除响应js
对于js前端验证。直接删除掉js底阿妈后就可以绕过js验证
在bp中 的“Proxy“中的“Options” 的“Remove all JavaScript”(响应当中都会删除对应的js脚本)
,网页源代码中的checkfile被删除,可以上传任意类型文件,将截取到的包发送到“Repeater“,使用“send”:“html”即可 查看
若关闭bp,将会出现该类型文件不可上传回显
2.修改JS脚本,以符合服务器验证
2.1使用浏览器审计工具剔除JS:
利用浏览器的审查工具剔除js之后,保存为新文件然后进行文件上传
使用“F12”,“查看器(Elements)”中查找“checkFile()”然后手动删除对应js脚本(必须保存新文件进入,所以推荐bp一 键remove)另存为新文件,找到相应位置。
在删除位置添上
action="http://xxx.x.x.x/fileupload/Pass-01/index.php" # ctrl+s 点击关闭
打开保存的网页上传文件就可以绕过js验证,文件内可上传一句话木马,并修改文件名Webshell.php。
上传完毕后复制当前网站名至虚拟机win7 中的中国菜刀,配置默认类别,地址与密码,密码为一句话木马[“密码”]符号 内字符串或数字
(注意此时url中的ip地址应填为主机端口否则将无法连接至挂马网站)
MIME-Type绕过
1.MIME-type介绍
2.验证MIME-Type代码分析
3.BP绕过MIME-type验证
4.蚁剑连接,虚拟终端功能
1.MIME-Type多用途互联网邮件拓展类型(jpg,png类型),设定某种拓展名的文件用一种应用功能来打开的方式类型
当该拓展名文件被访问的时候,浏览器会自动使用制定应用程序来打开,多用于制定一些客户端自定义的文件名,以及 一些媒体文件打开方式
###当windows打开1.txt时,会首先查看文件后缀名,之后将文件后缀名进行匹配,使用适当程序打开(记事本或文本 编辑器)
###当遇到2.jpg,首先会查看jpg图片格式,windows匹配后会使用图片查看
MIME-Type其中有很多类型,用来指定改文件传输过程中的文件类型
png图像--.png image/png
gif图形-- .gif image/gif
jpeg图形 -- .jpeg .jpg image/jpeg
au声音 -- .au audio/basic
midi音乐文件 -- .mid .midi audio/midi audio/x-midi
realaudio音乐文件 -- .ra .ram audio/x-pn-realaudio
mpeg文件 -- .mpg .mpeg video/mpeg
avi文件 -- .avi video/x-msvideo
pdf文档 -- .pdf application/pdf
2.验证MIME-Type代码分析
并不是发生在客户端的验证,而是发生在服务端的验证(与JS验证有明显区别)
查看源代码分析
$_FILE['upload_file']['type'] #获取上传文件的MIME-Type类型
upload_file是在表单中定义的,用于接收对应的文件type第二文件获取类型
要进行验证,使用白名单模式表示只有符合相应类型 ,符合后才能进行上传,否则进行报错
3.使用bp绕过MIME-type验证:
截断http请求报文,在Repeater(存放)中重新修改MIME0Type类型从而绕过mime-type验证
将使用 image/jpeg来进行绕过,也可以直接使用截断代理中修改对应的“Content-Type”(表单进行提交对应上传文件) 从而进行MIME-Type绕过
一般会有两个Content-type ,只需要修改第2个,服务端拿到MIME-Type是在第二个content-type
获取上传文件的MIME-Type
使用bp 文件上传抓包,在proxy(代理)中的intercept,修改,也可以send to repeater 进行修改并send
4.蚁剑连接,上传一句话木马,进行连接
一句话木马:
php<?php @eval($_POST[]"123");?> 密码为123
获取上传Webshell的地址,右键图片属性,进行连接
CMD命令:
netstat -an | find "ESTABLISHED" # netstat -an 查看本机网络连接,端口状态
# ESTABLISHED 已建立连接
"-a" 显示所有连接,当不附加"-n"选项时,它显示的是本地计算机的netbios名字+端口号
"-an"选项,显示本地IP地址+端口号
绕过黑名单验证
1.基于文件后缀名验证介绍
2.基于黑名单验证代码分析
3.bp绕过黑名单验证
4.上传webshell,蚁剑连接
1.基于文件后缀名验证介绍是作用于服务端而不是客户端,对于文件上传模块,尽量避免上传可执行的脚本文件
为了防止上传脚本需要设置对应的验证方式。最简单的就是设置文件后缀名的验证
1.1基于白名单验证:只针对白名单中有的后缀名,文件才能上传成功(更加安全)
1.2基于黑名单验证:只针对黑名单中没有的后缀名,文件才能上传成功(有绕过风险)
2.基于黑名单验证代码分析
对于黑名单中的后缀名删选。绕过黑名单可以通过寻找“漏网之鱼”,寻找某些可以被作为脚本执行同事也不再黑名单中
3.使用bp绕过黑名单验证
利用bp工具截断http请求,利用intruder模块进行枚举后缀名,寻找黑名单中没有过滤的后缀名
绕过黑名单验证(.htaccess)
- .htaccess文件介绍
2.配置文件http.conf
3.审计黑名单过滤代码
4.制作图片phpinfo探针并上传- .htaccess 文件介绍
htaccess是Apache服务器的一个配置文件,他负责相关目录的网页配置。通过htaccess文件,可帮我们实现
:网页301重定向,自定义404错误页面,改变文件拓展名,允许/阻止特定用户或者目录的访问,禁止目录列表,配置默认文档的功能
- .htaccess 文件介绍
其中 .htaccess 文件内容是:
SetHandler application/x-httpd-php ##所有文件将被解析为php文件
<FilesMatch "xxx.png">
setHandler application/x-httpd-php ###仅xxx.png文件解析为php文件
</FilesMatch>
设置当前目录所有文件都要使用php解析,那么无论上传任何文件,只要文件内容符合php语言代码规范,
就会被当作php执行。不符合则会报错
2.配置文件 http.conf
在Apache如果要启动 .htaccess,必须在 http.conf 中设置 AllowOverride
AllowOverride None ===》 AllowOverride All
3.审计黑名单过滤代码
在黑名单,没有对 .htaccess进行过滤,可以直接上传 .htaccess来设置使用php解析任意文件
文件内容:
SetHandler application/x-httpd-php
写入.htaccess保存上传,打开上传地址若显示403,无权限,则表示上传成功
4.制作图片phpinfo探针并上传
写入php代码:
<?php phpinfo(); ?> #保存为任意1.jpg进行上传即可
phpinfo()是PHP中的一个内置函数,可以提供关于系统中安装的PHP版本和PHP配置的详细信息
phpinfo()返回一个布尔值;也就是说,它在成功时返回true,在faliure时返回false 。
或者上传一句话木马 进行蚁剑连接
绕过黑名单验证(大小写绕过)
1.大小写绕过原理
2.基于黑名单验证的代码分析
3.直接修改后缀
4.webacoo上传webshell
1.大小写绕过原理:windows系统下,对于文件名中的大小写不敏感,例如:text.php和Test.PHP是一样的
linux系统下。对于文件名中的大小写敏感。例如text.php和TexT.php就是不一样的
基于windows可以上传一些安全漏洞
2.基于黑名单验证代码分析
分析黑名单验证代码 :增加了 .htaccess的验证。但缺少了对上传文件名获取的小写转换
上传相应的纯大写,纯小写文件已查看黑名单验证名单,进行局部大小写上传可发现绕过漏洞
3.直接修改后缀明PhP上传文件
文件后缀名不一定必须在bp截断http修改,可以直接修改文件后缀名进行上传
4.上传webshell
WeBaCoo生成webshell:
webacoo -g -o a.php #-g 生成后门代码 -o 需要 ===》 输出到文件a.php
webacoo -h #查看对应版本信息
webacoo -t -u webshell地址 #-t 使用终端 -u 对应生成的webshell的url是
空格绕过
1.空格绕过原理
windows系统中,对于文件名中空格会被作为空处理,程序中的监测代码却不能自动删除空格
从而绕过黑名单,针对这样的情况需要用到bp截断httpp请求后,修改对应文件名 添加空格
1.php+空格
2.基于黑名单验证的代码进行分析
经过代码分析可以看到底阿妈中没有对杀那个传文件的文件名作去空格处理,存在空格绕过黑名单问题
3.bp绕过黑名单验证
用bp截断http请求,对上传文件名加上空格
特殊符号绕过
1.原理:
windows系统下,如果上传的文件名中text.php::$DATA会在服务器上生成一个text.php
文件,其中内容和所上传文件内容相同,并被解析
2.分析代码
没有过滤 创建文件抓包上传添加 ::$DATA 即可成功
OO截断原理
0x00是十六进制表示方法,是ascii吗为0的字符,在有些函数处理室,会把这个字符当做结束符
系统在对文件名的读取是,如果遇到0x00,就会认为读取已经结束
在php5.3以后已经完全修复00截断(GPC开启,addslashes函数)
1.php0x00.jpg
1.get型00截断
get型提交的内容会被自动进行url解码
PS:一定要关闭GPC,否则将无法成功
图片马
文件包含分析
在php中,使用include,require,include_once\require_once函数所包含的文件都会被当做php代码
执行,无论文件的名称是什么,只要符合文件内容符合php代码规范,都会被当做php代码执行
<?php
if($_GET){
include($_GET["file"])
}
else{
echo "not get args file";
}
?>
使用include.php查看file内容
接着使用
include.php?file=upload/位置
即可查看
结合文件包含输出phpinfo
利用存在文件包含的php页面,包含上传的图片马,从而触发webshell,输出对应的phpinfo
文件上传竞争条件
竞争条件原理介绍:
网站逻辑:
1.网站允许上传任意文件,然后检查上传文件是否包含webshell,如果包含删除文件
2.网站允许上传任意文件,但如果不是指定类型,呢么使用unlink删除文件
在删除之前访问上传的php文件,从而执行上传文件中的php代码
3.竞争条件代码分析
先进行上传,后进行判断与删除,录用时间差进行webshell上传
4.竞争条件文件上传利用
提前不断访问代码文件,然后上传,最后使用蚁剑连接马
python发送http请求:
import requests
while true:
requests.get(“路径”)