寻找内置类
之前做过一道题目 Bytectf2019-ezcms
最后一步需要找到一个有open方法的内置类
当时是roverdoge大佬在之前比赛的wp中找到的ZipArchive::open
但其实使用php的反射可以很轻松的找到带有open方法的内置类
1 2 3 4 5 6 7 8 9 10
| $classes = get_declared_classes(); foreach($classes as $one_class){ $oReflectionClass = new ReflectionClass($one_class); foreach($oReflectionClass->getMethods() as $one_method){ if($one_method->name == 'open'){ echo $one_class."<br>"; break; } } }
|
寻找内置函数
一些题目需要找到特定的php内置函数,比如无参数RCE,这里以GXYCTF的禁止套娃为例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| <?php include "flag.php"; echo "flag在哪里呢?<br>"; if(isset($_GET['exp'])){ if (!preg_match('/data:\/\/|filter:\/\/|php:\/\/|phar:\/\//i', $_GET['exp'])) { if(';' === preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'])) { if (!preg_match('/et|na|info|dec|bin|hex|oct|pi|log/i', $_GET['exp'])) { @eval($_GET['exp']); } else{ die("还差一点哦!"); } } else{ die("再好好想想!"); } } else{ die("还想读flag,臭弟弟!"); } } highlight_file(__FILE__); ?>
|
PHP总共有1450个内置函数,找起来很费时间
但无参数RCE只需要1个没有参数的函数和若干个1个参数的函数,可以再加上题目的限制条件进行寻找
1 2 3 4 5 6 7 8 9 10
| $functions = get_defined_functions()['internal']; foreach($functions as $f){ if (!preg_match('/et|na|info|dec|bin|hex|oct|pi|log/i', $f)) { $reflection = new ReflectionFunction($f); if($reflection->getNumberOfRequiredParameters() == 0) file_put_contents('0.txt',$f."\n",FILE_APPEND); else if ($reflection->getNumberOfRequiredParameters() == 1) file_put_contents('1.txt',$f."\n",FILE_APPEND); } }
|
得到121个无参数的函数和447个1个参数的函数
接着可以通过一些无参数RCE的知识进行进一步筛选
寻找当前定义的常量
1 2 3 4 5
| <?php $constants = get_defined_constants(); foreach($constants as $key=>$value){ file_put_contents('constants.txt',$key." ".$value."\n",FILE_APPEND); }
|