寻找内置类

之前做过一道题目 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);
}