文件上传漏洞是指攻击者上传一个可执行脚本文件,并通过该脚本文件获得执行服务器端命令的能力。 该漏洞大概率出现在业务应用系统中。 原因是上传附件、头像等功能在业务场景中非常常见。 如果系统设计时忽视相关的安全检测,很容易造成文件上传漏洞。
业务应用系统中的文件上传功能是导致上传漏洞的重要安全风险之一。 通过文件上传功能,用户可以直接将本地文件上传到服务器。 如果通过构造URL地址可以直接访问上传的文件,就会触发该漏洞。 例如,如果上传的文件是可以直接执行服务前端代码的异常服务器端文件,如JSP文件、ASP文件、ASPX文件、JSPX文件、PHP文件等,则该文件实际上可以看作是“木马文件”。
程序开发中缺乏严格或不安全的逻辑问题会导致文件上传漏洞。 程序开发时使用的编程语言和版本、使用的操作系统以及不同的应用场景也可能导致文件上传漏洞。 因此,文件上传漏洞的表现方法与其产生的原因密切相关。
通过利用文件上传漏洞,攻击者可以获得业务信息系统的WebShell,并通过WebShell进一步对业务系统和服务器自身操作系统进行操作,如减少、删除、修改、查看文件等敏感操作。 因此,文件上传漏洞比其他文件类型的漏洞危害更大。
形成原因
某些 Web 应用程序允许将图像、文本或其他资源上传到指定位置。 文件上传漏洞是依靠那些允许上传的地方向服务器植入恶意代码,然后通过URL访问执行代码。
文件上传漏洞产生的原因有:
• 服务器配置不当 • 开源编辑器上传漏洞 • 绕过本地文件上传限制 • 绕过缺乏严格过滤 • 文件解析漏洞导致文件执行 • 文件路径截断
漏洞危害
•上传的文件是网页脚本语言。 服务器的Web容器解释并执行用户上传的脚本,从而导致代码执行。 •上传的文件为病毒或木马时,主要用于引诱用户或管理员下载执行或直接自动运行; •上传的文件是Flash的策略文件crossdomain.xml,黑客利用该文件来控制Flash在本域中的行为(类似方法控制的其他策略文件情况类似);•上传的文件是病毒或木马文件,黑客用来引诱用户或管理员下载并执行;•上传的文件是钓鱼图片或包含脚本的图片。 某些版本的浏览器可能作为脚本执行并用于网络钓鱼和欺诈。 另外,还有一些不常见的使用方式,比如以上传的文件为入口来溢出服务器的后台处理程序,比如图像解析模块; 或上传内容包含 PHP 脚本的合法文本文件。 然后通过“LocalFileInclude”执行这个脚本。
审核要点
代码审计检测上传漏洞时,首先需要判断上传功能代码是否对上传文件进行了校准。 如果没有校准,就会存在任意文件上传漏洞,但危险程度仍需进一步确定。 (需要检测这里上传的文件是本地还是远程,是否有脚本执行权限或者环境支持等。现在很多程序都会将附件上传到远程OSS对象进行存储。)
如果代码具有文件校准功能,则需要验证文件校准代码是否健全。 您可以从后端和前端两个方面来分析校准的完整性。
•后端校准:主要分析JavaScript对上传文件扩展名校准的完整性 •前端校准:主要分析黑名单扩展拦截、白名单扩展拦截、HTTPHeader的Content-Typ验证、文件头验证、等几种校准方法的完整性作为二次渲染验证和文件名随机化。
总结一下审核要点:找到上传点,检查后缀名是否可以自定义,如果设置了防御,是否可以绕过; 文件内容是否经过校准,是否可以绕过校准; 是否检测到文件类型; 文件上传路径是否可控; 文件目录是否需要严禁脚本解析等
image-20220114170830584防御建议
后端防御主要采用后端标定,利用JavaScript来检查文件大小、扩展名等。前端标定是防御的核心。 主要是禁止解析上传的文件目录。 上传的文件是随机的,并检测后缀名。 设置文件后缀白名单。 (使用PHP的in_array函数检查后缀名时,注意设置该函数,第三个参数为true,否则可利用该函数的缺陷来绕过检查)并测量文件内容、大小和类型等。
实验范围备注:
我使用的射击场是c0ny1制作的upload_labs。 我当时下载的是旧版本,只有20个关卡。 新版本有21个关卡,并插入了新的Pass-5。 使用的解决方案是上传.user.ini。 我在这里使用的解决方案是 SUCTF Web 问题。
射击场项目地址:
客户端检查绕过
通常会在网页上编写JavaScript脚本来校准上传文件的后缀。 有白名单和黑名单方法。 判断方法:浏览加载文件时,点击上传按钮之前,弹出对话框,内容如:只允许上传.jpg/.jpeg/.png后缀的文件,但不允许上传数据包此时发送。
绕过后端检查的方法很简单,这里就不详细解释了。 有几种方法可以绕过它:
1、使用Maxthon NOscript插件或禁用IE中的JS脚本; 2、通过元素审核更改代码(如删除onsubmit="returncheckFile()"事件); 3、通过element review将上传文件类型添加到javascirpt脚本中; 4.利用burp抓包改包php 重命名文件,先上传一个png类型的木马,然后通过burp改成asp/php/jsp后缀。 注意:此处更改文件名后,请更改标头中的Content-Length。 该值也需要更改(burp默认会手动更改)。
射击场旁路示例
范围:上传实验室 (Pass-01)
当我们想要上传Webshell时,发现后端弹出了报警窗口。
PS:文中的hackroot.com是本地分析的原型,不是在线射击场!
图片-20220114174620484
审核源代码,其中包含一段测量文件扩展名的 JavaScript 代码。
<script type="text/javascript">
function checkFile() {
var file = document.getElementsByName('upload_file')[0].value;
if (file == null || file == "") {
alert("请选择要上传的文件!");
return false;
}
//定义允许上传的文件类型
var allow_ext = ".jpg|.png|.gif";
//提取上传文件的类型
var ext_name = file.substring(file.lastIndexOf("."));
//判断上传文件类型是否允许上传
if (allow_ext.indexOf(ext_name) == -1) {
var errMsg = "该文件不允许上传,请上传" + allow_ext + "类型的文件,当前文件类型为:" + ext_name;
alert(errMsg);
return false;
}
}
绕过方法:
首先修改webshell的扩展名为.png并启用Burp代理抓包
图片-20220114193528473
将文件扩展名更改回 .php 并释放它。
图片-20220114193725219
检查页面元素并成功上传
image-20220114193848432 服务器端黑名单检查绕过扩展黑名单绕过
黑名单检查:通常有一个特殊的黑名单文件,或者黑名单链表,其中包含常见的危险脚本文件扩展名。
绕过方法:
•寻找黑名单扩展来溜过:如iis6.0中的asa、cer •可能存在大小写绕过漏洞:如asp(可在iis6.0中使用)、pHp(只能在大于php5的文件中使用) .3.39) linux) • 可以由 Web 容器解析的其他文件扩展名列表:
语言
可解析后缀
ASP/ASPX
asp、aspx、asa、ascx、ashx、asmx、cer、cdx
PHP
php、php5、php4、php3、phtml、pht
联合应用程序
jsp、jspx、jspa、jsw、jsv、jspf、jtml
射击场旁路示例
范围:上传实验室(Pass-03)
当我们要上传Webshell时,提示不允许上传.asp、.aspx、.php、.jsp后缀文件。
图片-20220115000355619
审核源代码。 其中一节使用in_array函数判断上传文件的扩展名是否存在于指定的扩展名黑名单中。
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
if (file_exists(UPLOAD_PATH)) {
$deny_ext = array('.asp','.aspx','.php','.jsp');
$file_name = trim($_FILES['upload_file']['name']);
$file_name = deldot($file_name);//删除文件名末尾的点
$file_ext = strrchr($file_name, '.');
$file_ext = strtolower($file_ext); //转换为小写
$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
$file_ext = trim($file_ext); //收尾去空
if(!in_array($file_ext, $deny_ext)) {
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;
if (move_uploaded_file($temp_file,$img_path)) {
$is_upload = true;
} else {
$msg = '上传出错!';
}
} else {
$msg = '不允许上传.asp,.aspx,.php,.jsp后缀文件!';
}
} else {
$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
}
}
绕过方法:
我们可以尝试使用PHP的其他扩展来绕过,比如phtml
图片-20220116210405949
注意:PHPStudy环境默认不会解析phtml、php3等扩展文件。 如果要实验成功,需要自动添加到http.conf配置文件中。
image-20220116210308493 上传.htaccess文件以绕过
.htaccess文件的作用:
.htaccess 是一个纯文本文件php 重命名文件,存储与 Apache 服务器配置相关的指令。
.htaccess的主要功能包括:URL重绘、自定义错误页面、MIME类型配置、访问控制等。 主要表现在伪静态应用、图片盗链防护、自定义404错误页面、阻止/允许特定IP/IP段、目录浏览和主页、禁止访问指定文件类型、文件密码保护等。
.htaccess的使用范围主要针对当前目录。
启用 .htaccess 配置:
要启用.htaccess,您需要更改httpd.conf,启用AllowOverride,并使用AllowOverride限制特定命令的使用。