文件包含(大纲)

文件包含(总结or大纲)

导致原因

include(),include_once(),require(),require_once(),fopen(),readfile()

使用前4个函数包含新的文件时,只要文件内容包含符合php语法规范,任意扩展名都可以被php解析,当包含非php语法规范时,将会暴露其源代码。后两个函数会造成敏感文件读取。

如何利用:

  1. include()等函数通过动态变量的方式引入需要包含的文件。
  2. 攻击者可以控制该动态变量。

总的来说,就是有可以传入include()等函数的可控变量。

本地文件包含

ex:

<?php
$file=$_GET['file'];
if(file_exists('/home/wwwrun'.$file.'cat'));
include '/home/wwwerun'.$file.'.cat';
?>
  1. 在以上代码中,假设构造http://123123/?file=../../flag,经过上面的代码后则变为,include '/home/wwwrun/../../flag.cat',flag.cat这个文件是不存在的,所以无法读取,但如果构造成?file=../../flag%00,则可以读取。

原理:php内核由c语言实现,所以使用了c语言的一些字符串处理函数。在c语言中,0字节为字符串结束符,所以在后面加入0字节可以截断flag后面的字符串,代码变成'/home/wwwrun/../../flag\0cat',由于\0时字符串已经结束,则include()函数不读取cat。

  1. 而因为url不支持\,所以通过urlencode编码,变成%00。

同时,由代码看出路径会跳到/home/wwwrun下,可以使用../../跳出目录

原理:在文件系统中,../ 是用于表示上级目录的相对路径符号。当在文件路径中使用 ../ 时,实际上是在告诉系统向上跳转到上一级目录。因此,连续使用 ../ 就可以一级一级地向上跳转,直到达到所需的目录位置。

远程文件包含漏洞

如果php配置选项allow_url_include为ON,则include与require函数都可以加载远程漏洞,这种漏洞被称为远程文件包含漏洞

ex:

<?php
$param=$_GET['param'];
require_once $param.'/cat';

同样如果构造http://123123/?param=http://123456/flag,txt,经过代码会变为

require_once http://123456/flag.txt/cat

相同这也可以使用%00来截断。

远程和本地的区别

本地文件包含漏洞是加载服务器本地的文件,远程文件包含是加载一个远程的资源,比如使用http协议加载远程文件。

posted @ 2024-03-03 20:21  follycat  阅读(3)  评论(0编辑  收藏  举报