RCE是php的代码执行简称,是Remote Command Exec(远程命令执行)和Remote Code Exec(远程代码执行)的缩写;Command指的是操作系统的命令,code指的是脚本语言(php)的代码。
第一题:eval执行
根据代码可以看到该网页使用request得到cmd参数并使用eval执行cmd的代码,其中isset函数用于检测是否传入了一个名为cmd的变量的值(是否非空),eval是将一串字符作为php代码执行,$_REQUEST默认包含了$_GET,$_POST 和 $_COOKIE 的数组,本题中通过hackbar使用get方法传递参数
使用system("ls");语句
flag文件不在本级目录中,查看上一层的目录
找到flag文件
使用cat指令获取flag文件中的flag
第二题:文件包含
strpos函数的作用是查找字符串首次出现的位置,即file中不能包含flag这个字符串
题目中有一个shell的超链接,点开查看
本题中通过file文件包含shell.txt,并通过控制shell.txt中的ctfhub参数实现RCE。
flag文件在上一层目录中,使用cat读取flag文件
第三题:php://input
substr函数是返回字符串的子串,意思是如果file的前六个字符为php://,那么就会包含file文件
查看phpinfo,allow_url_fopen和allow_url_include状态均为On。
allow_url_fopen是一个在PHP中经常使用的开关,它允许PHP从远程服务器下载数据或打开远程文件。可以将其视为一个开关,打开它可以允许我们读取远程文件,关闭它则可以防止远程文件读取。
allow_url_include作用是是否允许includeI()和require()函数包含URL(HTTP,HTTPS)作为文件处理
只有当allow_url_fopen=On和allow_url_include=On时,include等其他包含函数才会将URL代表的文件包含执行
因此本题中可以让file等于php://input,从而通过post传参进行RCE
使用hackbar传递POST请求,file为php://input使得POST参数可以作为原始请求的数据,使用bp抓包,即可看到执行POST参数中代码后的内容
使用cat获取flag文件中的内容
第四题:读取源代码
先尝试使用php://input,发现无回显,使用php://filter
直接得到flag