文件包含漏洞

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

相关推荐
付出不多5 分钟前
Nginx安全防护与HTTPS部署
nginx·安全·https
请再坚持一下2 小时前
网络安全护网行动之个人见解
安全·web安全·网络安全
AORO_BEIDOU2 小时前
遨游科普:2025年,三防平板有多智能?
网络·人工智能·安全·智能手机·电脑·信息与通信
AWS官方合作商2 小时前
AWS VPC架构师指南:从零设计企业级云网络隔离方案
安全·架构·aws
wtsafe4 小时前
仓储车间安全革命:AI叉车防撞装置系统如何化解操作风险
人工智能·物联网·安全
独行soc5 小时前
2025年渗透测试面试题总结-某步在线面试(题目+回答)
linux·网络·安全·web安全·面试·职场和发展·渗透安全
hie988946 小时前
如何配置 Java 安全管理器来避免访问控制异常
java·python·安全
芯盾时代6 小时前
RSAC 2025观察:零信任+AI=网络安全新范式
人工智能·安全·web安全·网络安全
Ftrans7 小时前
【分享】解锁文件摆渡系统新玩法:虚拟目录助力企业效率提升
大数据·安全