红日代码审计-day3实例化任意对象漏洞

Day 3 - Snow Flake

题目叫做雪花,代码如下:
在这里插入图片描述

漏洞解析 :

这段代码中存在两个安全漏洞。第一个是文件包含漏洞,上图第8行中使用了 class_exists() 函数来判断用户传过来的控制器是否存在,默认情况下,如果程序存在 __autoload 函数,那么在使用 class_exists() 函数就会自动调用本程序中的 __autoload 函数,这题的文件包含漏洞就出现在这个地方。攻击者可以使用 路径穿越 来包含任意文件,当然使用路径穿越符号的前提是 PHP5~5.3(包含5.3版本)版本 之间才可以。例如类名为: …/…/…/…/etc/passwd 的查找,将查看passwd文件内容,我们来看一下PHP手册对 class_exists() 函数的定义:

class_exists (PHP 4, PHP 5, PHP 7)
功能 检查类是否已定义
定义 bool class_exists ( string $class_name[, bool $autoload = true ] )
$class_name 为类的名字 在匹配的时候不区分大小写。默认情况下 $autoload 为 true ,当 $autoload 为 true 时,会自动加载本程序中的 __autoload 函数;当 $autoload 为 false 时,则不调用 __autoload 函数。

在这里插入图片描述

这里没有对传入的类做任何的过滤,所以我们可以传入内置的类。

我们这里直接利用PHP的内置类,先用 GlobIterator 类搜索 flag文件 名字,来看一下>PHP手册对 GlobIterator 类的 构造函数的定义:

public GlobIterator::__construct ( string $pattern [, int $flags = FilesystemIterator::KEY_AS_PATHNAME | FilesystemIterator::CURRENT_AS_FILEINFO ] )

第一个参数为要搜索的文件名,第二个参数为选择文件的哪个信息作为键名,这里我选择用 FilesystemIterator::CURRENT_AS_FILEINFO ,其对应的常量值为0,你可以在 这里 找到这些常量的值,所以最终搜索文件的 payload 如下:

http://localhost/CTF/index.php?name=GlobIterator&param=./*.php&param2=0

在这里插入图片描述我们将会发现flag的文件名为 f1agi3hEre.php ,接下来我们使用内置类 SimpleXMLElement 读取 f1agi3hEre.php 文件的内容,,这里我们要结合使用PHP流的使用,因为当文件中存在: < > & ’ " 这5个符号时,会导致XML文件解析错误,所以我们这里利用PHP文件流,将要读取的文件内容经过 base64编码 后输出即可,具体payload如下:

http://localhost/CTF/index.php?name=SimpleXMLElement&param=<?xml version="1.0"?>]>%26xxe;&param2=2

总结

1、未过滤自定义函数,导致实例化任意对象漏洞

2、内置函数:GlobIterator

3、xxe

猜你喜欢

转载自blog.csdn.net/qq_45951598/article/details/110825629