当我们看到phpinfo时在谈论什么
我们在渗透测试的过程中,如果存在phpinfo界面,我们会想到什么?
大部分内容摘抄自:https://www.k0rz3n.com/2019/02/12/PHPINFO 中的重要信息/
关于phpinfo
PHP中提供了PHPInfo()
函数,该函数返回 PHP 的所有信息,包括了 PHP 的编译选项及扩充配置、PHP 版本、服务器信息及环境变量、PHP 环境变量、操作系统版本信息、路径及环境变量配置、HTTP 标头、及版权宣告等信息。
文章图片
我们编写test.php
文件
【当我们看到phpinfo时在谈论什么】
文章图片
很多PHP站点在测试搭建PHP环境是否正确后没有及时删除,这些敏感信息的泄露将会增大服务器被渗透的风险
敏感信息查看与利用
- php版本信息
文章图片
- 系统的版本信息
文章图片
- Loaded Configuration File(配置文件位置)
php.ini
的位置
文章图片
- Registered PHP Streams(支持的流)
这个在文件包含,反序列化还有一些关键的bypass的时候非常有用
文章图片
- Registered Stream Filters(支持的流过滤器)
这个同样是在文件包含,反序列化还有一些关键的bypass的时候有用
文章图片
- allow_url_fopen & allow_url_include
allow_url_fopen
和allow_url_include
都为On的时候,则文件包含函数是可以加载远程文件的,可以利用远程文件包含漏洞直接执行任意命令。攻击者在自己的web服务器上放一个可执行的恶意文件,通过目标网站存在的远程文件包含漏洞来加载文件,从而实现执行任意命令的目的
文章图片
- disable_functions
命令执行,代码执行必看选项之一。该指令可用于禁止某些函数,接收逗号分隔的函数名列表作为参数,通过bypass目标站点的disable_functions
达成RCE
文章图片
- display_errors & display_startup_errors
文章图片
- open_basedir
文章图片
但是这个限制是可以绕过的,之前P牛给出了绕过方法-PHP绕过open_basedir列目录的研究
- short_open_tag
shell
文章图片
- phar
phar://
伪协议 ,可以不依赖反序列化函数 unserialize()
直接进行反序列化的操作文章图片
- session
查看session的相关配置,在文件包含和反序列化的时候有用
文章图片
- SERVER_ADDR
文章图片
- _FILE["file"]
- _SERVER["PATH"]
文章图片
- _SERVER["SCRIPT_FILENAME"]
文章图片
- Gopher
- Fastcgi
- 支持的程序
phpinfo()
查看一些特殊的程序服务,比如redis
,memcache
,mysql
,Smtp
,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
进群
,一起来聊天吹水哇,以及一个会发布安全相关内容的公众号,欢迎关注文章图片
文章图片
推荐阅读
- 面试|面试官(看到你熟练性能调优,可以说一下你对MySQL索引的理解())
- 怎么高效的使用HTTP代理IP
- Vue3|Vue3 渲染器分析
- spring源码|Spring源码解析十八
- mapboxgl 地图样式 - 重分类渲染
- 敏捷小游戏的思考[上]
- TiDB 可观测性方案落地探索 | “我们这么菜评委不会生气吧”团队访谈
- 当el-input 失去焦点时触发blur 事件用法, 可以获取input 的其他属性值
- python|来聊聊SourceMap
- 对不起,今天该发的微软认证推文,我们没写