文件上传
一、原理
在文件上传的功能处,若服务端脚本语言未对上传的文件进行严格验证和过滤,导致恶意用户上传恶意的脚本文件时,就有可能获取执行服务端命令的能力,这就是文件上传漏洞。
二、高危触发点
相册、头像上传
视频、照片分享
附件上传(论坛发帖、邮箱)
文件管理器
三、常见的文件上传检测及利用
1、没有任何限制和过滤
直接上传webshell文件
2、客户端
javascript检测
只会检测上传文件的后缀名
如何绕过?
(1)禁用浏览器js功能
(2)先把所要上传的文件修改成允许上传的文件类型,通过burp抓包进行重命名进行绕过。
3、服务器
MIME类型检测 ----content-type
服务器对用户上传文件的文件类型进行检测,不允许上传的文件类型会被禁止。
比如,上传正常图片可以通过,但是把图片的content-type修改为其他值application/octet-stream之后上传失败,说明存在MIME类型检测
怎么绕过?
把所要上传文件的content-type,修改为允许上传的文件的文件类型。
文件扩展名检测
通过黑白名单对上传的扩展名进行过滤和限制
黑名单(php,asp,jsp)
(1)大小写绕过; pHp ASp
(2)名单列表绕过;php可以换成.phtml/.php3/.php5 asp改成aspx
(3)特殊文件名;通过burp抓包把文件名改成xx.php.或者xx.php_(下划线代表空格)或者 .空格.的方式 。这种命名方式在windows系统是不允许的,只能在burp里修改。当绕过之后,windows会自动去掉后面的.和_
linux下没有这种特性
::$DATA windows下的NTFS的数据流格式
(4)%00截断(1.截断路径2.截断文件名 版本限制php<5.3.4)
(5).htaccesss 攻击
通过上传.htaccesss文件,重新写入解析规则,把上传的带有木马的文件以php方式解析。
(6)解析漏洞
(7)双写绕过 -----------关键字替换
白名单
输入一个不存在的后缀名,当它仍然提示错误,说明它是白名单;
(1)%00截断
(2)解析漏洞
目录路径检测
检测路径的合法性
怎么绕过?
%00 截断。
文件内容检测
文件头检测 — getimagesize()
文件幻数:是用来唯一标识文件类型的一系列数字,通过检测内容开始处的文件幻数来确定文件类型
四、相关漏洞
1、解析漏洞
解析漏洞主要是一些特殊文件被Apache、IIS、Nginx等Web容器在某种情况下解释成脚本文件格式并得以执行而产生的漏洞
2、apache
多后缀解析 1.php.a.b —从右往左 依次判断
解析规则:从右往左以此进行判断解析,如果后缀名为不可识别的类型,就会继续往左判断。因为.a和.b不属于一个可识别的类型,一直判断到php。此时把该文件当做一个php来进行解析。
3、配置漏洞
httpd.conf
AddType application/x-httpd-php .jpg jpg文件会被当做php进行解析
.htacess解析 (仅限于当前目录)
<FilesMatch “test.jpg”>
SetHandler application/x-httpd-php
防御:禁止上传.htaccess
4、防御措施
,禁止含有php字符的文件访问权限
5、IIS 常规漏洞 — asp,aspx网站
(1)IIS 6.0
目录解析漏洞:服务器默认会把存在于.asp这样的目录下的文件都解析成asp文件
文件解析漏洞:服务器默认不解析;以后的内容,因此构造的1.asp;1.jpg就会被解析成asp文件
(2)IIS 7.5
IIS7/7.5在Fast-CGI运行模式下,在一个文件路径(/xx.jpg)后面加上/xx.php会将/xx.jpg/xx.php 解析为 php 文件。
6、nginx <8.03
php开启fix_pathinfo 选项,上传1.jpg这样格式的文件之后,构建一个url参数1.jpg/.php,此时1.jpg会被作为php解析。
注:fix_pathinfo选项的值改回0(1开启,2关闭)
五、上传防御措施
1、设置文件上传的目录为不可执行
只要web容器无法解析该目录下的文件,即使攻击者上传了脚本文件,也没有办法执行所以不会对服务器本身造成什么影响。
以apche为例, 我们利用.htaccess文件(该文件一定要禁止上传,否则被重写规则之后这种防御方式就不存在了)对web服务器的行为进行限制
(1)指定特定扩展名的文件的处理方式
AddType text/plain .php .asp .py(把这些脚本文件当作文本输出)
(2)完全禁止特定扩展名的文件被访问
Options -ExecCGI
AddHandler cgi-script .php .pl .py .jsp .asp .htm .shtml .sh .cgi
当以上这几种类型的文件被访问时,会返回403forbidden错误。
(3)只允许访问特定文件类型
<Files^(.jpeg|.jpg|.png|.gif)>
order deny,allow
deny from all
比如,这是一个上传图片的目录。目的是为了让该目录下只有图片格式扩展名的文件才可以被访问,其它类型就是拒绝访问。
2、判断文件
包括MIME类型(content-type类型),扩展名,文件内容。在文件扩展名检测中,优先使用白名单。
3、使用随机数重写文件名和文件路径
上传的文件如果要执行代码,首先需要用户能够去访问到这个文件。如果我们确认上传成功,但是访问不到我们所上传的问题,此时考虑是否存在文件名改写。
4、单独设置文件服务器的域名
把网站服务器和文件服务器分开,把上传的文件放到单独的文件服务器上,对目录设置为不可执行。
5、二次渲染 (图片)
六、过程:
1、直接上传webshell文件
2、前端校验------js绕过
3、文件类型的校验 ------content-type
4、前面步骤都无法绕过的时候,考虑文件扩展名的校验。
判断黑名单还是白名单?
黑名单:(列表里存在的是常见的危险脚本类型文件)
去尝试上传一些比较安全的文件格式,如.txt .doc 。如果能够上传此时考虑它可能存在黑名单检测。
上传成功之后呢,使用一些webshell管理工具(中国菜刀,蚁剑,冰蝎)
蚁剑:https://github.com/AntSwordProject/
上传完成之后,怎么判断webshell是否能够利用?
1、判断上传的文件是否存在。(访问图片的url)
2、
(1)不存在,404
(2)空白页面,说明文件存在
①考虑一句话写对没有
②文件是否被当作php解析了。