目录

PHP

本地包含(Local File Inclusion)

LFI(Local File Inclusion)通过填写 ..//etc/ 等路径得到一些文件的内容。

你包含的内容必须在服务器上,才能叫本地!在 DVWA 产生此漏洞的原因是包含的参数能够被控制,PHP 里使用下面方式包含 .php 文件:

require('index.php');
require_once('index.php');
include 'index.php';
include_once 'index.php';

关于要包含的文件官方文档说明,文件内容 PHP 开始和结束标记 <?php ...?> 包含的代码会被执行:

When a file is included, parsing drops out of PHP mode and into HTML mode at the beginning of the target file, and resumes again at the end. For this reason, any code inside the target file which should be executed as PHP code must be enclosed within valid PHP start and end tags.

不包含的就直接展示出来,可以结合 Directory Traversal 漏洞读取系统文件。

示例利用场景

  1. 通常文件上传后无法执行脚本可以试试将此文件包含来执行代码。将要包含的 shell 打包成压缩文件(支持什么格式的压缩?),然后用 phar://压缩包/要解析的包文件 这种格式去拿 Shell,phar 会解析压缩包内的文件。
  2. 可以搭配文件上传来传一个图片或任意格式的文件,里面写入 WebShell。有日志也可以包含,比如访问的 GET 请求参数里带上 Shell,然后去文件包含这个日志文件,就可能得到 WebShell。

远程包含(Remote File Inclusion)

RFI(Remote File Inclusion)加载远程主机中的文件,是否执行 PHP 代码原理和 LFI 一样,通常利用方式有载入远程页面钓鱼或执行 PHP 代码两种。

缺点是要利用必须手动配置选项,因此实战中不常见。

在 php.ini 配置文件中将 allow_url_include 设置为 On——默认是 Off。它只能用 http://地址/目录/文件.php 完整的 URL 连接来访问,看注释也能使用 ftp 没试验过:

includeUrl.JPG

实战中 allow_url_include 开启后可以尝试 php://input 去获取 Shell

include($_GET['file']);

请求后代码会被执行。

GET /include.php?file=php://input HTTP/1.1
Host: 127.0.0.1
......

<?php phpinfo()?>

不过 PHP 7.4.x 废弃的功能 提到此选项被废弃:

allow_url_include INI 选项

配置文件中的 allow_url_include 选项被废弃。如果启用了该选项,将会产生一个弃用通知。

再过几年可能随着 PHP 版本更新,allow_url_include 会被移除,以后再也见不到远程文件包含。

伪协议🔨

官网提到 PHP 支持的协议:https://www.php.net/manual/zh/wrappers.php.php

https://weread.qq.com/web/reader/a7432bb0813ab80eeg0159bc

php://filter

用来读取文件。

php://filter/read/<过滤器>/resource=<文件名>

官网提到有哪些过滤器可以用:https://www.php.net/manual/zh/filters.php

对应渗透时可用的过滤器:

  • string.rot13
  • convert.base64-encode 和 convert.base64-decode,Base64 编码
  • convert.iconv.*
  • mcrypt. 和 mdecrypt.

php://filter/write

其他过滤器

phar://

zip://

php://input

data://

file://

jsp

漏洞代码:

%@include file="test.jsp"%
<jsp:include page="<%=file%>"></jsp:include>、<c:import url="<%=url%></c:import>

漏洞危害:文件读取和文件下载。

防御(待补充)

  • 限制文件名中只能包含字母与数字,像 / 这种符号的输入统统替换成空字符串,这样不管它是相对路径还是绝对路径都无法切换目录。
  • 设置 php.ini 配置文件 allow_url_include = Off,避免开启 RFI。
  • 避免由外界传入参数值,可以在代码内部包含指定文件。

最近更新:

发布时间:

摆哈儿龙门阵