pikachu--file include

web安全

实验报告

 

实验四

file include

 

 

 

学生姓名

涂君奥

年级

2017级

区队

 实验班

指导教师

 高见

1.概述

1.1简介

在 Web 后台开发中,程序员往往为了提高效率以及让代码看起来更加简洁,会使用 “包含” 函数功能。比如把一系列功能函数都写进 function.php 中,之后当某个文件需要调用的时候直接在文件头中写上一句 就可以调用函数。

但有些时候,因为网站功能需求,会让前端用户选择需要包含的文件(或者在前端的功能中使用了“包含”功能),又由于开发人员没有对要包含的这个文件进行安全考虑,就导致攻击者可以通过修改文件的位置来让后台执行任意文件(代码)。

分为 本地文件包含 和 远程文件包含 两种。

pikachu--file include_第1张图片

1.2.包含函数

通过 include() 或者 require() 语句,可以将 PHP 文件的内容插入另一个 PHP 文件(在服务器执行它之前)

include 和 require 是相同的,除了错误处理方面:

  • require 会生成致命错误( E_COMPILE_ERROR )并停止脚本
  • include 只生成警告( E_WARNING ),并且脚本会继续

pikachu--file include_第2张图片

2.本地文件包含--file inclusion(local)

我们在 pikachu 平台上先对本地文件包含进行测试

 

 pikachu--file include_第3张图片

 

 

 

 

 

可以看到是 传了一个文件名到后台,后台会指定的目标文件进行对应的操作(这些文件都是后台自己存在的文件)

如果目标服务器在 Linux 上,我们可以 “../” 的方式进行目录跳转,读取其他目录下的文件,比如 /etc/passwd 

../../../../../../../../etc/passwd

Windows 也可以用类似的方式

../../../../Windows/System32/drivers/etc/hosts

 

 pikachu--file include_第4张图片

 

 

 

File Inclusion(remote)

 

3.远程文件包含

 

前提

 

远程文件包含漏洞形式和本地文件包含漏洞差不多,在远程文件包含漏洞中,攻击者可以通过访问外部地址来加载远程代码

 

远程包含漏洞前提:如果使用 includer 和 require ,则需要 php.ini 配置如下

 

allow_url_fopen = on
allow_url_include = on

远程文件包含这里,同样是通过传递一个文件名进行包含的

 

 pikachu--file include_第5张图片

 

 

 

 

我们把它改成一个攻击者服务器上的恶意代码。

新建一个 richard.txt,输入下面的内容, 启动 apache 服务

 
';
fwrite($myfile, $txt);
fclose($myfile);

?>
复制代码

 

 pikachu--file include_第6张图片

 

 

 

这时候我们就可以利用我们上传的 php 文件进行相关的操作

防范措施

一般只有文件包含漏洞或者文件上传漏洞是比较难利用的。但如果存在着两个漏洞则可以配合使用。

如果服务器仅仅只允许上传图片,我们可以尝试用图片木马的方式绕过检查机制

  • 制作一个图片木马,通过文件上传漏洞上传
  • 通过文件包含漏洞对该图片木马进行“包含”
  • 获取执行结果

