源码下载链接 : http://www.mycodes.net/42/10184.htm

0x00 前言

碰巧这段时间在学习php语言 便想着通过代码审计 来了解到 一些漏洞 也有助于以后找漏洞经验的增长

由于我水平比较菜 所以我这里就先使用seay这款源码审计工具 先进行审计 然后针对源码进行自我的分析

0x01 任意文件删除漏洞

#源码分析阶段

首先使用seay审计工具进行审计

根据工具的提示我们转到如下的代码行进行审计

is_file函数:检查文件是否是正常文件

@unlink(): 删除文件

所以有可能这个任意文件删除就是通过这个函数来实现的

一步步来进行分析和查看

@unlink函数种的参数是$_pic 进行追踪

1 function delpic($pics){
2    if(!empty($pics))
3    {
4        $pic_arr = explode(",",$pics);
5        foreach($pic_arr as $pic){
6           $_pic = str_replace('..','',ROOT_PATH.$pic); 
7 // 这里对 .. 做了一个处理 防止用户通过构造 ../ 来返回上一个文件夹
8           if(is_file($_pic))   // 通过if判断是否是合法的文件
9           {
10             @unlink($_pic);    // unlink函数实现文件的删除
11           }
12        } 
13    }

在第十行 unlink的参数 $_pic 的上一步是$pic 也就是第六行

foreach函数 是php里面数组遍历的意思

explode函数 使用一个字符串分割另一个字符串

然后$pic_arr 是delpic这个函数所带入进来的 所以如果$pics这个参数可控的话 我们就可以进行任意文件删除的操作了

继续看 我们需要去寻找delpic这个函数其他出现的地方 由于对当前这个文件已经搜索过了发现没有 所以这里我们进行全局搜索 结果如下

我们这里可以看到有很多结果 所以我们需要一个个的去观察 发现第四个里面有蹊跷

这里我们可以发现 函数获取的数值 $pic是通过post 的请求进行获取的 所以在这个api接口中我们通过post 的请求进行修改$pic的数值 就有可能达到任意文件删除

# 漏洞验证

这个就是那个通过post方式接受的我们参数的链接的地方

由于之前审计过 参数是 pic 所以我们现在目录下新建一个1.txt 观察是否可以进行任意文件删除

这是数据包未发送之前 文件夹下有 1.txt

数据包发包之后发现这个文件被删除了

我们可以通过改变pic的参数路径来进行任意文件的删除

0x03 修改措施

对pic参数路径进行严格规定 新版本已经修复了这个问题

我们可以看到这里 58行增加了一行代码 通过正则表达式来进行匹配文件路径 这就相当于限定了文件路径只能是 /assets/file/下 所以这样用户就不能自定义这个参数了

0x04 总结

在这个过程中学到了很多 平时都只是听过任意文件删除也没有具体去了解 实践过 通过这个代码审计然后复现的 使我对漏洞的形成原因有了更加深刻的理解

发表评论

电子邮件地址不会被公开。 必填项已用*标注