知识点
实例化漏洞
实例化类的类名和传入类的参数均在用户的控制之下。攻击者可以通过该漏洞,调用PHP代码库的任意构造函数。即使代码本身不包含易受攻击的构造函数,我们也可以使用PHP的内置类 GlobIterator 来进行搜索flag文件。
XXE漏洞
实例化类的类名和传入类的参数均在用户的控制之下。攻击者可以通过该漏洞,调用PHP代码库的任意构造函数。即使代码本身不包含易受攻击的构造函数,我们也可以使用PHP的内置类 SimpleXMLElement 来进行 XXE 攻击,进而读取目标文件的内容,甚至命令执行(前提是安装了PHP拓展插件expect)
代码分析
我们首先看 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 函数。
我们这里这里没有 __autoload 函数,而是用 spl_autoload_register 注册了一个类似 __autoload 作用的函数,即这里输出404信息。
然后我们发现17行进行实例化时类名和传入类的参数均在用户的控制之下。
以下参考七月火师傅:
https://mochazz.github.io/2018/08/18/PHP-Audit-Labs题解之Day1-4/#Day3题解:-By-七月火
这里我们使用php内置类来进行查找flag文件
GlobIterator 类:
public GlobIterator::__construct ( string $pattern [, int $flags = FilesystemIterator::KEY_AS_PATHNAME | FilesystemIterator::CURRENT_AS_FILEINFO ] )
第一个参数为要搜索的文件名,第二个参数为选择文件的哪个信息作为键名,这里我选择用 FilesystemIterator::CURRENT_AS_FILEINFO ,其对应的常量值为0,
https://www.php.net/manual/en/globiterator.construct.php
所以最终搜索文件的 payload 如下:
http://localhost/CTF/index.php?name=GlobIterator¶m=./*.php¶m2=0
我们将会发现flag的文件名为 f1agi3hEre.php ,接下来我们使用内置类 SimpleXMLElement 读取 f1agi3hEre.php 文件的内容,,这里我们要结合使用PHP流的使用,因为当文件中存在: < > & ‘ “ 这5个符号时,会导致XML文件解析错误,所以我们这里利用PHP文件流,将要读取的文件内容经过 base64编码 后输出即可,具体
SimpleXMLElement 类的定义:
SimpleXMLElement :(PHP 5, PHP 7)功能 :
用来表示XML文档中的元素,为PHP的内置类。
payload:
http://localhost/CTF/index.php?name=SimpleXMLElement¶m=<?xml version="1.0"?><!DOCTYPE ANY [<!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=/var/www/html/CTF/f1agi3hEre.php">]><x>%26xxe;</x>¶m2=2
param2=2代表的模式是 LIBXML_NOENT
这里有一个点没看到,他的模式是整数,但是并没有具体的2,那么换成其他整数也行。因为本地没有回显只能猜想是这样了
https://www.php.net/manual/zh/simplexmlelement.construct.php
https://www.php.net/manual/zh/libxml.constants.php
参考
https://mochazz.github.io/2018/08/18/PHP-Audit-Labs题解之Day1-4/#Day3题解:-By-七月火