源码下载链接 : 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 总结
在这个过程中学到了很多 平时都只是听过任意文件删除也没有具体去了解 实践过 通过这个代码审计然后复现的 使我对漏洞的形成原因有了更加深刻的理解