文件包含导致代码解析的原理:如php文件中包含其他文件,若其他文件中包含部分php可执行的命令,则会被执行。
可见require()和include()的区别在于require()由于程序运行立即调用,因此文件不存在必报错。
文件包含与php配置有关,其中 allow_url_fopen=on/off 是否允许打开url文件,默认是开启。因为需要远程加载js文件或者图片。 allow_url_include=on/off 是否允许引用url文件,激活以url形式fopen封装协议,可以访问url对象文件,默认是关闭的。
文件包含分为本地文件包含(占绝大多数)以及远程文件包含。
本地文件包含: 通过相对路径或者绝对路径打开并包含本地文件的漏洞。 利用条件: php配置中 allow_url_fopen=on (在php.ini文件中配置) 用户可以动态控制变量 测试1、php代码添加上”.php“之类的代码 绕过: 1、%00截断 2、输入超长字节数据,利用系统特性进行绕过(windows256字节,linux4096字节) 3、点号绕过
远程文件包含: 绕过: 1、 ?截断:在url后加上?,根据url的特性,?后面表示参数。 2、#绕过:在url后加上%23(%23是#的url编码)
测试2、若存在本地文件包含漏洞,但无法通过上传恶意php脚本、文件,如何? 解决:借助服务器已有的文件,并且能控制其输入,比如日志文件(access_log)
正常情况下,若执行命令成功,则日志会保存在目标系统的access_log文件中,若运行失败则保存在error_log文件中。尝试包含日志中的内容触发。 日志的路径在/var/log/https/access_log或者error_log
如上图,在存在文件包含漏洞的地方,通过如?filename=/var/log/httpd/access_log请求访问日志。应该注意的是,输入的url会被浏览器进行url编码,解决办法是通过bp将代码改回正常的php命令。然而发包出现400错误,因为<?php xxx ?>有空格,不过日志会正常的接收,见下图,日志文件中完整的保存了php语句,此时就可以包含该日志文件。
但正常情况下,日志文件既大并且内容杂,可能会影响php代码的执行。
测试3、伪协议
https://www.cnblogs.com/endust/p/11804767.html //伪协议的用法大全
php伪协议事实上是支持的协议与封装协议。如上图,重点使用其中的 php:// 访问各个输入/输出流。
1、file:// 由上图可见 file://协议一般情况下都可以使用,如 ?path=file://c:\windows\System32\drivers\etc\hosts 限制条件:只能使用绝对路径
2、php://filter 用途:读取php源码
如上图,该伪协议为重点使用的协议,用法如下: ?path=php://filter/read=convert.base64-encode/resource=xxxxxx.php(要读取源代码的文件)
3、php://input
用途:访问请求的原始数据的只读流,将post请求的数据作为php代码执行。 使用条件: php.ini(在/etc/php.ini)中的 allow_url_include:on 使用方法:在存在文件包含的路径下输入 ?file=php://input //在请求头中输入 php执行命令如<?php phpinfo();?> //在请求体中输入
4、data://
文件包含漏洞的常出现的点: