我们在渗透测试的过程中,如果存在phpinfo界面,我们会想到什么?
关于phpinfo
PHP中提供了PHPInfo()
函数,该函数返回 PHP 的所有信息,包括了 PHP 的编译选项及扩充配置、PHP 版本、服务器信息及环境变量、PHP 环境变量、操作系统版本信息、路径及环境变量配置、HTTP 标头、及版权宣告等信息。
我们编写test.php
文件
<?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
文件包含还有反序列化重点关注,在文件系统函数 ( file_get_contents 、 unlink 等)参数可控的情况下,配合 phar://
伪协议 ,可以不依赖反序列化函数 unserialize()
直接进行反序列化的操作
-
session 查看session的相关配置,在文件包含和反序列化的时候有用
-
SERVER_ADDR
真实IP
-
_FILE["file"]
获取临时文件名字和路径,本地文件包含GetShell
-
_SERVER["PATH"]
这是windows下特有的,能显示出系统的所有环境变量
-
_SERVER["SCRIPT_FILENAME"]
找到网站的绝对路径
-
Gopher
可以配合SSRF发起攻击
-
Fastcgi
查看是否开启Fastcgi和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
ssl
ssl._create_default_https_context = ssl._create_unverified_context
class
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))
pass
return
self.parse_attack(result)
def
parse_attack
(self, result)
:
output = Output(self)
if
result:
output.success(result)
else
:
output.fail(
'Internet nothing returned'
)
return
output
register_poc(TestPOC)
参考链接
-
https://xz.aliyun.com/t/2222 -
https://xz.aliyun.com/t/521 -
https://www.k0rz3n.com/2019/02/12/PHPINFO%20%E4%B8%AD%E7%9A%84%E9%87%8D%E8%A6%81%E4%BF%A1%E6%81%AF/ -
https://xz.aliyun.com/t/5535
原文始发于微信公众号(猪猪谈安全):当我们看到phpinfo时在谈论什么
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论