文件包含漏洞

一、描述

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

二、四个函数

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

鹤城杯 2021EasyP

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

$_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

相关推荐
磐时信息技术36 分钟前
SASETalk | 当智能驾驶驶入未知场景:谈谈关于SOTIF、AI安全与工程落地的思考
人工智能·安全·预期功能安全·sotif
摇滚侠1 小时前
《SpringBoot 3:入门与应用实战》第 12 章 JDBC 与事务 JDBC 事务管理 阅读笔记 33
spring boot·笔记·后端
Chengbei111 小时前
SRC报告成稿 Skill(SRC/0day 提交稿、分层验证门、Step 式 PoC、截图铁律)
网络·人工智能·安全·web安全·自动化·系统安全
2601_966377132 小时前
云上系统零改造过密评|数达安全发布通关四件套
网络·安全
Wendy不吃榴莲2 小时前
# AI短剧教程 - 《后西游记》开播后,AI影视为什么更考验“连续讲故事”?
人工智能·笔记·学习·ai·视频
Agudamu11612 小时前
B站学习视频怎么变笔记:用 Ai好记 + Obsidian 搭建个人知识库的完整教程
人工智能·笔记·学习·音视频
每天题库3 小时前
交安C证报考条件有哪些?公路水运安全员C证报名时间及考试科目
学习·安全·考试·题库·考证
sbjdhjd3 小时前
PHP eval 型 RCE:flag 正则过滤与通配符绕过实操 | 01
安全·web安全·网络安全·开源·系统安全·php·网络攻击模型
科技小登3 小时前
重大活动安全保障方案怎么选?重保服务、攻防演练、应急响应与安全意识培训实战与边界
数据库·人工智能·安全
数据知道3 小时前
静态分析入门——PE 结构、字符串、导入表快速定性
网络·安全·web安全·网络安全