Web安全-文件上传漏洞
文件上传漏洞是什么
关键字:绕过
文件上传是大部分Web应用都具备的功能,例如用户上传附件,改头像,分享图片等
文件上传漏洞是在开发者没有做充足验证(包括前端、后端)情况下,运行用户上传恶意文件,这里上传的文件可以使木马、病毒、恶意脚本或者Webshell等
环境搭建(及靶机)
# 第一次启动 docker pull registry.cn-shanghai.aliyuncs.com/yhskc/bwapp docker run -d -p 0.0.0.0:80:80 registry.cn-shanghai.aliyuncs.com/yhskc/bwapp docker container list -a # 查看 container id docker start xxx # xxx 就是上一步获得的 container id,运行完这条命令后,访问响应的网址即可
安装
点击here
安装成功,注册用户
登录
选择最低级别的,文件上传,点击Hack
初级尝试攻击
准备一个简单的一句话木马
通过POST取得一个值,这个值是hacker里的一个值,将我们的值转换为PHP代码
演示上传,并演示这段代码的威力。
点击浏览---》选择shell.php,点击上传、
点击here,可以看到shell.php上传到images文件夹中
为什么回显是空的呢?因为这里是POST请求,没有携带任何参数。我们如何控制呢?
我们可以使用两个PHP函数,来测试我们的Webshell
- get_current_user:获取当前用户名称
- getcwd:获取当前路径地址
可以看到我们获取当前用户为www-data。
获取到当前执行目录
这里我们使用函数执行,工作效率太低,接来下使用中国菜刀。下载地址https://github.com/raddyfiy/caidao-official-version
打开中国菜刀
点击空白处添加
添加地址,指定hacker字段,点击添加,添加后双击打开
查看是否能够执行命令,点击链接右键,获取虚拟终端
不同语言的一句话木马
asp
<%execute(request("value"))%>
php
<?php @eval($_POST['hacker']); ?>
aspx
<%@ Page Language="Jscript"%> <%eval(Request.Item["value"])%>
其他
<%eval request("value")%> <%execute request("value")%> <%execute(request("value"))%>
初探文件上传漏洞-->绕过
同样是file upload 上传页,设置为中级,点击set
我们还是上传之间的文件,看看是不是还能上传,点击浏览,选择之前的shell.php,点击upload
这里出现上传文件类型不允许。这时候我们要思考一下,限制文件类型,是限制文件后缀名,我们尝试一下其他后缀名是否可以上传。
将shell.php,复制一份叫shell.php3,看是否可以上传
点击上传,可以看到成功上传
我们上传的shell.php1 不是常规的php文件,能否执行我们的之句话木马的指令吗?我们是curl指令测试一下
其实这里,只能上传php3后缀的才能正常解析,我们看一下究竟是为什么。我们的靶机是通过apache2容器启动的,我们来看一下apache2的配置。web-server 不知道后端使用的什么语言,但是对后端语言是具有解析能力的。这是我们看apache2是如何解析php语言的,这样我们就知道为什么php3可以解析,而其他的不行。
通过这个配置我们可以看到加载了mods解析配置文件,所以我们进入这个文件夹查看所支持的mods,进入我们看到php5.conf的配置文件,我们查看一下如何配置的。
我们可以看到红框中的配置,意思是当发现文件后缀是php3、4、5或者是phtml、pht的时候都会解析成php代码。
文件上传漏洞中级-->前端验证绕过,.htaccess绕过,大小写绕过
前端验证绕过
很多网站、CMS都在使用,只在前端利用JavaScript验证
漏洞利用流程:(两个方法都可以)
- 通过Burp Suite抓包,然后修改内容放行
- 通过chrome禁止JavaScript代码
.htaccess绕过
什么是.htaccess
.htaccess文件是分布式配置文件,使得配置文件可以随文件夹不同而不同,其所放置的文件夹及所有子文件夹都会受此影响,其语法通apache主配置文件
如何利用.htaccess
场景:启用.htaccess文件的网站,使用此文件类型来绕过限制较全面的黑名单过滤
绕过流程
1、上传一个.htaccess文件,文件内容设置为【AddType application/x-httpd-php .test】
2、上传一句话木马文件,文件名设置为shell.php
3、在浏览器中访问shell.test即可执行一句话木马
大小写绕过
这是一种比较简单的绕过方式,同样是针对黑名单过滤
如果想要上传一个php木马,那么我们可以上传一个pHp即可。
文件上传漏洞高级-->文件流绕过,字符串截断绕过,文件头检查绕过
Windows文件流特性绕过
什么是Windows文件流?
NTFS文件系统实现了多文件流的特性,NTFS环境一个文件默认使用的是未命名的文件流, Windows资源管理器默认不显示出文件的命名文件流,这些命名文件流在功能上和默认使用的未命名文件流一致,甚至可以用来启动程序。
我们来用windows平台做一些测试
创建一个文件流
查看test.txt里是没有内容的
我们使用notepad 打开文件流,我们可以看到文件内容是存在的
接下来把test打印到文件本身,看看文件是否发生变化
查看内容就在文件内
将默认数据流输入222,
查看内容已经是222
这说明 我们在日常写文件的过程中,是写的他的默认数据流
字符串截断绕过
字符串截断绕过主要是编码类的绕过。一般限制是通过白名单限制,例如上传图片,会过滤文件结尾不是jpg,png等上传文件,理论上这种上传是不好绕过的,但有部分上传在保存文件的时候,是两部分组成,一部分是上传路径,一部分是文件名,而路径是从前端获取的,所以我们可以采用在路径上截断。
案例
打开Burp 代理,点击拦截功能,点击上传,将原来shell.php,修改成shell1.php.jpg,并上传。
可以看到我们已经拦截了,他的请求,接下来我们修改一下内容。可以想一下我们目前要上传这个文件的话,一定是叫shell1.php.jpg。接下来我们修改一下这个内容,我们在PHP后面加一个空格
空格的编码是20,便于我们在16进制中查找
接下来我们将20改成00
点击发送,这样就绕过了。
文件头检查绕过
常见的文件头格式
png的文件头
jpg的文件头
如何实现文件头绕过呢?
有一些情况下,文件上传是要检查文件内容呢?一般就是检查文件头,我们可以把php代码内容追加到一个jpg或者png图片里,这样就能绕过文件头检查。(简单说就是把php木马和图片文件合并)
防御措施
1、文件类型检查:白名单优于黑名单
2、使用安全的函数编程
3、熟悉业务不熟的OS、Web Server配置