目录
原理
文件包含:为了更好地使用代码重用性,引入了文件包含函数,可以通过文件包含函数将文件包含进来,直接使用包含文件的代码
原因:在包含文件时候,为了灵活包含文件,将被包含文件设置为变量,通过动态变量来引入需要包含的文件时,用户可以对变量的值可控而服务器端未对变量值进行合理地校验或者校验被绕过,这样就导致了文件包含漏洞。通常文件包含漏洞出现在PHP语言中。
文件包含函数:
include include_once //_once 在于重复调用同一文件时,程序只会调用一次 require require_once include和require区别: 发生错误时,include会发出警告后继续执行,而require会直接终止程序 hightlight_file //读取文件 show_source //查看文件隐式代码信息 readfile //读取文件 file_get_contents //读取文件 fopen //读取文件 file //读取文件
文件包含漏洞类型:
本地文件包含
远程文件包含:同过url包含文件
两个重要参数:
allow_url_fopen:为on时,能读取远程文件,例如:file_get_contents()就能读远程文件 allow_url_include:为on时,就可使用include和require等方式包含远程文件
文件包含漏洞地利用方式——伪协议
协议 | php版本要求 | allow_url_fopen | allow_url_include | 用法 |
---|---|---|---|---|
file:// | >=5.2 | off/on | off/on | ?file=file://D:/soft/phpStudy/WWW/phpcode.txt |
php://filter | >=5.2 | off/on | off/on | ?file=php://filter/read=convert.base64-encode/resource=./index.php |
php://input | >=5.2 | off/on | on | ?file=php://input [POST DATA] <?php phpinfo()?> |
zip:// | >=5.2 | off/on | off/on | ?file=php://D://soft/phpStudy/WWW/file.zip%23phpcode.txt |
compress.bzip2:// | >=5.2 | off/on | off/on | ?file=compress.bzip2://D:/soft/phpStudy/WWW/file.bz2或者?file=compress.zlib://.file.bz2 |
compress.zlib:// | >=5.2 | off/on | off/on | ?file=compress.zlib://D://soft/phpStudy/WWW/file.gz或者?file=compress.zlib://./file.gz |
data:// | >=5.2 | on | on | ?file=data://text/plain,<?php phpinfo()?>或者?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=或者?file=data:text/plain,<?php phpinfo()?>或者?file=data:text/plain:base64,PD9waHAgcGhwaW5mbygpPz4= |
phar:// | >=5.2 | off/on | off/on | ?file=phar://xxx.png/shell.php |
其他方式:
-
%00截断,“ ”字符,可以注释掉后面地内容
例如:
<?php $file=$_GET[file].'.php'; include($file); ..... ?>
这里文件包含限制了文件格式,只能是.php文件,可以通过%00截断:?file.txt%00
lfi-labs1
查看页面源代码,这个的参数是page
查看index.php代码
并没有进行任何过滤。我们可以通过通过对变量page进行传参,查询想要的文件
例如:
这里查询的是C盘下的flag.txt文件(自己创建的)
lfi-labs2
和lfi-labs1同理,要先确定参数,library
查看源代码:
源代码显示查询的是includes下的文件,且带有文件后缀.php只能查询php文件。
解决方法:
1.使用相对路径
2.用%00截断,注释掉.php。但是%00截断仅用在php版本低于5.3.4,magic_quotes_gpc=off环境下。
这里查询的c盘下的flag.php文件。
lfi-labs3
试一下2关的方法
题目进行了过滤,查看源代码:
根据源代码了解,对输入的参数进行了判断,参数的后4个字符不能是.php,否则会显示“You are not allowed to see source files!”。
解决办法:
在flag.php后面加"."或者"%00"。
这样substr截取时,截取的时php.或php 而不是.php。而.和 在查询时会被自动剔除(不符合命名规则)
查看页面源代码(包含文件函数不同):
lfi-labs4
源代码:
addslashes()函数:返回在预定义字符之前添加反斜杠的字符串。
预定义字符是:
单引号(')
双引号(")
反斜杠(\)
NULL
解决方法:
lfi-labs5
源代码:
根据源代码,这题是过滤"../"。
str_replace('../',' ',$_GET['file'])将变量中的"../"用” “替代。
解决方法:
通过双写绕过
例如:"../"双写:”..././“或者”....//“
lfi-lab6
第六关只是把请求方式换成post而已
后几关同理
标签:文件,源代码,包含,lfi,labs,file,靶场,php From: https://blog.csdn.net/y14ffhgcg56_/article/details/143686432