文件包含漏洞

一、描述

一种注入型漏洞,把可重复使用的函数写入到单个文件中,在使用时,直接调用文件,不用重写,称为包含。

二、四个函数

include():找不到被包含的文件只会产生警告,脚本继续执行,并且include()函数并不在意被包含的文件是什么类型,只要有php代码,都会被解析出来

require():找不到被包含的文件就会产生错误,停止脚本运行

include_once()与irequire_once():如果该文件的代码已经被包含,则不会再次包含,(只会被包含一次)其他性质如上

三、分类

本地:读取或打开本地文件

远程:通过HTTP、HTTPS、PHP伪协议等远程加载文件

两种文件包含涉及参数:

allow_url_fopen = On/Off,默认是On,是否允许将url(如http://或ftp://))作为文件处理

allow_url_include = On/Off,默认是Off , 是否允许include/require以文件形式打开url(如http://或ftp://))。 当为off的时候不能包含远程文件,也不能执行系统命令,只能包含本地文件

四、PHP伪协议

file://用于访问本地文件系统,在CTF中通常用来读取本地文件的且不受allow_url_fopen与allow_url_include的影响

http://用于访问HTTP(s)网址

ftp://用于访问FTP(s)URL(s)

php://用于访问各个输入输出流,在CTF中经常使用的是php://filter和php://input

php://filter用于读取源码,并进行base64编码输出,不然会直接当做php代码执行看不到源代码内容。

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

利用条件:allow_url_fopen :off/on allow_url_include:on

glob://用于查找匹配的文件路径模式

**zip://**只能传入决定路径,可以访问压缩包里面的文件。当它与包含函数结合时,zip://流会被当作php文件执行,从而实现任意代码执行。要用#分割压缩包和压缩包里的内容,并且#要用url编码成%23,只需要是zip的压缩包即可,后缀名可以任意更改。相同的类型还有zlib://和bzip2://

利用条件:allow_url_fopen :off/on allow_url_include:off/on

data://同样类似与php://input,可以让用户来控制输入流,当它与包含函数结合时,用户输入的data://流会被当作php文件执行。从而导致任意代码执行。利用data:// 伪协议可以直接达到执行php代码的效果。

利用条件:allow_url_fopen :on allow_url_include:on

include 语句可以动态地包含用户发送的 GET 请求。

练习

[SWPUCTF 2022 新生赛]ez_ez_php

error_reporting(0); 取消报错

补充:substr是一个可以获取部分指定字符串的函数。例如有字符串abcd。如果指定起始位置为0,则可以从a中获取指定字符数的字符串,如果指定2则可以从c中获取指定字符数的字符串。

if ( substr($_GET["file"], 0, 3) === "php" ) 截取fil如果等于php执行下面代码

用php伪协议

得到一串base64编码

提示flag不在flag.php里而是在flag中

修改payload,再次得到一串base64编码

解码后得到flag

[鹤城杯 2021]EasyP

打开看到这些代码,通过查找发现以下意思

$_SERVER[...]:是包含了header、path、script locations等信息的数组。根据中括号内传入的参数不同,返回不同的信息

PHP_SELF:返回当前执行脚本的文件名

REQUEST_URI:取得当前URL的路径地址

basename():返回路径中的文件名部分,会过滤非asscll参数

从第一个if语句可以知道要得到flag需要用POST传入参数guess=secret,但是目前不知道secret是什么;从第二个if语句可以得知要检查当前执行文件脚本文件名,会对utils.php进行过滤;第三个if语句用来检查当前URL路径地址,会对show_source进行过滤

知道上述以后,首先确定原本payload是什么样子

/utils.php/?show_source=a(任意定义)

然后绕过对utils.php的过滤,加上非ascll字符

/utils.php/耶?show_source=a

补充:GET或POST方式传进去的变量名,会自动将 空格 + .[转换为_

绕过对show-source的过滤

/utils.php/耶?show+source=a

传入构造好的payload,得到flag

相关推荐
齐生12 天前
iOS 知识点 - 渲染机制、动画、卡顿小集合
笔记
用户962377954482 天前
VulnHub DC-3 靶机渗透测试笔记
安全
用户962377954482 天前
VulnHub DC-1 靶机渗透测试笔记
笔记·测试
叶落阁主3 天前
Tailscale 完全指南:从入门到私有 DERP 部署
运维·安全·远程工作
齐生13 天前
iOS 知识点 - IAP 是怎样的?
笔记
tingshuo29174 天前
D006 【模板】并查集
笔记
tingshuo29175 天前
S001 【模板】从前缀函数到KMP应用 字符串匹配 字符串周期
笔记
用户962377954485 天前
DVWA 靶场实验报告 (High Level)
安全
数据智能老司机5 天前
用于进攻性网络安全的智能体 AI——在 n8n 中构建你的第一个 AI 工作流
人工智能·安全·agent
数据智能老司机5 天前
用于进攻性网络安全的智能体 AI——智能体 AI 入门
人工智能·安全·agent