dvwa文件上传漏洞
DVWA文件上传漏洞:一个上传框就能让服务器沦陷
把一张图片改成.php后缀,文件再点上传,上传服务器就归你了。漏洞这不是文件黑客电影桥段,而是上传DVWA(Damn Vulnerable Web Application)里最直观的漏洞演示。DVWA是漏洞个故意造得千疮百孔的靶场,专门给安全学习者练手。文件它的上传文件上传模块,把Web安全里最致命的漏洞一类问题剥得干干净净摆在你面前。
先看low级别的文件代码。它只检查了文件类型和大小,上传而且检查方式粗暴得可笑——$_FILES['uploaded']['type']直接读客户端传来的漏洞MIME类型。这意味着攻击者用Burp Suite拦截请求,文件把Content-Type从image/jpeg改成text/php,上传再上传一个内容为<?漏洞php system($_GET['cmd']);?>的文件,就能获得一个WebShell。
更讽刺的是,DVWA把上传目录直接放在/hackable/uploads/下,路径公开可预测。上传成功后,访问http://target/dvwa/hackable/uploads/shell.php?cmd=whoami,服务器就把当前用户身份吐出来了。整个过程不超过两分钟,不需要任何绕过技巧,纯粹是代码写得“太诚实”——它完全信任了不该信任的输入。
Medium级别稍微加了点料,用getimagesize()检查文件是否为有效图片,还限制文件后缀必须是.jpg或.png。但道高一尺魔高一丈——攻击者可以构造一个图片马:在GIF文件的注释区塞入PHP代码,后缀改成.php.jpg。服务器端的getimagesize()会认为它是合法图片,但Apache配置如果允许.php.jpg按PHP解析(很多老旧环境确实如此),照样执行代码。这里有个细节:DVWA的medium代码只检查了MIME和后缀,却忘了检查文件内容是否真的匹配图片格式,或者更准确说,它没阻止“图片里的额外内容”。
High级别就严谨多了,它用getimagesize()验证图片尺寸,用pathinfo()强制后缀必须是白名单内的,还把上传路径随机化——文件名改成MD5值加随机串。这时候再想上传可执行文件,就得配合文件包含漏洞(比如DVWA的File Inclusion模块)才能利用。但High级别依然有个细节漏洞:它没检查文件内容是否包含<?php标签,攻击者可以在合法图片末尾追加代码,再通过本地文件包含触发执行。不过这已经属于组合拳范畴,单靠上传本身已经很难直接拿Shell。
说实话,这个靶场的设计逻辑很直白:每一级都对应真实世界的一种防御方案,但每种方案都有它的盲区。low对应“完全不过滤”的烂代码,medium对应“检查了但没检查到位”的半吊子方案,high对应“基本靠谱但仍有边界”的常规做法。现实中很多CMS的附件上传功能,至今还停留在medium水平——比如某些国产建站系统,用黑名单过滤.php,但忘了拦截.phtml、.php5这种变种后缀。
我自己测试过一个电商后台,它允许上传Excel文件做批量导入,但只检查了扩展名是.xlsx。我拿一个包含PHP代码的zip压缩包,改名为.xlsx传上去,服务器解压时没做任何安全校验,直接解压到web根目录——用中国菜刀连上去,服务器的D:\wwwroot目录像自家硬盘一样摊开。那个站点后来被安全公司扫描出来,报了个“高危文件上传漏洞”,修复方式是加了个随机文件名前缀。你看,连真实世界的修复都这么敷衍。
回到DVWA本身,它最狠的地方在于把漏洞的“可触发性”展示得淋漓尽致。很多人以为上传漏洞需要什么高深技巧,其实只要抓住两个核心:一是服务器端是否验证了文件内容(而不是只信客户端),二是上传后的文件能否被当作脚本执行。DVWA的low和medium恰好演示了这两种失败模式,而high则告诉你,即使你过滤了后缀和类型,只要服务器解析逻辑有瑕疵,还是能绕过去。
学这个模块时,我建议你亲手把每一级的攻击过程走一遍。别光看文档——自己改Content-Type、自己构造图片马、自己用Burp的Repeater改请求,比读十篇分析文章都管用。当你看到cmd=whoami返回www-data的那一刻,那种“我居然真的黑进去了”的兴奋感,会让你对“输入校验”这四个字产生生理性的敬畏。
