渗透学习13 - PHP 开发-个人博客项目&文件操作类&编辑器&上传下载删除读写

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

知识回顾:

前端入门须知:轻松学会form表单制作
前端HTML基础之form表单

1、自己写的上传代码

HTML 中有个上传表单, PHP的$FILES函数会得到上传的文件的全部信息
文件上传后还需要移动文件

1、服务器写好文件上传页面
2、客户端请求,服务端返回文件上传页面,并进行文件上传
3、服务器收到上传文件,首先将文件存储到tmp临时存储目录下,然后通过php脚本判断是否满足上传文件标准
4、满足标准,将临时目录文件重命名并移动到服务器指定目录;不满足条件,将临时目录文件删除。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>文件上传</title>
</head>
<body>
<form id="upload-form"action="" method="post" enctype="multipart/form-data">
    <input type="file" name="upload" id="upload">
    <input type="submit" value="Upload">
</form>
</body>
</html>

<?php
$name=$_FILES['upload']['name'];
$type=$_FILES['upload']['type'];
$size=$_FILES['upload']['size'];
$tmp_name=$_FILES['upload']['tmp_name'];
$error=$_FILES['upload']['error'];
echo $name."<br>";
echo $type."<br>";
echo $size."<br>";
echo $tmp_name."<br>";
echo $error."<br>";
?>

如图
输出的是上传文件的各种属性。

把文件验证并进行移动

代码审计角度看是否有漏洞,就是看其验证过程是否完整

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>文件上传</title>
</head>
<body>
<form id="upload-form"action="" method="post" enctype="multipart/form-data">
    <input type="file" name="upload" id="upload">
    <input type="submit" value="Upload">
</form>
</body>
</html>

<?php

$name=$_FILES['upload']['name'];
$type=$_FILES['upload']['type'];
$size=$_FILES['upload']['size'];
$tmp_name=$_FILES['upload']['tmp_name'];
$error=$_FILES['upload']['error'];

echo $name."<br>";
echo $type."<br>";
echo $size."<br>";
echo $tmp_name."<br>";
echo $error."<br>";
//移动文件 ==== 进一步思考,先验证文件,再移动文件
if($type=='image/png'){
    if(!move_uploaded_file($tmp_name,'upload/'.$name)){
        echo "文件移动失败";
    }else{
        echo "文件移动成功";
        echo '/upload/'.$name;
    }
}else{
    echo "文件类型不正确";
}
?>

PHP $_FILES函数详解

2、编辑器默认上传功能,如UEditor等

网站只是引用编辑器而已,核心的验证代码是属于编辑器本身的,如果编辑器本身没有漏洞,那就没办法了。框架与其类似,核心代码都是别人写好了的,并不是自己写的,那就得看编辑器或者框架本身有无漏洞了。老版本也许有。渗透测试的时候,先搞清楚,上传功能是编辑器呢还是框架还是自己写的,前者是公开发布的产品,后者是自己写的,每个人写来的都不一样,需要自己挨个测

文件上传类
1、自写代码验证上传 // 验证核心在代码里
2、引用外部编辑器实现上传 // 验证核心在编辑器
3、引用外部框架实现上传 //验证核心在框架

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

1、直连 URL 访问下载
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>文件下载</title>
</head>
<body>
<h1>直连下载</h1>
//类似与这种 xiaodi8.com/software/tools.rar
<form action="" method="post">
    <input type="text" name="filename">
    <input type="submit" value="下载">
</form>
<?php
$filename=$_POST['filename'];
filenameurl($filename);
?>
//自定义文件直连下载,需要获得用户提交的文件名称,然后拼凑出url进行下载
<?php
//自定义文件夹读取函数.获取指定路径下的目录
function getfilename(){
    $path=getcwd();//获取当前文件所在的目录
    $file=scandir($path.'/soft');//获取指定目录存在的文件
    foreach ($file as $value){
        if($value != '.' && $value != '..') {
            $arr[] = $value;
            echo $value.'<br>';
        }
    }
}
getfilename();
?>
<h1>传参下载</h1>


</body>
</html>
<?php
function filenameurl($filename){
    $downloadurl='http://'.$_SERVER['HTTP_HOST'].'/blog/file/soft/'.$filename;
    header("location:$downloadurl");
}
?>

2、传参头部修改下载

类似于这种 xiaodi8.com/software/download.php?filename=tools.rar
类似与这种 xiaodi8.com/software/tools.rar
对于直连下载来说,如果提交的是php文件或配置文件,访问链接的时候,它会执行那个PHP文件,把他当成普通的php网页进行解析。即使修改tool.rar也没用,比如 xiaodi8.com/software/index.php , 中间件一般默认的只会下载诸如 zip/rar/exe等类型的文件。这种模式下载是比较安全的,不会有任意文件下载漏洞。 而对于传参下载则不同,它是直接下载整个文件,如果传递的是诸如1.php等文件,它则将1.php整个文件直接下载下来,则可能造成各种代码或敏感信息泄露 , *这里必须要有个可修改的参数

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

1、文件删除
2、文件夹删除

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

1、文件读取
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>文件读取</title>
</head>
<body>
<h1>文件读取</h1>
<form action="" method="post">
    <input type="text" name="read">
    <input type="submit" value="读取">
</form>
<?php
$filename=$_POST['read']; fileread($filename);
?>
<h1>文件写入</h1>
</body>
</html>
<?php
function fileread($filename){
  $f=fopen($filename,"r");
  $content=fread($f,filesize($filename));
  echo $content;
  fclose($f);
}
?>

在这里插入图片描述

2、文件写入
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>文件读取</title>
</head>
<body>
<h1>文件写入</h1>
<form action="" method="post">
   文件: <input type="text" name="r">
   内容:<input type="text" name="txt">
    <input type="submit" value="写入">
</form>
<?php
$txt=$_POST['txt']; $r=$_POST['r'];filewrite($txt,$r);
?>
</body>
</html>
<?php
function filewrite($txt,$r){
  $f=fopen($r,"a+");
 fwrite($f,$txt);
    fclose($f);
}
?>

在这里插入图片描述

文件包含-任意文件包含

<?php
//include('2.txt');
//把2.txt 当成php文件来执行
//2.txt 即是可控变量
// 远程文件 本地文件
$file=$_GET['x'];
include($file);
//http://localhost/blog/file/file-include.php?x=1.txt
//http://localhost/blog/file/file-include.php?x=www.cctv.com/a.php  远程文件
//攻击: 上传一个图片,得到图片的路径。尝试包含此图片,图片里面有后门代码
?>

在这里插入图片描述
在这里插入图片描述

1、本地文件包含
2、远程文件包含

#Web 漏洞核心:

1、可控变量
2、特定函数- , 什么函数决定什么漏洞
3、函数的多样化 - 多个实现功能的函数都可能造成漏洞, 比如文件包含, 除了include外,还有include_once(), require(),require_once() 等

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值