防范措施

      • 在功能设计上尽量不要将文件包含函数对应的文件放给前端选择和操作
      • 过滤各种 ../../,http://,https://
      • 配置 php.ini 配置文件
        • allow_url_fopen = off
        • allow_url_include = off
        • magic_quotes_gpc = on
      • 通过白名单策略,仅允许包含运行指定的文件,其他的都禁止

        二:文件下载

        不安全的文件下载概述文件下载功能在很多web系统上都会出现,一般我们当点击下载链接,便会向后台发送一个下载请求,一般这个请求会包含一个需要下载的文件名称,后台在收到请求后 会开始执行下载代码,将该文件名对应的文件response给浏览器,从而完成下载。 如果后台在收到请求的文件名后,将其直接拼进下载文件的路径中而不对其进行安全判断的话,则可能会引发不安全的文件下载漏洞。
        此时如果 攻击者提交的不是一个程序预期的的文件名,而是一个精心构造的路径(比如../../../etc/passwd),则很有可能会直接将该指定的文件下载下来。 从而导致后台敏感信息(密码文件、源代码等)被下载。所以,在设计文件下载功能时,如果下载的目标文件是由前端传进来的,则一定要对传进来的文件进行安全考虑。 切记:所有与前端交互的数据都是不安全的。

      • 点击任意一个图片即可下载
      • pikachu--file include_第7张图片
      • pikachu--file include_第8张图片

         

         

      •  查看下载图片链接

      •  

      • pikachu--file include_第9张图片

          

      •  

      • 在文件里存入一个hello.txt
      • pikachu--file include_第10张图片

         

         

        故可构造和文件包含一样的payload

        127.0.0.1:10000/pikachu/vul/unsafedownload/execdownload.php?filename=hello.txt 

        文件即可成功下载:

      • pikachu--file include_第11张图片

         

         

        文件上传

        不安全的文件上传漏洞概述文件上传功能在web应用系统很常见,比如很多网站注册的时候需要上传头像、上传附件等等。当用户点击上传按钮后,后台会对上传的文件进行判断 比如是否是指定的类型、后缀名、大小等等,然后将其按照设计的格式进行重命名后存储在指定的目录。 如果说后台对上传的文件没有进行任何的安全判断或者判断条件不够严谨,则攻击着可能会上传一些恶意的文件,比如一句话木马,从而导致后台服务器被webshell。所以,在设计文件上传功能时,一定要对传进来的文件进行严格的安全考虑。比如:
        --验证文件类型、后缀名、大小;
        --验证文件的上传方式;
        --对文件进行一定复杂的重命名;
        --不要暴露文件上传后的路径;

        1.client check

      • 显示只能上传图片

 

      • 首先尝试随便上传一个文件hello.php,发现网页拒绝上传

      • pikachu--file include_第12张图片

 

      •  开始观察前端

      • pikachu--file include_第13张图片

         前端做的限制只是辅助作用,是可以绕过的。可以先将php文件后缀改成jpg,通过前端验证后把数据包拦截下来,修改成php再上传。

      • 先将test.php改名成test.jpg成功通过前端验证并拦截:
      • pikachu--file include_第14张图片

         

      • 再将test.jpg修改成test.php并forward

        pikachu--file include_第15张图片

          成功上传

      • 2.MIME type

          • MIME

            MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问时,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。

            每个MIME类型由两部分组成,前面是数据的大类别,例如声音audio、图象image等,后面定义具体的种类。常见的 MIME 类型,比如:

            • 超文本标记语言:.html,.html text.html
            • 普通文件:.txt text/plain
            • RTF文件:.rtf application/rtf
            • GIF图形:.gif image/gif
            • JPEG图形:.jpeg,.jpg image/jpeg

            $_FILES()函数

            它从浏览器的HTTP头里获取 Content-Type ,这个 Content-Type 前端用户是可以控制的

            通过使用 PHP 的全局数组 $_FILES,你可以从客户计算机向远程服务器上传文件

            第一个参数是表单的 input name,第二个下标可以是 “name”,“type”,“size”,“tmp_name” 或 “error”,就像这样:

            • $_FILES['file']['name']:被上传文件的名称
            • $_FILES['file']['type']:被上传文件的类型
            • $_FILES['file']['size']:被上传文件的大小
            • $_FILES['file']['tmp_name']:存储在服务器的文件的临时副本的名称
            • $_FILES['file']['error']:由文件上传导致的错误代码
            • 还是拿之前那个hello.php上传 
            • 下面通过 BurpSuite 修改请求头
            • pikachu--file include_第16张图片

              pikachu--file include_第17张图片

               成功上传

            • pikachu--file include_第18张图片

            • 3.getimagesize

              getimagesize() 返回结果中有文件大小和文件类型,如果用这个函数来获取类型,从而判断是否是图片的话,会存在问题。

              它读取目标文件的 16 进制的头几个字符串,看符不符合图片要求,固定的图片文件前面几个字符串是一样的

              但是图片头可以被伪造,因此还是可以被绕过

              CMD命令直接伪造头部GIF89A:copy /b a.jpg + hello.php a.png

            • pikachu--file include_第19张图片
            •  上传这个

              a.png

            • pikachu--file include_第20张图片
            • 但是访问这个图片,恶意代码是不会被执行的。我们可以结合本地文件包含漏洞进一步利用,猜测上传图片所在的位置

            • http://127.0.0.1:10000/pikachu/vul/fileinclude/fi_local.php?filename=../../unsafeupload/uploads/2019/12/22/3531405dfeddeada251144011601.png&submit=Submit+Query

              pikachu--file include_第21张图片

你可能感兴趣的:(pikachu--file include)