今天做一个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。