小迪安全 Web安全 基础入门 – 第十三天 – PHP开发 – 个人博客项目&文件操作类&编辑器&上传下载删除读写


一、文件上传类:-任意文件上传

(一)分类

1、自主编写的代码中包含任意文件上传。

2、站点使用的编辑器代码中引用了任意文件上传。

(二)代码示例

<?php
//设置上传文件过滤
if((($_FILES["file"]["type"] == "image/gif")
||($_FILES["file"]["type"] == "image/jpeg")
||($_FILES["file"]["type"] == "image/jpg")
||($_FILES["file"]["type"] == "image/png")
||($_FILES["file"]["type"] == "image/pjpeg"))
||($_FILES["file"]["size"] < 20000))
{
    //如果存在错误
    if($_FILES["file"]["error"] >0){
        echo "Error: " . $_FILES["file"]["error"] . "
"; }else{ //文件名 echo "Upload: ". $_FILES["file"]["name"] . "
"; //文件类型 echo "Type: " . $_FILES["file"]["type"] . "
"; //文件大小 echo "Size: " . ($_FILES["file"]["size"] / 1024) . "Kb
"; //存储在服务器的文件的临时副本名称 echo "上传文件的临时副本名: " . $_FILES["file"]["tmp_name"] . "
"; } //如果文件已存在 if(file_exists("upload/" . $_FILES["file"]["name"])){ echo $_FILES["file"]["name"] . "已存在。"; }else{//若文件不存在,把上传的文件保存到其他位置 move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]); echo "文件保存位置:" . "upload/" . $_FILES["file"]["name"] . "
"; } }else{//若上传的文件不满足过滤条件 echo "无效文件!"; } ?>

二、文件下载类:-任意文件下载

(一)分类

1、直连URL访问。下载文件以直连URL形式访问,链接写死。

2、传参头部修改。对下载文件的URL进行过滤,不直接访问。

(二)代码示例


    
        
        文件下载
    
    
        

直连下载

<?php getfilename(); ?>
需要下载的文件:
<?php $name=$_POST['name'];geturldown($name); ?>

传参下载

<?php function getfilename(){ //获取当前脚本目录 $filepath = getcwd(); //扫描upload目录 $filename = scandir($filepath.'/upload/'); //输出upload目录下的文 //var_dump($filename); echo "
"; //过滤数组,只输出值 foreach($filename as $value){ if($value != '.' && $value != '..'){ $arr[] = $value; echo $value . "
"; } } } function geturldown($name){ $url = 'http://' . $_SERVER['HTTP_HOST'] . '/file/upload/' . $name; header("Location:$url"); echo $url . "
"; exit; } ?>

三、文件删除类-任意文件删除

(一)分类

1、文件删除。

2、文件夹删除。

(二)代码示例


    
        
        php文件删除
    
    
        

php文件删除

<?php getfilename();?>
需要删除的文件:
<?php $name=$_POST['name'];delfilename($name);?>

php文件夹删除

<?php getfilename();?>
需要删除的文件夹:
<?php $name=$_POST['name'];deldirfilename($name);?> <?php //遍历目录 function getfilename(){ $dir=getcwd(); $file=scandir($dir . '/upload/'); foreach($file as $value){ if($value != '.' && $value != '..'){ $arr[] = $value; echo $value . '
'; } } } //删除文件 function delfilename($name){ $dir=getcwd(); unlink($dir . '\upload\\' . $name); } //删除文件夹 function deldirfilename($name){ $dir=getcwd(); $file=scandir($dir); rmdir($dir . '\upload\\' . $name); } ?>

四、文件内容操作类-任意文件读取&写入

(一)分类

1、文件读取。

2、文件写入

(二)代码示例

<?php 
echo "

php文件读取

"; //读取webdictionary.txt文件 $myfile = fopen("webdictionary.txt","r"); //输出webdictionary.txt文件内容 //echo fread($myfile,filesize("webdictionary.txt")); //单行输出直到文件末尾 while(!feof($myfile)){ echo fgets($myfile) . "
"; } //关闭文件 fclose($myfile); echo "
"; ?> <?php echo "

php文件写入

"; //打开newfile文件,若文件不存在,则fopen()函数会创建这个文件 $myfile = fopen("newfile.txt","w"); //向newfile文件中写入数据 $txt = "Bill Gates\n"; fwrite($myfile,$txt); $txt = "Steve Jobs\n"; fwrite($myfile,$txt); fclose($myfile); $myfile = fopen("newfile.txt","r"); //逐行输出文件内容直至末尾 while(!feof($myfile)){ echo fgets($myfile) . "
"; } //关闭文件 fclose($myfile); ?>

五、文件包含-任意文件包含

(一)分类

1、本地文件包含。

2、远程文件包含。

(二)代码示例

创建一个名为include_file.php的文件,写入如下内容:

<?php
include('1.txt');
?>

在脚本当前目录下创建一个文件1.txt,在1.txt中写入如下内容:

<?php phpinfo(); ?>

执行include_file.php文件到浏览器中,浏览器会解析到phpinfo文件中去。

六、Web漏洞核心

(一)可控变量

1、漏洞利用的一个重要思路就是寻找可控变量

2、用户通过站点中存在的可控变量,进而控制被调用的文件,从而实现对站点入侵

(二)特定函数-函数的多样化

由于代码中使用的某些特定函数对用户输入数据处理不当,当用户利用这些特定函数注入恶意程序时,可导致关键系统被控制的漏洞可以劫持程序执行流程,转向执行攻击者指定的任意指令、代码等,从而实现对站点的入侵。