赞
踩
文件包含漏洞和SQL注入等攻击方式一样,文件包含漏洞也是一种注入型漏洞,其本质就是输入一段用户能够控制的脚本或者代码,并让服务端执行。
注:(包含:程序开发人员通常会把可重复使用的函数写入到单个文件中,在使用某些函数时,直接调用此文件,而无需再次编写)例如我们在写c语言编程时的include<stdio.h>就是个包含的应用。
(1)web使用了include等文件包含函数关联了动态变量引入包含文件
(2)用户可控制该动态变量
例如:
成功打开了phpinfo.php文件。
再把后缀名改掉试试:
可以看到include并不受文件名局限,只要有php代码都能被解析,这就是本文要谈到的文件包含漏洞的基本原理。
require:当找不到目标文件时会产生致命错误
include:只会产生警告
highlight_file/show_source:将文件内容以代码高亮的方式展示在页面上的函数,输出任何可读取的PHP源代码文件,并在浏览器中以HTML格式显示它们
file_get_contents(文件名):将文件读入到一个字符串中
file_put_contents(文件名,文件内容):将字符串写入文件。文件不存在时会自动创建(可远程主动添加木马)
(1)本地文件包含漏洞(LFI)
(2)远程文件包含漏洞(RFI):被包含的文件源从外部输入流得到,可从include/require加载远程文件。(说人话就是可以加载远程文件)
(1)php.ini中设置的allow_url_include为on(一般需要的另一个设置allow_url_fopen默认是on)
(2)使用了
G
E
T
/
_GET/
GET/_POST
注:包含远程php文件时,远程服务器会解析php,故写入一句话木马时建议使用.txt文件
(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传参:<?php phpinfo();?>
eg2写入木马:
……/?file=php://input
POST传参:<?php foputs(fopen('shell.php','w'),'<?php @eval($_POST[x])?>');?>
eg3读取网页源码:
……/?file=php://filter/read=convert.base64-encode/resource=flag.php(目标文件)
补充:为什么使用base64编码? 答:安全,传输快,不易损坏
(5)看到file_get_contents就要考虑php://input绕过
(1)永远不要信任用户输入 - 在使用文件包含函数时,不要直接使用用户提供的数据作为参数,以避免黑客通过构造特殊的请求来绕过检查而控制系统。
(2)使用白名单 - 确定可包含文件的列表,并仅允许在这些文件中进行文件包含操作。
对输入进行过滤和验证 - 将使用正则表达式等工具对输入进行解析和过滤,去除有害字符,只保留必要的信息。
(3)更改应用程序的默认配置 - 禁止使用php.ini配置文件中支持动态文件包含的选项(allow_url_include)以及废弃选项(register_globals, magic_quotes_gpc等)。
(4)使用安全的文件包含函数 - PHP7.2及以上版本提供了新的opcache_compile_file函数,该函数在打开文件之前将其编译成字节码并缓存,从而防止了文件包含漏洞的出现。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。