目录
初识文件上传漏洞
那么什么是文件上传漏洞呢?
文件上传是web开发中的一项基本的功能,是指将本地的文档、视频、音频以及图片等上传到服务器,从而使得自己或者是其他的用户下载或者浏览的过程。
那么文件上传漏洞是指程序员在WEB应用中利用客户端上传功能控制、检测、处理的不足,向服务器上传特定的可执行文件(如webshell、恶意脚本、木马等)以达到控制主机的目的。
文件上传漏洞的危害
web开发人员如果在实现文件上传功能的时候,没有对文件的格式、后缀进行严格的过滤和检验,那么攻击者便可以利用这一方面的缺陷,直接上传木马、恶意脚本等再通过访问这些而已的脚本中的恶意代码,最终可能会导致用户信息泄露,被钓鱼、欺诈,甚至使攻击者可以上传webshell到服务器,进而得到自己想要的信息和权限,最终达到了对服务器的恶意操作,甚至完全控制服务器系统,在服务器系统中可以为所欲为。
文件上传漏洞应该如何去查找以及判断?
首先就是在拿到一个站点的时候,寻找有文件上传的功能的地方,然后判断是服务器端还是客户端的验证,客户端比较容易判断出来,最后就是检验是哪一种服务器端的过滤方式,判断是客户端和服务器端的检验,再检验是白名单还是黑名单,最后就是根据具体情况来决定采用什么绕过方式。
(服务器端检验和客户端检验的区别:客户端检验;如HTML、JavaScript,他们的使用比较简单,并且不需要提交到服务器端就可以验证,减少了服务器的负担,客户端提交的数据是可以自己进行更改的,我们在客户端的验证时很容易绕过的,直接建一个HTML,把表单提交写到你的地址上,再把验证语句去掉,那你的客户端验证就不起作用了;然而服务器端的验证我们是看不到代码的,我们是不可以随意的更改的)
文件上传漏洞产生的原因?
- 服务器配置不当
- 开源编辑器上传漏洞
- 本地文件上传限制被绕过
- 第三方应用对应的文件解析漏洞
- 在文件上传功能实现时过滤不严格
- 文件路径截断
DVWA的演示
low
low级别的文件上传是不存在任何的过滤和检验的,因此我们可以直接上传php一句话木马,用菜刀直接进行连接。
Medium
查看源代码我们可以看到对文件的后缀名,进行了过滤,我们再次上传之前的php一句话木马的时候,提示我们上传失败,必须上传jpg等图片格式。因此我们抓包可以修改Content-Type值或者是直接修改图片的后缀。
这里有一个做题的时候的疑问点,那就是发现:
是IIS7.5版本,于是我就查看了IIS7.5对应的解析漏洞,在默认Fast-CGI开启状况下,在一个文件路径(/xx.jpg)后面加上/xx.PHP会将 /xx.jpg/xx.php 解析为 php 文件。也就是说我们可以上传一个.jpg的文件,然后再在它的后面加上1.php,这样便会将解析php文件。但是测试不可以。可能是不满足对应的两个条件。
high
对应的源码如下:
high级别做出了更加严谨的过滤,它不仅仅限制是jpg、png等格式,以及限制图片的大小,而且还通过substr( $uploaded_name, strrpos( $uploaded_name, ‘.’) + 1),只验证文件名的第一个“.”后面的格式。
substr() 函数:
用于从指定字符串中截取一段字符;有三个参数:str,start,length
str是目标字符串,start是选取的首下标,length是可选参数,表示选取的字符串长度。
之后我们就可以通过上传图片马,再结合low级别的文件包含使用菜刀来连接。我们将一个正常的图片和我们之前的shell.php进行copy成一个shell.png
copy a.png/b+shell.php/a test.png
将这个图片进行上传,上传后得到路径,我们在利用low级别的文件包含漏洞,使用菜刀进行连接,在连接的时候我们需要对应的cookie值,我们可以查看response头得到。
http://xxx/vulnerabilities/fi/?page=file:///var/www/html/hackable/uploads/shell.png