详解文件包含漏洞及其解决方法

详解文件包含漏洞及其解决方法

详解文件包含漏洞及其解决方法_第1张图片

1.定义:

文件包含漏洞和SQL注入等攻击方式一样,文件包含漏洞也是一种注入型漏洞,其本质就是输入一段用户能够控制的脚本或者代码,并让服务端执行。
注:(包含:程序开发人员通常会把可重复使用的函数写入到单个文件中,在使用某些函数时,直接调用此文件,而无需再次编写)例如我们在写c语言编程时的include就是个包含的应用。

2.使用条件:

(1)web使用了include等文件包含函数关联了动态变量引入包含文件
(2)用户可控制该动态变量
例如:
详解文件包含漏洞及其解决方法_第2张图片
详解文件包含漏洞及其解决方法_第3张图片
详解文件包含漏洞及其解决方法_第4张图片
详解文件包含漏洞及其解决方法_第5张图片成功打开了phpinfo.php文件。
再把后缀名改掉试试:
详解文件包含漏洞及其解决方法_第6张图片可以看到include并不受文件名局限,只要有php代码都能被解析,这就是本文要谈到的文件包含漏洞的基本原理。

3.几种基础文件包含函数:

require:当找不到目标文件时会产生致命错误
include:只会产生警告
highlight_file/show_source:将文件内容以代码高亮的方式展示在页面上的函数,输出任何可读取的PHP源代码文件,并在浏览器中以HTML格式显示它们
file_get_contents(文件名):将文件读入到一个字符串中
file_put_contents(文件名,文件内容):将字符串写入文件。文件不存在时会自动创建(可远程主动添加木马)

4.文件包含漏洞分类:

(1)本地文件包含漏洞(LFI)
(2)远程文件包含漏洞(RFI):被包含的文件源从外部输入流得到,可从include/require加载远程文件。(说人话就是可以加载远程文件)

5.RFI漏洞使用条件:

(1)php.ini中设置的allow_url_include为on(一般需要的另一个设置allow_url_fopen默认是on)
(2)使用了 G E T / _GET/ GET/_POST
注:包含远程php文件时,远程服务器会解析php,故写入一句话木马时建议使用.txt文件

6.php伪协议:

详解文件包含漏洞及其解决方法_第7张图片
(1)php://input用于执行php代码
    php://filter用于读取源码
(2)为什么php://input可以用于执行php代码?
 答:该伪协议与http协议类似,可以使用post请求,它通过输入流方式获取post请求的原始数据(get请求不行)。
 补充:与$_POST的区别是,它可以获取到未经php处理的原始数据,这使得它可以对任一格式(不再限于php)的数据操作。而$_POST会进行php处理后以关联数组的形式存储。
(3)另外要注意的是当enctype="multipart/form_data"时,php://input是无法使用的。(application/x-www-form-urlencoded是默认值,作用是设置表单传输的编码。而multipart/form-data是用来制定传输数据的特殊类型的,主要就是我们上传的非文本的内容,比如图片或是是mp3等等)
(4)
eg1远程打开phpinfo:
……/?file=php://input
POST传参:

eg2写入木马:
……/?file=php://input
POST传参:');?>

eg3读取网页源码:
……/?file=php://filter/read=convert.base64-encode/resource=flag.php(目标文件)
补充:为什么使用base64编码? 答:安全,传输快,不易损坏
(5)看到file_get_contents就要考虑php://input绕过

7.例题:攻防世界fileclude

8.漏洞的解决:

(1)永远不要信任用户输入 - 在使用文件包含函数时,不要直接使用用户提供的数据作为参数,以避免黑客通过构造特殊的请求来绕过检查而控制系统。
(2)使用白名单 - 确定可包含文件的列表,并仅允许在这些文件中进行文件包含操作。
对输入进行过滤和验证 - 将使用正则表达式等工具对输入进行解析和过滤,去除有害字符,只保留必要的信息。
(3)更改应用程序的默认配置 - 禁止使用php.ini配置文件中支持动态文件包含的选项(allow_url_include)以及废弃选项(register_globals, magic_quotes_gpc等)。
(4)使用安全的文件包含函数 - PHP7.2及以上版本提供了新的opcache_compile_file函数,该函数在打开文件之前将其编译成字节码并缓存,从而防止了文件包含漏洞的出现。




写在最后:不知道为啥最近攻防世界开启环境总是出错,所以就不写文中例题的wp了。最后还是真诚地感谢你能阅读本文。

你可能感兴趣的:(php,开发语言)