文件包含漏洞

文件包含漏洞

1.什么是文件包含漏洞:

​ 文件包含是一种注入型漏洞,其本质就是输入一段用户能够控制的脚本或者代码,并让服务端执行。

​ 跟python类似,我们再编写python的时候,很多时候会编写相关的函数,然后用来调用这个函数;但是,当函数之间存在联系,并且函数量比较多的时候,我们通常就会讲这些函数封装到一个专属的py文件中,之后作为模块导入即可使用;在PHP中也一样,有的时候,为了降低单个文件的代码量,使得看起来这个代码更加简洁,等等各种原因,更加便于后期管理,这个时候就需要根据情况引用相应的PHP文件,然而这个引入的文件是用户可控的,并且网站对这些文件名的过滤不严格,这个时候就产生了文件包含漏洞。

​ PHP中存在的文件包含的函数常见的有四个:

require()								//找不到被包含的文件会产生致命错误,并停止脚本运行
include()								//找不到被包含的文件只会产生警告,脚本继续执行
require_once()							//与require()类似:唯一的区别是如果该文件的代码已经被包含,则不会再次包含
include_once()							//与include()类似:唯一的区别是如果该文件的代码已经被包含,则不会再次包含
fopen()									//打开一个文件

​ 假设给文件a.php写入:


include($_GET["file"]);
?>

​ 同时给文件b.php写入:


phpinfo();
?>

​ 这个时候如果在网站上尝试在a.php中传入b.php就会出现phpinfo的内容,并且,无论包含的文件是什么类型的,都会被解析出来,就算传入的是b.jpg,只要存在php代码,就会被当作php脚本执行。

2.环境需求:

  • allow_url_fopen=On(默认为On) 规定是否允许从远程服务器或者网站检索数据
  • allow_url_include=On(php5.2之后默认为Off) 规定是否允许include/require远程文件

3.一些伪协议:

1).php://input:

php://input可以访问请求的原始数据的只读流,将post请求的数据当作php代码执行。当传入的参数作为文件名打开时,可以将参数设为php://input,同时post想设置的文件内容,php执行时会将post内容当作文件内容。从而导致任意代码执行。

​ 不过这种伪协议要使用的条件比较苛刻,一般的题目中是不会开启这个条件的,

​ allow_url_include = On。

​ 对allow_url_fopen不做要求。

2).php://filter:

​ php://filter是一种元封装器,设计用于"数据流打开"时的"筛选过滤"应用。这对于一体式(all-in-one)的文件函数非常有用,类似readfile()、file()、file_get_contens(),在数据流内容读取之前没有机会应用其他过滤器,此类伪协议在文件包含漏洞的考察中很常见。

​ 使用格式:?file=php://filter/convert.base64-encode/resource=flag.php

3).phar://:

​ 搭配phar反序列化使用,具体操作反序列化具体再进行操作。

4).data://:

具体用法:

?file=data://text/plain;base64,SSBsb3ZlIFBIUAo=

?file=data://text/plain,

示例:

if(isset($text)&&(file_get_contents($text,'r')==="I have a dream")){
    echo "

".file_get_contents($text,'r')."


"
; } 基本思路:if判断,需要传入文件变量为text,且要求文件内容为I have a dream。此时,就可以使用data协议上传内容(注意基本需求条件:php>5.2.0,all_url_include=on).也可以考虑使用php://input,只要能上传都可以 payload: ?text=data://text/plain;base64,SSBoYXZlIGEgZHJlYW0= 注:“SSBoYXZlIGEgZHJlYW0=” 为 “I have a dream”的base64编码

你可能感兴趣的:(web安全)