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¶m=./*.php¶m2=0
我们将会发现flag的文件名为 f1agi3hEre.php ,接下来我们使用内置类 SimpleXMLElement 读取 f1agi3hEre.php 文件的内容,,这里我们要结合使用PHP流的使用,因为当文件中存在: < > & ’ " 这5个符号时,会导致XML文件解析错误,所以我们这里利用PHP文件流,将要读取的文件内容经过 base64编码 后输出即可,具体payload如下:
http://localhost/CTF/index.php?name=SimpleXMLElement¶m=<?xml version="1.0"?>]>%26xxe;¶m2=2