文件包含漏洞

1、概念

文件包含漏洞我觉着和任意文件读取差不多了:也是web应用程序漏洞,它允许攻击者通过控制文件路径,使应用程序包含执行任意文件的内容。

2、分类

(1)本地文件包含

本地文件包含主要指指攻击者可以利用应用程序(或靶场)包含****本地服务器上的文件。然后通过控制文件路径,可能读取到服务器上的敏感文件配置文件日志文件 、其他PHP源代码文件等)

(2)远程文件包含

远程文件包含是指攻击者可以利用应用程序包含****远程服务器上的文件。然后通过控制文件路径,可能包含恶意的远程文件,从而在目标服务器上执行恶意代码

3、文件包含漏洞的原理

还是web应用程序(或服务器)对用户输入的内容(主要指文件路径)没有进行严格的过滤,然后用户就可以控制文件路径,导致应用程序包含并执行文件。

主要流程:

(1)用户输入控制

(2)文件路径解析

(3)文件内容执行

4、例题

NSSCTF

其实这篇和我昨天写的 任意文件读取 可以整合一下,毕竟知识点都相关联

【SWPUCTF 2024 秋季新生赛】PHP 躲猫猫

开启题目是让传参

不安全就直接用GET随便传一个值1看看

POST方法会把参数放到body里面,不会直接显示在URL上,所以更加安全

所以用POST传参得到一个提示

然后得到了源码

复制代码
$NSS=$_POST['NSS'];
$ATM=$_GET['CTF'];
$CTF=$_GET['ATM']

从超全局数组_POST中获取NSS的表单字段值,并赋值给NSS; (POST传参NSS的值);

从超全局变量_GET中分别获取CTF和ATM的URL参数值,并分别赋值给CTF和$ATM。

审了一下主要是中后部分:

