文件上传漏洞
Webshell
又称一句话木马。 WebShell 就是以网页文件形式存在的一种代码执行环境,主要用于网站管理、服务器管理、权限管理等操作。WebShell根据不同的语言分为:ASP木马、PHP木马、JSP木马(上传解析类型取决于网站服务端编写语言类),该类木马利用脚本语言中 可以执行系统命令、代码命令的函数 进行文件读取、命令执行、代码执行等功能。
一句话木马功能
<?php @eval($_POST[cmd]); ?> # 执行代码命令 <?php @system($_POST[cmd]); ?> # 执行系统命令 eval assert 执行代码命令 system shell_exec 执行系统命令
文件上传漏洞
漏洞描述
文件上传漏洞是指由于程序员再开发时,未对用户上传的文件进行严格的验证和过滤,而导致用户可以上传可执行的动态脚本文件。
漏洞危害
非法用户可以通过上传的恶意文件来控制整个网站或者服务器,这个恶意的脚本文件称为Webshell, 上传 webshell 后门使之很方便地查看服务器信息,查看目录,执行系统命令等。
攻击方法
寻找测试网站的文件上传的模块,通过抓包上传恶意的文件进行测试,要判断某个后缀名能否直接上传,如果不能的话,就要通过文件绕过技术来进行绕过。
修复方案
-
在网站中需要存在上传模块,需要做好权限认证,不能让匿名用户可访问;
-
文件上传目录设置为禁止脚本文件执行。这样设置即使被上传后门的动态脚本也不能解析,导致攻击 者放弃这个攻击途径;
-
设置上传白名单,白名单只允许图片上传如,jpg png gif 其他文件均不允许上传;
-
上传的后缀名,一定要设置成图片格式如 jpg png gif ;
文件绕过技术
绕过前端JS检测上传
文件上传时,有的网站对文件后缀名进行校验,看是否符合允许上传的格式,不符合的话,因为数据包没有提交到服务器,只是通过JS代码进行校验,因此,Burp抓包也抓不到,就需要绕过前端JS检测。
绕过方法:
-
按F12使用网页审查元素,把校验的上传后缀名文件除掉,即可上传。
-
把恶意文件改成 js 允许上传的文件后缀,如 jpg、gif、png 等,再通过抓包工具抓取 post 的数据包,把后缀名改成可执行的脚本后缀如 php 、asp、jsp 等。即可绕过上传 。
绕过Content-Type检测
有些上传模块,会对 http 的类型头(MIME)类型进行检测,如果是图片类型,允许上传文件到服务器,否则返回上传失败。因为服务端是通过 content-type 判断类型,content-type 在客户端可被修改。则此文件上传也有可能被绕过的风险;通过Burp抓包进行修改。
每个文件都有自己的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、asp 这种信息提示,可判断为黑名单限制,上传黑名单以外的后缀名即可。
绕过方式:
IIS 在iis中如果ASP后缀禁止上传了,可以上asa、cer、cdx后缀,如果网站允许.net执行可以上传ashx代替aspx。如果网站可以执行这些脚本,通过上传该后缀文件即可获得Webshell。
Apache 可以开启`application/x-httpd-php` 在配置文件中需要将`AddType application/x-httpd-php .php .phtml .php3` 后缀名为phtml、php3均可以当做php文件解析。有的apache版本就会默认开启,但是一般情况都是网站管理员错误配置后造成的。
.htaccess绕过
上传模块,黑名单过滤了所有的能执行的后缀名,如果允许上传.htaccess。htaccess 文件的作用是可以帮我们实现包括:文件夹密码保护、用户自动重定向、自定义错误页面、改变你的文件扩展名、封禁特定 IP 地址的用户、只允许特定 IP 地址的用户、禁止目录列表,以及使用其他文件作为 index 文件等一些功能。
绕过:
1.编写.htaccess文件,内容解释:将1.jpg文件解析成php文件
<FilesMatch "jpg"> SetHandler application/x-httpd-php </FilesMatch>
2.上传.htaccess文件
3.再上传恶意的.jpg文件到.htaccess相同目录里,访问图片即可获取执行脚本。
大小写绕过上传
有的上传模块,后缀名采用黑名单判断,但是没有对后缀名的大小写进行严格判断,导致可以更改后缀大小 写可以被绕过。如 PHP、 Php、 phP、pHp 。
Windows特性-空格绕过
利用window对于文件和文件名的限制,当在结尾后面加上一个空格,不符合操作系统的命名规范,在最后生成文件时,空格会被自动去除。
绕过:
Windows特性- .绕过
在文件后缀名后面加上点,系统会自动删除点。
绕过:
Windows特性-NTFS流::$DATA绕过
当文件后缀名不允许被上传时,在后面加上::$DATA
,会把文件当初数据流处理,从而上传成功。evil.php::$DATA
。访问的时候要把后面的文件流去掉。
Windows特性- 空格.空格绕过
双写后缀名绕过上传
在上传模块,有的代码会把黑名单的后缀名替换成空,例如 a.php 会把 php 替换成空,但是可以使用双写绕过例如 asaspp,pphphp,即可绕过上传。
目录可控%00截断-GET绕过
上面都是一些黑名单被绕过的,如果黑名单上传检测后,没有限定后缀名,绕过的方法很多,与黑名单相对的就是白名单,使用白名单验证会相对比较安全,因为只允许指定的文件后缀名。但是如果有可控的参数目录,也存在被绕过的风险。
文件上传 %00 绕过是指攻击者在文件上传时,在文件名后面添加 %00 字符,从而绕过服务器端的文件类型、拓展名以及大小限制,成功上传恶意文件到服务器端,从而进行攻击的一种技巧。00截断是操作系统层的漏洞,由于操作系统是C语言或汇编语言编写的,这两种语言在定义字符串时,都是以0x00作为字符串的结尾,操作系统在识别字符串时,当读取道0x00字符时,就认为读取到了一个字符串的结束符号,因此,我们可以通过修改数据包,插入0x00字符的方式,达到字符串截断的目的。00截断通常时绕过白名单的限制。
条件:
-
php版本小于5.3.29
-
magic_quotes_gpc=Off
目录可控%00截断-POST绕过
post 下直接注入%00 是不行的,需要把%00 解码变成空白符,截断才有效。才能把目录截断成文件名。
文件头检测绕过
文件头代表了文件是那种类型,我们上传的文件内容如果是只有php代码,那么程序在对我们的文件头部进行检查时,如果发现没有允许上传文件类型的文件头,就会对我们上传文件进行拦截。
常见的文件头:
-
JPEG (jpg),文件头:FFD8FFE1
-
PNG (png),文件头:89504E47
-
GIF (gif),文件头:47494638
-
TIFF (tif),文件头:49492A00
-
Windows Bitmap (bmp),文件头:424D
图片检测函数绕过
白名单的方式过滤,getimagesize 是获取图片的大小,如果头文件不是图片会报错直接可以用图片马绕过检测。
图片二次渲染绕过
有些图片上传,会对上传的图片进行二次渲染后在保存,体积可能会更小,图片 会模糊一些,但是符合网站的需求。例如新闻图片封面等可能需要二次渲染,因 为原图片占用的体积更大。访问的人数太多时候会占用,很大带宽。二次渲染后的图片内容会减少,如果里面包含后门代码,可能会被省略。导致上传的图片马, 恶意代码被清除;
比如我们上传一个图片马,如果程序进行二次渲染很有可能将php代码给更改掉
如何判断是否为二次渲染:
-
判断上传前和上传后的文件大小及内容
-
判断上传后的文件返回数据包内容
条件竞争漏洞绕过
在文件上传时,如果代码逻辑不对,会造成很大的危害