PHP eval函数特性

今天做一个ctf题目的时候发现

 1 <?php
 2 $f = $_POST['flag'];
 3 $f = str_replace(array('`', '$', '*', '#', ':', '\\', '"', "'", '(', ')', '.', '>'), '', $f);
 4 if((strlen($f) > 13) || (false !== stripos($f, 'return')))
 5 {
 6     die('wowwwwwwwwwwwwwwwwwwwwwwwww');
 7 }
 8 try
 9 {
10     eval("\$spaceone = $f");
11 }
12 catch (Exception $e)
13 {
14     return false;
15 }
16 if ($spaceone === 'flag'){
17     echo file_get_contents("helloctf.php");
18 }
19 
20 ?>

想着post一个flag就可以了,但是发现flag传过去了,还是没能获取到我要的key。再看了一遍发现问题出在这里

 eval("\$spaceone = $f");

根据php文档对eval函数的解释

eval函数传入的必须是有效的 PHP 代码。所有的语句必须以分号结尾。比如 'echo "Hi!"' 会导致一个 parse error,而 'echo "Hi!";' 则会正常运行。

这就很明显了,我需要post的不是“flag”而是"flag;"

第一次遇到,记录下这个tips。

猜你喜欢

转载自www.cnblogs.com/sonneay1/p/9351391.html