PHP 无参数RCE总结

在这篇文章中,我总结了在参与CTF比赛过程中积累的关于PHP无参数远程代码执行(RCE)的经验。由于一直以来时间有限,今天终于有机会整理这些知识点。

可能用到的函数(PHP的内置函数)

localeconv() 函数返回一个包含本地数字及货币格式信息的数组,第一个值是.
pos() 返回数组中的当前单元,默认取第一个值
next() 将内部指针指向数组的下一个元素并输出
scandir() 扫描目录
array_reverse() 翻转数组
array_flip() 键名与数组值对调
readfile() 读取文件
array_rand() 随机读取键名
var_dump() 输出数组,可以使用print_r替代
file_get_contents() 读取文件的内容
show_source highlight_file echo 可替代
get_defined_vars() 返回由所有的一定义的变量所组成的数组
end() 将数组的内部指针移动到数组的最后一个元素,并返回这个元素的值。
current() 读取数组的第一个元素

方式1
利用get_defined_vars()函数的特性进行RCE

比如

然后我们假装使用GET传参,利用current()获取第一个参数_GET

然后我们可以利用end()获取_GET中的最后一个参数值

利用这个特性我们可以构造payload

复制代码
code=eval(end(current(get_defined_vars())));&c=system('ls');

//先获取到所有的元素,然后获取第一个参数。end获取第一个参数的最后一个元素的值,这里相当于是获取_GET参数的最后一个元素的值也就是$C的值system('ls');.然后通过eval()执行
方式2

利用**localeconv()**读取当前目录文件的内容

利用**pos(localeconv())获取. 然后使用 scandir()获取当前目录的文件。然后通过 array_flip()将键值调换,键值的位置替换到键的位置上去。再使用 array_rand()随机读取一个键,这个键可能是我们想要读取的敏感文件。然后我们再使用read_file()**读取文件内容

方式3
复制代码
另外一种方法(通过pos(localeconv()获取一个. 再用scandir 获取当前目录文件,再通过next(array_reverse)获取flag.php ,最后readfile读取文件)

http://target.com/?code=readfile(next(array_reverse(scandir(pos(localeconv())))));
相关推荐
RSTJ_16257 分钟前
PYTHON+AI LLM DAY FOURTY-EIGHT
开发语言·人工智能·python·深度学习
南宫萧幕7 分钟前
HEV能量管理建模实战:从零搭建 Simulink 物理环境到 Python(DQN) 强化学习联合仿真调通
开发语言·python·算法·matlab·汽车·控制
lsx20240616 分钟前
C++ 接口(抽象类)
开发语言
handler0119 分钟前
【C++ 算法竞赛基础】数论篇:核心公式、经典例题与高频模板
开发语言·c++·算法·蓝桥杯·数论·最大公约数·最小公倍数
humcomm20 分钟前
2026年 Java 面试新特点
java·开发语言·面试
测试员周周24 分钟前
【Appium 系列】第12节-智能路由 — API测试 vs UI 测试的自动选择
开发语言·人工智能·python·功能测试·ui·appium·测试用例
其实防守也摸鱼27 分钟前
ctfshow--Crypto(funnyrsa1-密码2)解题步骤
python·安全·web安全·网络安全·密码学·web·工具
liudanzhengxi34 分钟前
AnthropicAPI连接超时:实战避坑指南
开发语言·php
张二娃同学34 分钟前
01_C语言学习路线与开发环境搭建
c语言·开发语言·学习
程序leo源40 分钟前
Qt信号与槽深度详解
c语言·开发语言·数据库·c++·qt·c#