文件上传
文件上传
首先我们来了解一下一句话木马,那什么是一句话木马呢?
一句话木马
在很多的渗透过程中,渗透人员会上传一句话木马(简称Webshell)到目前web服务目录继而提权获取系统权限,不论asp(动态服务器页面,服务器端脚本环境)、php、jsp、aspx都是如此
Webshell就是以asp、php、jsp或者cgi等网页文件形式存在的一种命令执行环境,也可以将其称做为一种网页后门。黑客在入侵了一个网站后,通常会将asp或php后门文件与网站服务器WEB目录下正常的网页文件混在一起,然后就可以使用浏览器来访问asp或者php后门,得到一个命令执行环境,以达到控制网站服务器的目的。
PHP:
通过文件上传漏洞,可以上传一句话木马,主要是上传PHP一句话木马
先来看看最简单的一句话木马:
【基本原理】利用文件上传漏洞,往目标网站中上传一句话木马,然后你就可以在本地通过蚁剑即可获取和控制整个网站目录。@表示后面即使执行错误,也不报错。eval()函数表示括号内的语句字符串什么的全都当做代码执行。$_POST[‘cmd’]表示从页面中获得cmd这个参数值。
常用的PHP一句话木马:
eval($_POST['cmd']); |
相当于<?php echo >
这个是php的短标签,需要在php.ini开启short_open_tag
GIF89a (gif文件头)
这个是文件的幻数头,可以绕过对文件头部内容的检测。
ASP:
<%execute request(“#”)%> |
是典型的一句话木马服务端代码,将这个代码写入asp文件,就成了一句话木马服务端文件。
仔细观察一下<%execute request(“#”)%>这句代码,括号里的“#”是我们一句话的密码,我们可以把它改成任意字符,这样可以避免别人发现我们的一句话木马后,轻松的通过它捡个大便宜,如果我们上传的一句话代码为<%execute request(“123456″)%>。那么在客户端连接文件里要将textarea name=”#”将其改为对应的textarea name=“123456”,才能连接成功。
*一句话木马*工作的原理:
将一句话木马插入到asp文件中(包括asa.cdx.cer文件),该语句将会作为触发,接收入侵者通过客户端提交的数据,执行并完成相应的入侵操作。
客户端则用来向服务端提交控制数据,提交的数据通过服务端构成完整的asp功能语句并执行,也就是生成我们所需要的asp木马文件。
ASPX:
<%@ Page Language="Jscript"%> |
网站中的传值方式有POST,GET,REQUEST等,一句话木马主要是用POST这一传值方式
将一句话代码通过特殊手段上传到网站的服务器上之后,并且知道上传到的路径后,我们将文件的外网路径作为传值对象,利用POST传值的方法,将我们需要服务器执行的命令上传并执行。
进入正题,讲文件上传
文件上传
什么是文件上传?
文件上传也是和RCE类型的危害相同的,如果我们可以任意上传文件且服务器可以解析的话那么就相当于我们可以执行任意的文件代码,从而控制了整个服务器。在实战渗透中,我们打点最快的方式就是寻找是否存在文件上传的功能点。不过一般都是后台会存在这样的功能点且漏洞较多。一旦我们将文件传到服务器之后,就可以通过webshell管理工具进行连接。上传文件之前我们需要先清楚web服务是基于什么语言开发的,是否会将我们的文件进行解析。当然这个都需要我们实际进行测试。
upload-labs靶场
buuctf靶场,讲完自己练习,先听,做笔记
我们用这个靶场来为大家讲解文件上传的相关知识和常见考点
Pass-01(前端JS验证)
随便一个照片,上传成功
我们写入php一句话木马,上传试验 cmd.php
eval ($_POST['cmd']); |
不行,不能直接上传php文件,查看源码
function checkFile() { //前端,JS代码 |
所以我们直接禁用JS或者在控制台执行checkFile=function(){}; 或者BP改包
禁用JS
连接蚁剑
可以看到服务器上的任何内容,可以进行RCE
在控制台执行checkFile=function(){};
即可将校验逻辑置空,然后就可以顺利的上传该文件。
BP改包
Pass-02MIME后端验证(content-type验证)
BP改包
Pass-03(黑名单绕过)
用黑名单不允许上传.asp,.aspx,.php,.jsp
后缀的文件,但可以上传.phtml、 .php3 .php5、php4、 .pht、php1、php2、phps
【这些后缀会被当成php文件解析】等等。
这个名字进行了一个随机化的处理,不是我们上传的那个了
$is_upload = false; |
连接蚁剑
Pass-04(黑名单验证,.htaccess)
这次基本后缀都过滤了,我们用.htaccess
笼统地说,.htaccess可以帮我们实现包括:文件夹密码保护、用户自动重定向、自定义错误页面、改变你的文件扩展名、封禁特定IP地址的用户、只允许特定IP地址的用户、禁止目录列表,以及使用其他文件作为index文件等一些功能。
好了,我们开始上传一个.htaccess内容如下的文件:
先上传.htaccess文件
Pass-05(黑名单验证,.user.ini.)
也可以大小写绕过
php.ini 是 php的配置文件,.user.ini 中的字段也会被 php 视为配置文件来处理,从而导致 php 的文件解析漏洞。
但是想要引发 .user.ini 解析漏洞需要三个前提条件
服务器脚本语言为PHP
服务器使用CGI/FastCGI模式
上传目录下要有可执行的php文件
什么是 CGI
CGI 的全称为“通用网关接口”(Common Gateway Interface),为 HTTP 服务器与其他机器上的程序服务通信交流的一种工具, CGI 程序须运行在网络服务器上。传统 CGI 接口方式的主要缺点是性能较差,因为每次 HTTP 服务器遇到动态程序时都需要重新启动解析器来执行解析,之后结果才会被返回给 HTTP 服务器。这在处理高并发访问时几乎是不可用的,因此就诞生了 FastCGI。另外,传统的 CGI 接口方式安全性也很差,故而现在已经很少被使用了。 什么是 FastCGI FastCGI 是一个可伸缩地、高速地在 HTTP 服务器和动态服务脚本语言间通信的接口(在 Linux 下, FastCGI 接口即为 socket,这个socket 可以是文件 socket,也可以是IP socket),主要优点是把动态语言和 HTTP
服务器分离开来。多数流行的 HTTP 服务器都支持 FastCGI,包括 Apache 、 Nginx 和 Lighttpd 等。
同时,FastCGI也被许多脚本语言所支持,例如当前比较流行的脚本语言PHP。FastCGI 接口采用的是C/S架构,它可以将 HTTP 服务器和脚本服务器分开,同时还能在脚本解析服务器上启动一个或多个脚本来解析守护进程。当 HTTP
服务器遇到动态程序时,可以将其直接交付给 FastCGI 进程来执行,然后将得到结果返回给浏览器。这种方式可以让 HTTP
服务器专一地处理静态请求,或者将动态脚本服务器的结果返回给客户端,这在很大程度上提高整个应用系统的性能。
创建一个.user.ini文件并把它上传
auto_prepend_file=cmd.jpg |
.user.ini文件里的意思是:所有的php文件都自动包含cmd.jpg文件。.user.ini相当于一个用户自定义的php.in
这里进行一个随机化处理,就包含不了cmd.jpg了,需要进行爆破才行
Pass-06(后缀名空格绕过)
原理是 服务器在校验黑名单时,校验的后缀名是.php+空格,由于.php+空格不在黑名单内,可以通过校验,而Linux系统在保存文件时,会自动去掉后面的空格,因此文件最终保存在服务器上的后缀名为.php
双写绕过也行
phpphp
有问题这个靶场,我在本地搭建临时文件也不存在
Pass-07( 点绕过)
源码相较于pass-4,没有删除文件名末尾的点,利用Linux特性,会自动去掉后缀名中最后的”.”,可在后缀名中加”.”绕过。
Pass-8 ::$DATA绕过
Windows可以,Linux环境下不可以
Pass-09(点+空格+点绕过(循环递归过滤))
源码相较于前几关,所有的过滤都有。貌似没有问题,但是所有的过滤仅一次,先删除文件名末尾的点(仅删除一次),然后再首尾去空,导致可以利用1.php+(点+空格+点)来绕过。
- 首先,删除文件名末尾的点,变成1.php+点+空格,
- 然后,通过strrchar函数来确认文件的后缀名为.php+点+空格,
- 接着,将文件的后缀名转换为小写、去除字符串::$DATA、首尾去空,变成.php+点,
- 最后,判断文件后缀名是否在黑名单内。由于“.php.”不在黑名单中,可以通过校验,而windows特性,保存文件时会自动去掉后缀名中最后的”.”,最终文件成功上传并保存为1.php。
上传成功,访问失败,临时文件被删除
但是双写绕过可以phpphp
Pass-10(双写绕过)
phpphp
Pass-11 (%00截断)
更新中