
文件上传漏洞个人理解
存在原因
web应用存在文件上传功能,上传点未设置格式的限制、权限的限制、上传目录位置的限制,用户可自定义上传文件类型并连接(如:webshell)。
文件上传漏洞我个人觉得就是各种花样,不像其它漏洞需要了解的那样深入,就是它存在文件上传点并且你可以用各种手法将你想要上传的文件上传并且利用。
这里就利用靶场对其简单描述
文件上传
前后端验证
黑白名单
文件头
完整性
二次渲染
MIME
前端验证
顾名思义前端验证就是在前面进行验证,通过js来控制文件上传,这种限制可以说是根本不存在,因为前端代码是可以通过浏览器直接修改的。
禁用js脚本我觉得太麻烦,可以通过抓包改后缀。 先将后缀改成符合要求的格式,然后通过抓包更改。
可以通过数据包看到filename 内容为文件名字,然后改后缀名结果如下。
我们连接一下看看结果。
成功连接我们上传的php文件,内容为phpinfo();
简单描述一下过程
首先这个是前端验证,它在前端浏览器验证完后缀名之后成功上传,然后我们利用中间抓包代理拦截数据包,将后缀名改为php。上传成功后并且给出上传地址我们可以直接进行连接。
由此可见,前端不可信!
MIME
这里就是后端验证了,我这里直接上传php。 试试相同的方法
它居然也上传成功了还能连接,这是我没想都的。因为这一关的考点是MIME类型验证,我没有修改MIME也成功了那它考个锤子呢?
MIME我就不说那些名词解释了。在这里的作用就是通过Content-Type(Media type):
来限制文件类型,可以看上面截图内容为 image/jpeg
(⊙﹏⊙)是我愚蠢了,因为通过上面的方法上传的就是图片文件,所以这里文件类型就是运行的。这就是为啥同样的方法也可以成功。如果直接上传php文件,是下面的样子。
如果这时直接更改后缀名是被它成功拦截的,要将Content——Type内容改成图片格式。
白名单
通过如上测试结果为失败,我们看一下后端代码如果编写的。
通过网站页面上传失败提示信息或通过代码可以看到做了白名单限制来限制文件上传格式必须为jpg,jpeg,pen
通过题目可以看到考点为getimagesize()函数,通过代码(没有截图到)可以看到包含了一个inc/uploadfunction.php文件。
通过百度这个php函数得知:这个函数功能会对目标文件的16进制去进行一个读取,去读取头几个字符串是不是符合图片的要求的。 这里我们抓一下包看一看。
phpinfo
图片
这个东西很明显就能看得出来,所以有些时候我就不爱看那些所谓的官方文字解释,这种通俗易懂。 明显可以看到图片中的内容头部是有一个和身份标识的东西来证明自己。
在图片内容后面插入后门代码,将附有后门代码的图片上传上去,然后再利用文件包含漏洞打组合拳。
我简述一下过程
将后门代码写入图片内容里面,然后配合网站上面的文件包含漏洞,这里的文件包含是include函数加载图片文件连里面的php代码都执行了。通过?filename=传参来构造后门图片的位置,这样就加载了我们上传的php文件。
.htaccess文件上传解析漏洞
上传一个.htaccess文件,再上传一个包含php代码的图片文件。
这个是个漏洞是Apache服务器下的一个配置文件,我操作的是一个文件上传的靶场upload-labs第四关,这关的黑名单限制做的很足,而且考点又是这个。
思路就是上传点没对.htaccess文件进行相关的限制,通过自行上传此文件在和后门图片在同一目录里,然后就可以实现将图片内容通过解析成php。
黑名单:对名单内的文件格式进行拦截
白名单:只认可名单内的文件格式
.htaccess文件的内容(根据自己需要写入即可)
<ifModule mime_module>
AddHandler php5-script .jpg
<!-- 将.jpg文件按照php代码进行解析执行 -->
AddType application/x-httpd-php .jpg
<!-- 将.jpg文件按照php代码进行解析执行 -->
Sethandler application/x-httpd-php
<!-- 将该目录及子目录下的文件均按照php文件解析执行 -->
</ifModule>
<!-- 该种匹配方式并不推荐,极易造成误伤 -->
<FilesMatch "muma.jpg">
Sethandler application/x-httpd-php
<!-- 将匹配到的 muma.jpg 文件按照php解析执行 -->
Addhandler php5-script .jpg
<!-- 将匹配到的 muma.jpg 文件按照php解析执行 -->
</FilesMatch>
<!-- 该种匹配方式较为精准,不会造成大批的误伤情况 -->
.user.ini利用
这个就是和上面差不多,为啥要用这个呢,因为.htaccess是Apache服务器的,Nginx要利用这个需要繁琐的配置。
这里演示的是ctfshow里面的文件上传关卡
一样的前端和MIME限制,老套路改包进行修改达到上传.user.ini文件的目的,内容为auto_prepend_file=1.png
然后在上传一个1.png,内容为一句话木马。
连接文件地址,发送post请求,目地读取flag。
小总结一下
上传一个.user.ini 内容包含一个木马图片的名字,然后上传被包含的木马图片,这两个文件是相辅相成的。
<?php eval($_POST[x]);?>
这句木马功能就是接受post传参 x= 原理就是eval函数,才发现截图没截好。
利用hackbar 对目录地址发送一个post请求:x=system('cat ../flag.php');
读取当前目录再向上走一个目录(../)里面的flag.php文件。
http://52a595c4-4014-4cf0-8e80-717857f3ca9b.challenge.ctf.show/flag.php
二次渲染
服务器会对上传上来的图片进行二次渲染将一部分数据清除保留一部分数据来使图片占用空间变小,那么服务器在渲染的过程中可能就会将后门代码给破坏了。 思路就是,将上传过后进行渲染过的图片下载下来,将上传前后的图片进行对比(这里可以利用工具)再保留的位置插入后门代码再进行上传。
条件竞争
这个也很好理解,有些服务器会先将上传的文件存入系统,然后符合条件改名留下,不符合条件的清楚。 那么这个过程就可以利用它短暂的存留再内部的时间进行连接,因为系统是不能删除被使用中的文件。 要求网速快手速快哈哈哈(当然是利用工具啦)。
Web应用编辑器上传
有些网站会利用编辑器,且这个编辑器有上传功能,然后就干编辑器就好了。
总结
文件上传漏洞很好理解,主要是手法。 前端验证 后端验证:黑白名单限制文件后缀名,文件头,MIME,内容过滤(过滤特殊符号来防御后门代码) 后缀名白名单:利用文件包含,文件解析,也就是说白名单是写死的走旁路。 1.jpg.php 1.php.jpg 1.php%00截断、0x00截断、0x0a截断
MIME,文件头检测:文件头就是每个文件内容头部会有一个标识身份的东西 .htaccess/.user.ini:没有对这两个文件进行限制。
防御
文件上传的目录设置为不可执行
判断文件MIME类型(content-type)
对文件后缀进行检查
使用随机数改写文件名和文件路径:能上传不能访问
单独设置文件服务器的域名:同源策略
在前面通过Waf防火墙(Web应用防火墙)来对带有特征信息的文件进行拦截。
fgrep
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)