PHP 7.1 本身不内置 SSRF 检测能力,需通过代码审查、运行时监控和请求行为分析三类方式主动识别风险点,重点排查 file_get_contents()、curl_exec() 等高危函数是否直接使用未校验的用户输入。

PHP 7.1 本身不内置 SSRF 检测能力,但你可以通过代码层审查、运行时监控和请求行为分析三类方式主动识别 SSRF 风险点。关键不是“PHP 版本能检测”,而是你如何在 PHP 7.1 环境中构建有效的检测逻辑。
重点检查易触发 SSRF 的 PHP 函数调用
PHP 7.1 中常见发起网络/文件请求的函数是 SSRF 的高危入口,需逐个排查是否直接使用用户可控输入:
-
file_get_contents():若参数来自
$_GET['url']或$_POST['src'],且未校验协议和域名,极易触发 SSRF -
curl_exec():检查
curl_setopt($ch, CURLOPT_URL, $user_input)是否跳过白名单校验 -
fopen() / readfile() / file():当支持
file://、php://filter或data://协议时,可能被用于读取本地敏感文件(如/etc/passwd) - fsockopen() / stream_socket_client():可被用于端口探测或内网服务交互,尤其危险在未限制目标 IP 段
构造可控测试用例验证是否存在响应差异
手动验证比依赖扫描器更可靠。对疑似功能点(如图片加载、URL 预览、远程导入)尝试以下 payload,观察响应状态与内容变化:
- 用内网地址测试:
?url=http://127.0.0.1:80→ 看是否返回 200 或超时而非拒绝 - 用 file 协议读取本地文件:
?url=file:///etc/hosts→ 看是否回显文件内容 - 用 DNSLog 验证请求发出:
?url=http://xxx.ceye.io(替换为你的 DNSLog 域名)→ 查看 DNS 解析日志是否记录 - 用 Gopher 协议探测 Redis:
?url=gopher://127.0.0.1:6379/_INFO→ 观察是否返回 Redis 信息
在代码中加入轻量级运行时检测逻辑
无需升级框架,只需在关键请求函数前加一层校验。例如封装一个安全的 safe_curl_get():
立即学习“PHP免费学习笔记(深入)”;
- 解析用户传入 URL 的 host 和 scheme,拒绝
file://、gopher://、dict://等高危协议 - 将 host 转为 IP 后判断是否属于私有地址段(
127.0.0.0/8、10.0.0.0/8、172.16.0.0/12、192.168.0.0/16) - 对域名做 DNS 解析并缓存结果,避免绕过(防止攻击者用
localhost、127.0.0.1.xip.io等变体) - 记录所有被拦截的请求到日志,便于后续审计
配合日志与网络层辅助确认
单靠 PHP 层不够,需交叉验证:
- 开启 PHP 的
error_log和access_log,搜索含127.0.0.1、10.、192.168.的出站请求记录 - 在服务器防火墙或代理层(如 Nginx、iptables)配置出站连接日志,抓取 PHP 进程发起的异常内网请求
- 使用
tcpdump抓包过滤 PHP-FPM 进程的 HTTP 流量:tcpdump -i any -n port 80 or port 443 and src host 127.0.0.1



















