文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
5.1.4 文件删除漏洞
文件删除漏洞出现在有文件管理功能的应用上比较多,这些应用一般也都有文件上传和读取等功能,它的漏洞原理跟文件读取漏洞是差不多的,不过是利用的函数不一样而已,一般也是因为删除的文件名可以用../跳转,或者没有限制当前用户只能删除他该有权限删除的文件。常出现这个漏洞的函数是 unlink(),不过老版本下 session_destroy() 函数也可以删除文件。
挖掘经验:
挖掘文件删除漏洞可以先去找相应的功能点,直接黑盒测试一下看能不能删除某个文件,如果删除不了,再去从执行流程去追提交的文件名参数的传递过程,这样查找起来比较精准。如果纯白盒挖的话,也可以去搜索带有变量参数的 unlink(),依然采用回溯变量的方式。关于 session_destroy() 函数删除任意文件的漏洞这里就不再举例了,因为在比较早的 PHP 版本就已经修复掉了这个问题,限制了 PHPSESSID 只能由“字母+数字+横杆”符号组成。
Metinfo 任意文件删除分析
这里的案例使用笔者之前发现的一个 metinfo 企业内容管理系统漏洞来说明,漏洞在 recovery.php 文件,代码如下:
if ( $action=='delete' ) { if ( is_array ( $filenames )) { foreach ( $filenames as $filename ) { if ( fileext ( $filename ) =='sql' ) { @unlink ( '../databack/'.$filename ); } } }else{ if ( fileext ( $filenames ) =='sql' ) { $filenamearray=explode ( ".sql" , $filenames ); @unlink ( '../../databack/'.$filenames ); @unlink ( '../../databack/sql/metinfo_'.$filenamearray[0].".zip" ); }else{ // 如果不是 SQL 文件,直接删除 @unlink ( '../../databack/'.$fileon.'/'.$filenames ); } }
这段代码首先判断请求的 action 参数的值是不是 delete,如果是则进入文件删除功能,在代码:
if ( fileext ( $filenames ) =='sql' ) {
判断如果不是 sql 文件后,就直接在 databack 目录删除提交的文件名,代码中$filenames 函数从 GET 中提交,只要请求:
/recovery.php?&action=delete&filenames=../../index.php
即可删除 index.php 文件。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论