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