无参RCE

无参RCE,就是说在无法传入参数的情况下,仅仅依靠传入没有参数的函数套娃就可以达到命令执行的效果

何时有无参RCE:

if(';' === preg_replace('/[^\W]+\((?R)?\)/', '', $_GET['code'])) {    
    eval($_GET['code']);
}

这段代码的核心就是只允许函数而不允许函数中的参数,就是说传进去的值是一个字符串接一个(),那么这个字符串就会被替换为空,如果替换后只剩下;,那么这段代码就会被eval执行。而且因为这个正则表达式是递归调用的,所以说像a(b(c()));第一次匹配后就还剩下a(b());,第二次匹配后就还剩a();,第三次匹配后就还剩;了,所以说这一串a(b(c()));就会被eval执行,但相反,像a(b('111'));这种存在参数的就不行,因为无论正则匹配多少次它的参数总是存在的。(搬自大佬blog)

写在前面:

end() : 将内部指针指向数组中的最后一个元素,并输出
next() :将内部指针指向数组中的下一个元素,并输出
prev() :将内部指针指向数组中的上一个元素,并输出
reset() : 将内部指针指向数组中的第一个元素,并输出
each() : 返回当前元素的键名和键值,并将内部指针向前移动
1.getallheaders()

获取http所有headers信息,然后可以用var_dump打印

同时可以利用类似end的函数取出数组的指定一条,如果是命令还可以将var_dump改成eval来执行语句

ps:中间件为apache

2.get_defined_vars()

更为通用,可获取$_GET $_POST $_FILES $_COOKIE全局变量并以二维数组输出

可用current将二维数组转为一维数组,这个函数的作用是返回数组中的当前单元,而它的默认是第一个单元,然后步骤同上

3.session_id()

把恶意代码写到COOKIEPHPSESSID中,然后利用session_id()这个函数去读取

session_id()要开启session才能用,所以说要先session_start()

PHPSESSIID中只能有A-Z a-z 0-9-,所以说我们要先将恶意代码16进制编码以后再插入进去,而在php中,将16进制转换为字符串的函数为hex2bin

4.php函数直接读取文件
1.localeconv

localeconv() 函数返回一个包含本地数字及货币格式信息的数组

这里的var_dump(localeconv());我们能看见第一个string1就是一个“.”,这个点是由localeconv()产生的

‘.’代表的是当前目录,我们可以利用这个点完成遍历目录的操作,相当于就是linux中的ls指令

既然current()取第一个值,那么current(localeconv())构造一个‘.’,'.' 表示当前目录,scandir('.') 将返回当前目录中的文件和子目录

最后用highlight_file()返回文件内容

2.scandir

列出目录中的文件和目录

3.current(pos)

pos()函数是current()函数的别名

它的作用就是输出数组中当前元素的值,只输出值而忽略掉键,默认是数组中的第一个值

4.chdir()

这个函数是用来跳目录的,有时想读的文件不在当前目录下就用这个来切换,因为scandir()会将这个目录下的文件和目录都列出来,那么利用操作数组的函数将内部指针移到我们想要的目录上然后直接用chdir切就好了,如果要向上跳就要构造chdir('..')

5.array_reverse()

将整个数组倒过来,有的时候当我们想读的文件比较靠后时,就可以用这个函数把它倒过来,就可以少用几个next()

6.highlight_file()

打印输出或者返回 filename 文件中语法高亮版本的代码,相当于就是用来读取文件的

posted @ 2024-12-17 19:26  ALe_#3  阅读(7)  评论(0)    收藏  举报  来源