游客发表
上传漏洞和解析漏洞经常被混为一谈,关于但它们的上传说法本质完全不同。一句话概括:上传漏洞是漏洞漏洞“门没锁”,解析漏洞是解析“钥匙能开错门”。前者是下列文件进了服务器,后者是正确服务器把文件当成了别的东西。
先看一个真实案例。关于某招聘网站允许用户上传简历附件,上传说法后端只校验了Content-Type头。漏洞漏洞攻击者把PHP代码伪装成image/jpeg上传,解析文件名是下列“resume.php.jpg”。服务器没拦,正确文件落盘。关于攻击者访问这个文件,上传说法服务器按静态图片返回,漏洞漏洞没执行——因为Apache配置里.jpg优先级高于.php。到这里,上传漏洞存在,但攻击没成功。真正致命的是后续:攻击者换了个文件名“resume.php%00.jpg”,老版本Apache识别到%00截断,把文件当作resume.php执行。这才是解析漏洞发威的时刻。
上传漏洞是“入口问题”。开发者没做好文件类型校验、扩展名过滤、文件内容检查,导致任意文件能进服务器。防护思路简单粗暴:白名单扩展名、重命名文件、用MIME和文件头双重校验、存储目录禁止执行脚本。但哪怕上传漏洞堵死了,解析漏洞依然可能让你功亏一篑。
解析漏洞是“处理逻辑问题”。服务器或中间件对文件名的解析规则有缺陷。最常见的三类:
一是Apache多后缀解析。Apache从右往左识别扩展名,遇到不认识的就跳过。比如“shell.php.abc”,Apache不认识.abc,回退到.php,于是按PHP执行。这种漏洞在旧版Apache里很常见,现在新版默认配置已经修复,但很多运维自己改配置时又踩回去。
二是IIS 6.0分号截断。IIS遇到分号会截断后面的内容。“shell.asp;.jpg”会被当作shell.asp执行。这个漏洞太老了,但有些政府网站还在用Windows Server 2003,照样中招。
三是Nginx配置错误。当用户上传图片,Nginx把它交给PHP-FPM处理时,如果配置了“cgi.fix_pathinfo=1”,那么“shell.jpg/anything.php”会触发PHP-FPM去执行shell.jpg里的PHP代码。这算Nginx+PHP组合的经典解析漏洞,很多CTF题目都考这个。
更麻烦的是,解析漏洞不一定只存在于中间件。文件存储系统、CDN、云对象存储也可能有类似问题。比如某些云存储服务会把“a.jpg/.php”解析成PHP执行,虽然这种很少见,但一旦踩中就是致命伤。
实战中,两类漏洞经常叠加利用。攻击者先绕过上传限制放一个“图片”上去,再通过解析漏洞让它变成可执行脚本。比如上传一个内容为PHP代码的GIF文件,后缀改成.gif,上传成功。然后访问“shell.gif%00.php”,如果服务器支持路径参数解析,就可能被当作PHP执行。整个过程,上传漏洞给了“素材”,解析漏洞给了“引爆点”。
防御上,不能只堵一边。上传端做白名单校验、文件重命名、内容头检测,这是基本功。解析端要确保中间件版本最新,关闭不必要的文件解析功能,Nginx里设置“cgi.fix_pathinfo=0”。但最关键的一招是:把上传目录和脚本执行目录彻底隔离。上传文件一律放在独立的静态资源域,不经过任何后端引擎。这样就算解析漏洞存在,攻击者也找不到能触发的路径。
说到底,上传漏洞是“入口把关不严”,解析漏洞是“内部机制有后门”。安全人员做测试时,往往先探测上传点,再尝试各种解析绕过手法。两者缺一不可,但真正让攻击者得逞的,通常是解析漏洞——因为上传漏洞即便存在,只要解析规则严格,恶意文件也只是躺在那里的死代码。反过来,解析漏洞再厉害,没有上传漏洞把文件送进去,也是巧妇难为无米之炊。所以两者是“配合型漏洞”,单防一个没用,必须双管齐下。
友情链接