当我们看到phpinfo时在谈论什么

我们在渗透测试的过程中,如果存在phpinfo界面,我们会想到什么?
大部分内容摘抄自:https://www.k0rz3n.com/2019/02/12/PHPINFO 中的重要信息/
关于phpinfo PHP中提供了PHPInfo()函数,该函数返回 PHP 的所有信息,包括了 PHP 的编译选项及扩充配置、PHP 版本、服务器信息及环境变量、PHP 环境变量、操作系统版本信息、路径及环境变量配置、HTTP 标头、及版权宣告等信息。
当我们看到phpinfo时在谈论什么
文章图片

我们编写test.php文件


【当我们看到phpinfo时在谈论什么】当我们看到phpinfo时在谈论什么
文章图片

很多PHP站点在测试搭建PHP环境是否正确后没有及时删除,这些敏感信息的泄露将会增大服务器被渗透的风险
敏感信息查看与利用
  • php版本信息
方便本地搭建环境,不同版本之间也参在函数参数和安全性机制的差异
当我们看到phpinfo时在谈论什么
文章图片

  • 系统的版本信息
    当我们看到phpinfo时在谈论什么
    文章图片
  • Loaded Configuration File(配置文件位置)
    php.ini的位置
    当我们看到phpinfo时在谈论什么
    文章图片
  • Registered PHP Streams(支持的流)
    这个在文件包含,反序列化还有一些关键的bypass的时候非常有用
    当我们看到phpinfo时在谈论什么
    文章图片
  • Registered Stream Filters(支持的流过滤器)
    这个同样是在文件包含,反序列化还有一些关键的bypass的时候有用
    当我们看到phpinfo时在谈论什么
    文章图片
  • allow_url_fopen & allow_url_include
文件包含必看选项之一,如果allow_url_fopenallow_url_include都为On的时候,则文件包含函数是可以加载远程文件的,可以利用远程文件包含漏洞直接执行任意命令。
攻击者在自己的web服务器上放一个可执行的恶意文件,通过目标网站存在的远程文件包含漏洞来加载文件,从而实现执行任意命令的目的
当我们看到phpinfo时在谈论什么
文章图片

  • disable_functions
    命令执行,代码执行必看选项之一。该指令可用于禁止某些函数,接收逗号分隔的函数名列表作为参数,通过bypass目标站点的disable_functions达成RCE
当我们看到phpinfo时在谈论什么
文章图片

  • display_errors & display_startup_errors
调试过程中经常使用的错误提示在没有关闭的情况下放入生产环境是不堪设想的
当我们看到phpinfo时在谈论什么
文章图片

  • open_basedir
这个选项设置了文件读取的时候的目录限制,将用户可操作的文件限制在某目录下
当我们看到phpinfo时在谈论什么
文章图片

但是这个限制是可以绕过的,之前P牛给出了绕过方法-PHP绕过open_basedir列目录的研究
  • short_open_tag
判断服务器是否支持短标签,方便写入shell
当我们看到phpinfo时在谈论什么
文章图片

  • phar
文件包含还有反序列化重点关注,在文件系统函数 ( file_get_contents 、 unlink 等)参数可控的情况下,配合 phar://伪协议 ,可以不依赖反序列化函数 unserialize() 直接进行反序列化的操作
当我们看到phpinfo时在谈论什么
文章图片

  • session
    查看session的相关配置,在文件包含和反序列化的时候有用
    当我们看到phpinfo时在谈论什么
    文章图片

  • SERVER_ADDR
真实IP
当我们看到phpinfo时在谈论什么
文章图片

  • _FILE["file"]
获取临时文件名字和路径,本地文件包含GetShell
  • _SERVER["PATH"]
这是windows下特有的,能显示出系统的所有环境变量
当我们看到phpinfo时在谈论什么
文章图片

  • _SERVER["SCRIPT_FILENAME"]
找到网站的绝对路径
当我们看到phpinfo时在谈论什么
文章图片

  • Gopher
可以配合SSRF发起攻击
  • Fastcgi
查看是否开启Fastcgi和Fastcgi的版本,可能导致解析漏洞,远程命令执行,任意文件读取等问题
  • 支持的程序
可以通过phpinfo()查看一些特殊的程序服务,比如redismemcachemysqlSmtp,curl等等。如果服务器装了redis或者memcache,可以尝试寻找SSRF来getshell
检测POC 基于pocsuite3的phpinfo泄露检测脚本
from pocsuite3.api import requests from pocsuite3.api import register_poc from pocsuite3.api import Output, POCBase, logger import sslssl._create_default_https_context = ssl._create_unverified_contextclass TestPOC(POCBase): vulLevel = 3 vulID = '' version = '1.0' vulDate = '' references = [''] name = 'phpinfo敏感信息泄露' appPowerLink = '' appName = 'phpinfo' appVersion = '' vulType = 'phpinfo敏感信息泄露' desc = ''' ''' samples = ['']def _verify(self): result = {} headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36', } phpinfoList=[ '/phpinfo.php','/1.php','/test.php' ]for path in phpinfoList: vulurl = "{}{}".format( self.url.rstrip('/'), path) try: resp = requests.get(url=vulurl, headers=headers, timeout=3, verify=False) if "PHP Version" in resp.text and resp.status_code == 200: result['VerifyInfo'] = {} result['VerifyInfo']['url'] = vulurl return self.parse_attack(result) except Exception as e: logger.error("connect target '{} failed!'".format(vulurl)) passreturn self.parse_attack(result)def parse_attack(self, result): output = Output(self) if result: output.success(result) else: output.fail('Internet nothing returned') return outputregister_poc(TestPOC)

参考链接
  • https://xz.aliyun.com/t/2222
  • https://xz.aliyun.com/t/521
  • https://www.k0rz3n.com/2019/02/12/PHPINFO 中的重要信息/
  • https://xz.aliyun.com/t/5535
END 建了一个微信的安全交流群,欢迎添加我微信备注进群,一起来聊天吹水哇,以及一个会发布安全相关内容的公众号,欢迎关注
当我们看到phpinfo时在谈论什么
文章图片
当我们看到phpinfo时在谈论什么
文章图片

    推荐阅读