文件上传漏洞,解析漏洞总结

2021-01-17 08:13

阅读:660

标签:正则   发包   ade   lang   信息   大小   列表   通道   自动   

文件上传漏洞、解析漏洞总结

1.文件上传漏洞是什么

文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。常见场景是web服务器允许用户上传图片或者普通文本文件保存,而用户绕过上传机制上传恶意代码并执行从而控制服务器。显然这种漏洞是getshell最快最直接的方法之一,需要说明的是上传文件操作本身是没有问题的,问题在于文件上传到服务器后,服务器怎么处理和解释文件。
文件上传漏洞是指用户上传了一个可执行脚本文件,并通过此文件获得了执行服器端命令的能力。在大多数情况下,文件上传漏洞一般是指上传 WEB 脚本能够被服务器解析的问题,也就是所谓的 webshell 问题。完成这一攻击需要这样几个条件,一是上传的文件能够这 WEB 容器执行,其次用户能从 WEB 上访问这个文件,最后,如果上传的文件被安全检查、格式化、图片压缩等功能改变了内容,则可能导致攻击失败。

解析漏洞是什么?

解析漏洞是指服务器应用程序在解析某些精心构造的后缀文件时,会将其解析成网页脚本,从而导致网站的沦陷。大部分解析漏洞的产生都是由应用程序本身的漏洞导致的。

1.1常见的一句话木马

asp一句话木马:
   
php一句话木马:
   
  aspx一句话木马:
  
  
其他一句话木马:

  
  
  "" Then Execute(Request("value"))%>
   ""then session("value")=request("value"):end if:if session("value")"" then execute session("value")%>
  
  
  
  可以躲过雷客图的一句话木马:
  
  不用‘‘的asp一句话木马:
  
  不用双引号的一句话木马:
  

1.2解读php一句话木马

技术图片

1.3获得webshell常用工具

https://blog.csdn.net/qq_41739364/article/details/100852308

2常见校验上传文件的方法

2.1客户端校验(前端校验)

1.通过JavaScript来校验上传文件的后缀名是否合法,可以采用白名单,也可以采用黑名的方式
2.判断方法:在点击上传按钮的时候弹出对话框如下图所示,而此时并没有发送数据包
技术图片

2.2服务端检验-白名单

2.2.1检查http请求头content-type字段,MIME文件类型

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

2.2.2%00截断-get用法

%00截断的使用条件:
php版本必须小于5.3.4
并且php.ini中的magic_quotes_gpc设置为Off
原理是:php的一些函数的底层是C语言,而move_uploaded_file就是其中之一,遇到0x00会截断,0x表示16进制,URL中%00解码成16进制就是0x00。

在url中%00表示ascll码中的0 ,而ascii中0作为特殊字符保留,表示字符串结束,所以当url中出现%00时就会认为读取已结束
0x开头表示16进制,0在十六进制中是00, 0x00就是%00解码成的16进制
www.123.com/imbrave.php%00.jpg => www.123.com/imbrave.php

.jpg就会被解析为.php从而getwebshell

2.2.3%00截断-post用法

 $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 = $_POST[‘save_path‘]."/".rand(10, 99).date("YmdHis").".".$file_ext;

        if(move_uploaded_file($temp_file,$img_path)){
            $is_upload = true;
        }

为什么修改path才可以?
因为程序中检测的是文件的后缀名,如果后缀合法则拼接路径和文件名。
那么,攻击者修改了path以后的拼接结果为:uploads/aaa.php%00/20190818.php
移动文件的时候会将文件保存为:uploads/aaa.php
从而getwebshell

技术图片
技术图片
+的URL编码的16进制 为2b,将2b改为00即可

2.3服务端检验-黑名单

2.3.1上传特殊后缀可解析的

一些特殊后缀
php:php3、php4、php5、php7、phtml
jsp:jspx、jspf
asp:asa、cer

apache里有个一个配置文件httpd.conf他可以允许一些特殊后缀名上传,最终都会被解析成php执行如:

AddType application/x-httpd-php .php .phtml.php3.php4.php7   等等

2.3.2上传.htaccess文件

.htaccess文件(或者"分布式配置文件"),全称是Hypertext Access(超文本入口)。提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。管理员可以通过Apache的AllowOverride指令来设
置。 概述来说,htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:
网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。
根据以上内容,假如我们自定义一个规则,并让服务器运行我们定义的规则,便可绕过上传限制

hatccess写法一
AddType application/x-httpd-php .后缀名
创建相同后缀名的一句话木马,作用就是会让这个后缀名变成php代码执行
hatccess写法二
# FileMatch 参数即为文件名的正则匹配

SetHandler application/x-httpd-php

2.3.3大小写饶过

strtolower()如果没用存在这个函数就如使用大小饶过如:
imbrave.PHP .Php .PHp 等等

2.3.4双写饶过

str_ireplace(find,replace,string,count)
find	必需。规定要查找的值。
replace	必需。规定替换 find 中的值的值。
string	必需。规定被搜索的字符串。
count	可选。一个变量,对替换数进行计数。
str_ireplace(php,"",pphphp)通常出现这个函数往往只会替换一次
pphphp 这样就会进行双写饶过  p php hp =》 中的php被替换 剩下p hp =》php    

2.3.5点号饶过,空格饶过和::$DATA饶过

.
windows有一个特性,会自动去掉后缀名最后的‘.’
或者是不存在deldot($file_name);//删除文件名末尾的点
空格
windows有一个特性,会自动去掉后缀名最后的空格
或者是不存在trim($file_name);//删除文件空格
::$DATA
操作系统必须windows且是php,中间件都可以
php在windows的时候如果文件名+"::$DATA"会把::$DATA之后的数据当成文件流处理,不会检测后缀名.且保持"::$DATA"之前的文件名

3.解析漏洞

3.1apache服务器

3.1.1apache服务器-多后缀解析漏洞

在Apache 2.0.x

如1.php.abc,因apache不识别.abc后缀,所以向前解析php
1.php.abc => 1.php
test.php.owf.rar解析成test.php

3.1.2apache服务器-CVE-2017-15715

Apache HTTPD是一款HTTP服务器,它可以通过mod_php来运行PHP网页。其2.4.0~2.4.29版本中存在一个解析漏洞,在解析PHP时,1.php\x0a将被按照PHP后缀进行解析,导致绕过一些服务器的安全策略。

如:
1.php\x0a => 1.php

复现漏洞,这边在dockerhub拉了一个镜像,代码比较简单过滤一些后缀


  


评论


亲,登录后才可以留言!