包含操作,在大多数Web语言中都会提供的功能,但PHP对于包含文件所提供的功能太强大,太灵活,所以包含漏洞经常出现在PHP语言中,这也就导致了出现了一个错误现状,很多初学者认为包含漏洞只出现PHP语言之中,殊不知在其他语言中可能出现包含漏洞。这也应了一句老话:功能越强大,漏洞就越多。
包含原理:程序员开发的时候,未对包含的文件进行严格过滤,攻击者可构建自己的图片木马文件当做PHP执行。(都会被当做PHP执行)
PHP的四个文件包含函数:
include() 文件被多次包含时,会抛出错误,但不影响程序向下执行
include_once() 文件只能被包含一次,如果多次包含,则会抛出错误,但不影响程序的向 下执行。
require() 文件被多次包含时,会抛出致命性的错误,程序将终止向下执行。
require_once() 文件只能被包含一次,如果多次包含,则会抛出致命错误,程序将终止向 下执行。
本地包含漏洞和远程包含漏洞的区别:
本地包含(LFI)攻击者上传的木马图片,是在同一台服务器上。只需找到上传点,把图片木马上传到对方服务器,通过本地包含漏洞直接包含木马脚本木马就可以运行webshell。
远程包含(RFI)需要服务器,PHP关闭魔术符号,开启远程功能才行。
包含漏洞能做什么?
1.读文件;敏感信息泄露:有特殊字符一定要转化为base64编码
2.写文件;命令执行;注意:只有在allow _url_include为on的时候才可以使用,在C:\php\php- 5.2.14-Win32下找到php.ini打开,查找disable_functions =proc- open,oppen,exec,system…….删掉system重启apache
http://192.168.1.55:8080/dvwa/vulnerabilities/fi/?page=php://input,并且提交post数 据包为:<?php system('net user');?>
3.获取webshell
绕过方法
1.不同协议绕过:http、https、file 协议、PHP 协议、ssh2
2.阶段包含(%00)这种方法只适用于 magic_quotes_gpc=off 的时候,PHP 老版本中也存在 其他漏洞
3.包含日志文件:\log\.access.log
防御方法
1.严格判断包含中的参数是否外部可控,因为文件包含漏洞利用成功与否的关键点就在于被包含的文件是否可被外部控制;
2.路径限制:限制被包含的文件只能在某一文件内,一定要禁止目录跳转字符,如:“../”;
3.包含文件验证:验证被包含的文件是否是白名单中的一员;
4.尽量不要使用动态包含,可以在需要包含的页面固定写好,如:include('head.php')。