影风博客

代码审计的艺术系列 第十篇

2019-03-23

0x00 前言:

本篇介绍的是任意文件下载和删除也是审计必备的技能之一,主要分为危险函数、文件下载和文件删除三方面展开。

0x01 危险函数:

文件下载危险函数:file_get_contents()fopen()

文件删除危险函数:unlink()

0x02 文件下载:

文件下载漏洞通常出现在像download.phpfile.php类似这种名字的程序里。精准的搜索方法还是搜file_get_contents()fopen()等函数,之前某oa系统就存在使用file_get_contents()这个函数导致的文件下载漏洞,

其缺陷代码如下:

<?php
$fileurl=$_REQUEST['url'];
//判断文件是否存在逻辑
$content=file_get_contents($fileurl);
echo $content;
?>

测试发现成功读取了文件内容:

使用fopen()函数不当也容易出现这种漏洞,之前出现过的漏洞代码如下:

<?php
$filename=$_GET['name'];
$filename_AND_path= 'D:\\phpStudy\\PHPTutorial\\WWW\\'.$filename;
$file=fopen($filename_AND_path,"r");
if (!$file) {
    exit("file not found");
}
header("Content-Type: application/octet-stream");
header("Access-Ranges:bytes");
header("Access-Length:".filesize($filename_AND_path));
header("Content-Disposition:attachment;filename=$filename");
echo fread($file,filesize($filename_AND_path));
fclose($file);
?>

尝试发现可以继续下载任意文件了

http://localhost/filedown.php?name=phpinfo.php

当然文件下载相关的函数不止这两个,还请自行搜寻和积累~

0x03 文件删除:

程序员在码代码使用了unlink()等函数之前未对传入的文件名或路径做有效的校验,从而被黑客利用删除任意文件造成损失。之前某知名的Mail系统就存在这一漏洞,缺陷代码如下:

<?php
$fileUrl=isset($_GET['fileUrl'])?$_GET['fileUrl']:'../uploads/text1.txt';
if(file_exists($fileUrl)){
    echo "1";
}else {
    echo $fileUrl;
}
if ($fileUrl and is_file($fileUrl)) {
    @unlink($fileUrl);
}
?>

本地测试发现返回为1,证明删除了db.sql文件

http://localhost/deleteFile.php?fileUrl=db.sql

使用支付宝打赏
使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏

扫描二维码,分享此文章