复制代码
if ($CTF!=$ATM ){ 

判断如果CTF是否等于ATM

复制代码
if (is_string($CTF)&&is_string($ATM)){

判断CTF和ATM是否都为字符串

复制代码
if (md5($ATM)==md5($CTF)){

再判断CTF和 ATM的MD5哈希值是否相等

复制代码
include($NSS);//f1ag在/f1ag里面,快通过include拿到它

以上条件都满足,执行 include(NSS),尝试包含NSS指定的文件

复制代码
}else{
            echo '诶嘿,但是我就是要让ATM==CTF,不然你就别想拿到f1ag,不服进nss来揍我'; 

这个是两个变量的哈希值不相等时的报错

复制代码
}else{
        echo '不准无脑用数组,实打实的学才能学得好'; 

这个是两个变量不是字符串时的报错

复制代码
}else{
    echo 'ATM怎么能是CTF呢';

如果两个变量(字符串)相等时的报错

复制代码
if ($NSS=='I love CTF'){
    echo $f1agfile;
} 

如果变量NSS的值是 I love CTF,输出变量f1agfile 里的值

那就先传一个I love CTF看看变量$f1agfile里的东西是什么

提示flag在f1ag.php里面,用include查找

所以这题的关键就在这里

ATM与CTF的MD5哈希值相等时,执行include(NSS),用来包含NSS的指定文件,

而这里的提示flag在 /f1ag 文件中就是暗示包含的$NSS指定文件是 /f1ag 就能拿到flag

所以思路就是用GET传参传入两个MD5哈希值相等的不同字符串分别赋值给ATM和CTF;

再用POST传参传入NSS使之等于指定文件 /f1ag 即可

然后我让AI给了我两个MD5值相等的字符串

但是执行后发现没有绕过

又让它给我重新找了两个但发现还是不行

只好去看看博客,然后发现大家都是用的相同的一组:

复制代码
240610708

QNKCDZO

这一组的MD5哈希值的确相等,但执行发现可以绕过

回去重新问了一下AI,问题出在哈希冲突,也就是找到哈希值相等的两个字符串不容易

这么说也就是其实它给我的那两个字符串的MD5哈希值并不相等,而我追问了一下事实也的确如此

只能说 ,六百六十六

这样一来就需要记一下这组MD5哈希值相等的字符串了

【MoeCTF 2022】baby_file

这题我也是醉了,写了一早上结果忘记保存了,下午回来没了。。。

重新写吧

还是先审一下代码

判断是否含有GET传参传入file的参数,并把数组_GET\['file'\]的值传递给变量file;

include(file)表示函数include()包含指定变量文件file并执行;

然后如果if条件不成立(没有通过URL传递参数file),执行else分支;

highlight_file()函数用于显示文件源代码,并高亮;

_FILE_是一个PHP魔术常亮,表示显示文件当前路径和文件名

也就是如果没有通过URL传递file参数,那么显示当前脚本文件的源代码,并进行语法高亮。

这里思考片刻后锁定php伪协议:

php://filter是 PHP 提供的一种伪协议,用于对数据流(stream)进行过滤和转换。它允许操作者在读取或写入文件、网络资源等数据流时,对数据进行预处理或后处理

比如现在读一下index.php:

得到一对加密,用base64解码一下

得到和网页一样的源码

说明当前网页所在目录就是Index.php

说明伪协议过滤、转换数据流可行

那就把目录替换为flag.php

下面先给出payload:

复制代码
/?file=php://filter/read=convert.base64-encode/resource=flag.php

总的来说这是构造的GET请求,就刚对代码的分析可以知道 php://filter/read=convert.base64-encode/resource=flag.php 作为file的参数值,需要知道的是,

php://filter协议的标准语法是 :

复制代码
php://filter<filter_name>=<filter_params>/resource=<resource>

所以read是指定要使用的过滤器;

convert.base64-encode是过滤器的参数;

flag.php则是要处理的资源。

总的来说就是用这个协议,告诉PHP:使用convert.base64-encode过滤器,对flag.php文件的内容进行处理,PHP会读取flag.php文件的内容,并将其进行Base64编码然后输出

最后执行,得到base64编码

解码得到flag

【SWPUCTF 2021 新生赛】include

很简单的一个题,和白天的php伪协议差不多的文件包含

让传一个file

随便传个1康康

可以看到得到了源码

并提示flag在flag.php中

因为白天做了一题,接下来直接想到用php伪协议(base64加密并输出)

payload都不变:

复制代码
/?file=php://filter/read=convert.base64-encode/resource=flag.php

直接执行

得到输出的base64加密包含文件

接下来解密

获得flag

【HNCTF 2022 WEEK2】easy_include

这题其实也和白天做的差不多

不同的是多了一个正则表达式对参数file里的字符进行了过滤, i 表示不区分大小写

复制代码
if(preg_match("/php|flag|data|\~|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\_|\+|\=/i", $file)){
        die("error");

这样的话就有点棘手了

返回查看题目相关知识点提示Nginx

源代码注释提示要搜索

搜了一下但感觉对解题并没有什么思路

后面去别处了解了一下,了解到通过访问日志可以得到一些信息,如ip地址,请求处理时间的信息,错误信息等等,Nginx日志有两种,一种是access.log,另一种是error.log

相关推荐
dyxal1 小时前
非对称加密:彻底解决密钥分发难题的数字安全革命
服务器·网络·安全
q***9943 小时前
IPV6公网暴露下的OPENWRT防火墙安全设置(只允许访问局域网中指定服务器指定端口其余拒绝)
服务器·安全·php
p***62994 小时前
【Sql Server】sql server 2019设置远程访问,外网服务器需要设置好安全组入方向规则
运维·服务器·安全
腾讯云开发者4 小时前
你相信光吗?
安全
白帽黑客-晨哥5 小时前
最适合零基础的渗透测试学习路径:理论+实战+就业,我在湖南网安基地实现了
学习·web安全·渗透测试·实战项目·就业·湖南网安基地
安娜的信息安全说6 小时前
LLM 安全实战:Prompt 攻击原理、案例与防御指南
安全·ai·prompt
MicroTech20256 小时前
微算法科技(NASDAQ :MLGO)基于区块链的混合数据驱动认知算法:开启智能安全新范式
科技·安全·区块链
翼龙云_cloud6 小时前
亚马逊云渠道商:如何利用AWS工具进行日常安全运维?
运维·安全·云计算·aws
EasyCVR9 小时前
视频汇聚平台EasyCVR赋能石油管道计量站精准监控与安全管理
安全·音视频
白帽子黑客杰哥17 小时前
2025漏洞挖掘系统学习:从环境搭建到实战挖洞全流程
web安全·渗透测试·漏洞挖掘·网络安全就业