0x00文件上传介绍
- 文件上传是现代互联网常见的功能,允许用户上传图片、视频、及其他类型文件,向用户提供的功能越多,Web受攻击的风险就越大
0x01文件上传漏洞
- 上传文件时,如果未对上传的文件进行严格的验证和过滤,就容易造成文件上传漏洞,上传脚本文件(包括asp、aspx、php、jsp等)
- 恶意上传行为可能导致网站甚至整个服务器被控制。恶意的脚本文件又被称为WebShell,WebShell具有强大的功能,如查看服务器目录、服务器中文件、执行系统命令等。
0x02文件上传绕过
js检测绕过
- 检测原理
调用JS的selectFIle()函数,先将文件名转换为小写,然后通过substr获取文件名最后一个点号后面的后缀(包括点号)进行判断。
- 绕过方法
由于后端PHP代码没有对文件做任何检测,所以只要绕过前端JS的校验就可以上传WebShell。
- 具体实现
手动改后缀为.jpg 用burp抓包改后缀为.php
文件后缀绕过
- 检测原理
通过函数pathinfo()获取文件后缀,将后缀转为小写后判断是不是php。
- 绕过方法1
有些中间件允许解析其他文件后缀的,如在httpd.conf配置文件中,配置如下代码,则能解析php、php3、phtml文件。所以上传一个后缀名为php3、phtml的文件即可。
- 绕过方法2
结合Apache文件解析机制,从右向左开始解析文件后缀,若后缀名不可识别,则继续判断知道遇到可解析的后缀为止。3
- 具体实现
1.php php3 phtml后缀
2.后缀如下
xxx.php.xxx
xxx.php3.xxx
xxx.phtml.xxx
文件类型绕过(MIME)
- 检测原理
判断$_FILES【“file"】【“type”】是不是图片格式(image/gif、image/jpeg、image/pjpeg),不是则不允许上传。
$_FILES【“file”】【“type”】的值是从请求数据包中Content-Type中获取
- 绕过方法
通过抓取数据请求包,上传php文件时,Content-Type值是application/octer-stream,上传。jpg格式的文件时Content-Type值。是image/jpeg。可修改文件类型进行绕过。
- 具体实现
上传php 抓包改content-type为图片格式
文件类型绕过(文件幻数绕过)
- 检测原理
利用getimagesize0函数获取图片的宽高等信息,如果上传的不是图片,那么则获取不到信息。
- 绕过方法
在脚本文件开头补充图片对应的头部值,或在图片后写入脚本代码。
- 具体实现
- 找一张图片 用16进制打开 在末尾添加代码
- 在文件中加入图片的文件头
- linux下: 1.png 1.php > image.php
文件截断绕过
- 检测原理
由于00代表结束符,PHP会把00后面的所有字符删除。
截断条件:PHP版本小于5.3.4、magic_quotes_gpc为OFF状态
- 绕过方法
GET方法中加入00截断
POST方法中传入%00并解码
- 具体实现
- 文件名为:1.php%00.jpg 抓包
- POST:选中%00 ctrl+shift+u转码
- GET:直接加入 ?jieduan= 1.php%00 (POST值要删掉)
抓包(绕不过白名单)
直接上传1.php 抓包 名字改为1.php.jpg
hex中 2e改为00 (2e为1.php.jpg中的第二个点)
文件内容绕过(竞争条件攻击)
- 检测原理
一些网站文件检测逻辑是先允许上传任意文件,然后检查文件内容是否包含可执行脚本,如果包含则删除。这里使用sleep)函数来模拟判断是否含有脚本所需要的时间。
- 绕过方法
利用成功上传到删除文件的时间差,传一个.php文件,在未删除之前立即访问,则会自动生成一个新php文件,新文件不会被删除。
- 具体实现
上传文件代码1.php
<?php
fputs(fopen('../5/shell.php','w'),'<?php phpinfo();?>');
?>