PHP白盒渗透测试:如何利用动态调用构造RCE演示用例?
问题分析与解决方案
首先,这个makeCall函数的风险极大——完全可控的动态类实例化+动态方法调用,相当于把PHP的类方法调用权限直接暴露给了攻击者,只要能找到合适的类和方法,就能干很多坏事。
针对你的问题,我分两部分解答:
一、读取敏感文件(类似C#的System.IO.File.ReadAllLines)
PHP没有像C#那样直接的内置文件操作类,但可以通过XXE漏洞利用内置的DOMDocument类读取服务器敏感文件,前提是PHP版本低于8.0(8.0及以上默认禁用了外部实体加载):
攻击示例
将请求参数设置为:
$myClass = DOMDocument$method = load$args = '<!DOCTYPE root [<!ENTITY xxe SYSTEM "/etc/passwd">]><root>&xxe;</root>'
当makeCall执行时,DOMDocument->load()会解析传入的XML,触发外部实体引用,读取/etc/passwd的内容并返回(或通过报错信息泄露)。
二、远程代码执行(RCE)
你提到想把exec作为$method参数,但exec是PHP的全局函数,不是任何内置类的方法,直接调用$theClass->exec($args)会抛出“未定义方法”的错误,所以这条路走不通。
那有没有通过内置类间接实现RCE的方式?
- 如果服务器启用了PDO扩展,且有可利用的数据库驱动(比如MySQL),可以尝试用
PDO->query()执行堆叠查询或利用LOAD_FILE等函数,但这需要数据库权限,且不一定能拿到RCE,更多是SQL注入风险。 - 其他内置类(如
ReflectionFunction、SplFileObject)要么构造函数需要参数(而你的makeCall是无参数实例化,会直接报错),要么没有可执行代码的方法。
不过要注意:如果目标服务器上有第三方框架(如Laravel、Symfony)的类,攻击者可能找到这些类中的危险方法实现RCE,但这不属于PHP内置类的范畴。
三、额外提醒
当前的makeCall函数还有其他潜在风险:
- 攻击者可以调用内置类的破坏性方法,比如尝试实例化
DirectoryIterator(虽然构造需要参数,但如果配置不当可能有风险)。 - 如果后续代码修改允许给类构造函数传参(比如改成
new $myClass($args)),攻击面会瞬间扩大——比如可以直接实例化SplFileObject('/etc/passwd')读取文件,或ReflectionFunction('exec')调用invoke('whoami')实现RCE。
总结
通过当前的makeCall函数,可以利用内置类实现敏感文件读取(XXE),但直接RCE无法通过通用PHP内置类实现。不过这个漏洞本身已经足够严重,因为攻击者可以调用任何无参数构造的类的任意方法,很可能存在其他未被发现的自定义类危险方法。
内容的提问来源于stack exchange,提问作者Gray
相关产品推荐
相关产品推荐

