PHP代码审计:文件上传漏洞

淺唱寂寞╮ 提交于 2019-12-02 06:38:57

当你的才华

还撑不起你的野心时

那你就应该静下心来学习


 

       代码审计学习线上实验,都是CE一边实操,一边整理的笔记,方便以后翻看时,可快速查阅。

目录

文件上传漏洞

简介

实例

文件上传漏洞防御


文件上传漏洞

        文件上传漏洞是一个危害巨大的漏洞,通过上传WebShell更是将这种漏洞的危害无限扩大。攻击者在受影响系统放置或者插入WebShell后,可通过该WebShell更轻松,更隐蔽的在服务中为所欲为。

简介

       文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。 文件上传漏洞大多是没有限制上传的文件格式,导致可以直接上传危险文件,并且部分文件上传漏洞的利用技术门槛非常的低,对于攻击者来说很容易实施。

PHP文件上传相关函数: move_uploaded_file()

move_uploaded_file(file,newloc):

   move_uploaded_file() 函数将上传的文件移动到新位置, 若成功,则返回 true,否则返回 false

 参数   描述
file   必需。规定要移动的文件
newloc 必需。规定文件的新位置。

实例

       未对上传文件格式进行限制,则可以上传危险文件

upload.php

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>文件上传</title>
  5. </head>
  6. <meta charset="utf-8">
  7. <body>
  8. <form action="" enctype="multipart/form-data" method="POST" name="uploadfile">
  9. 请上传图片: <input type="file" name="upfile" />
  10. <input type="submit" value="上传" name="submit">
  11. </form>
  12. <br />
  13. </body>
  14. </html>
  15. <?php
  16. if (isset($_POST['submit'])) {
  17. echo "文件名:".$_FILES['upfile']['name']."<br />";
  18. if ($_FILES['upfile']['error'] == 0) {
  19. $dir = "./upload/".$_FILES['upfile']['name'];
  20. move_uploaded_file($_FILES['upfile']['tmp_name'],$dir);
  21. echo "文件保存路径:".$dir."<br />";
  22. echo "上传成功...<br />";
  23. }
  24. }
  25. ?>

主要关键代码:

可以看到未对用户上传的文件做任何校验。

注意:这里需要先给upload文件分配权限(命令:chmod 755 upload)

http://192.168.161.133/fileupload/upload.php

成功打开页面尝试上传其他文件。 新建文件phpinfo.php,并输入内容:

  1. <?php
  2. phpinfo();
  3. ?>

上传phpinfo.php 文件

成功看到.php格式的文件被上传

根据页面返回的路径,尝试执行phpinfo.php: 输入url:192.168.161.133/fileupload/upload/phpinfo.php : 

成功执行了phpinfo.php文件中的代码,这就是一次常见的文件上传漏洞利用实例

 

文件上传漏洞防御

文件上传漏洞攻击要实现,一般来说需要满足以下条件:

  • 上传的文件能够被Web容器解释执行。

  • 用户能够从Web上访问这个文件。

  • 用户上传的文件若被安全检查、格式化、图片压缩等功能改变了内容,则也可能导致攻击不成功。

防御文件上传漏洞,可以从以下几点入手:

  • 1、文件上传的目录设置为不可执行
      只要web容器无法解析该目录下面的文件,即使攻击者上传了脚本文件,服务器本身也不会受到影响,因此这一点至关重要
    
  • 2、判断文件类型
    1. 在判断文件类型时,可以结合使用MIMEType、后缀检查等方式
    2. 在文件类型检查中,强烈推荐白名单方式,黑名单的方式已经无数次被证明是不可靠的
    3. 此外,对于图片的处理,可以使用压缩函数或者resize函数,在处理图片的同时破坏图片中可能包含的HTML代码
  • 3、使用随机数改写文件名和文件路径
    1. 文件上传如果要执行代码,则需要用户能够访问到这个文件
    2. 在某些环境中,用户能上传,但不能访问
    3. 如果应用了随机数改写了文件名和路径,将极大地增加攻击的成本
    4. 再来就是像shell.php.rar.rarcrossdomain.xml这种文件,都将因为重命名而无法攻击。
  • 4、单独设置文件服务器的域名
    1. 由于浏览器同源策略的关系,一系列客户端攻击将失效,比如上传crossdomain.xml、上传包含Javascript的文件上传利用
    2. 等问题将得到解决

上一节的例子中,之所以会造成文件上传漏洞,究其原因还是未对用户的输入文件进行过滤。 像上个页面中,如果限制用户输入文件为图片类型,就可以避免这种攻击的发生。

查看修改之后的代码 upload_filter.php关键代码:

使用switch函数对上传文件格式做了判断。

  1. <?php
  2. if (isset($_POST['submit'])) {
  3. echo "文件名:".$_FILES['upfile']['name']."<br />";
  4. switch ($_FILES['upfile']['type']) {
  5. case 'image/jpeg':
  6. $flag = 1;
  7. break;
  8. default:
  9. die("上传失败,请确保文件格式为图片.....");
  10. break;
  11. }
  12. if ($_FILES['upfile']['error'] == 0) {
  13. $dir = "./upload/".$_FILES['upfile']['name'];
  14. move_uploaded_file($_FILES['upfile']['tmp_name'],$dir);
  15. echo "文件保存路径:".$dir."<br />";
  16. echo "上传成功...<br />";
  17. }
  18. }
  19. ?>

再上传phpinfo.php,发现上传不成功

再来试试修改目录权限的方法: 到Web相应目录下执行以下命令:sudo chmod -x upload

将upload目录设置为不可执行,再尝试加载之前上传的phpinfo.php: 

      提示没有执行权限,所以这也是一种有效防御文件上传漏洞的方法。 当然,攻击与防御总是相对的,我们这里做了简单的过滤,攻击者也会有很多上传绕过的方法


我不需要自由,只想背着她的梦

一步步向前走,她给的永远不重


 


当你的才华

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!