一、知识点
1.文件操作类代码编写
2.文件上传&下载&删除
任意文件上传 任意文件下载 任意文件删除
1.代码自主写 1.直连URL访问 1.文件删除
2.编辑器引用 2.传参头部修改 2.文件夹删除
3.文件内容&读取&写入
4.第三方编辑器引用实例
二、文件上传类
1.代码自主写
①在www/blog路径下创建一个file文件夹,新建一个file-upload.php
②搜索“HTML 上传表单”,html构造一个显示的页面,php用来接收我上传的文件并把文件进行处理
搜索“PHP $_FILES”变量用法
在上传文件后会输出文件名、类型、大小等
③move_uploaded_file() 函数
基于(类型,格式)验证来判断是否有文件上传漏洞!!!
2.编辑器引用
Ueditor:第三方软件小应用
①把ueditor文件夹复制到file目录下,加入这几行代码
②可以实现文件上传
3.二者区别
1.自写代码上传:自己测试
2.外部编辑器实现:核心代码在编辑器里,是编辑器进行验证,若编辑器过滤很好就没办法了
3.框架类实现:如thinkphp框架,和编辑器类似,都是别人写好的代码封装在一起,要实现什么功能直接调用,核心代码由对方决定,而不是你自己决定
三、文件下载类
在file目录下新建file_down.php
直连下载;http://www.xiaodi8.com/soft/软件.zip
传参下载:http://www.xiaodi8.com/soft/down.php?filename=软件.zip
一般访问网站,有的网站功能里有文件下载
1.直连下载
①soft文件夹放入file目录下
②PHP数组取值
③直连下载
<html lang="en">
<head>
<meta charset="UTF-8">
<title>文件下载</title>
</head>
<body>
<h1>直连下载</h1>
<?php getfilename();?>
<form action="" method="post">
需要下载的文件<input type="text" name="name">
<input type="submit" value="下载">
</form>
<?php $name=$_POST['name'];geturldown($name);?>
<h1>传参下载</h1>
</body>
</html>
<?php
function getfilename()
{
$filepath = getcwd();//获取当前脚本目录
$filename = scandir($filepath . '/soft');
//var_dump($filename);//打印
foreach ($filename as $value){
if ($value != '.' && $value != '..') {
$arr[] = $value;
echo $value.'<br>';
}
}
}
function geturldown($name){
$url='http://'.$_SERVER['HTTP_HOST'].'blog/file/soft/'.$name;
//echo $url;
header("location: $url");//直接重定向到这个地址
}
?>
2.传参下载
function getdown($name){
$filename = $name;
$download_path = "soft/";
if(eregi("\.\.", $filename)) die("抱歉,你不能下载该文件!");
$file = str_replace("..", "", $filename);
if(eregi("\.ht.+", $filename)) die("抱歉,你不能下载该文件!");
// 创建文件下载路径
$file = "$download_path$file";
// 判断文件是否存在
if(!file_exists($file)) die("抱歉,文件不存在!");
// 文件类型,作为头部发送给浏览器
$type = filetype($file);
// 获取时间和日期
$today = date("F j, Y, g:i a");
$time = time();
// 发送文件头部
/*
header("Content-type: $type");
header("Content-Disposition: attachment;filename=$filename");
header("Content-Transfer-Encoding: binary");
header('Pragma: no-cache');
header('Expires: 0');
*/
// 发送文件内容
set_time_limit(0);
readfile($file);
}
3.总结
直连下载是安全的,只能下载zip,exe之类支撑协议的才能下载(由中间件决定)
传参下载有安全问题,如果更改参数可能会下载php文件
四、文件删除类
文件/文件夹
<html lang="en">
<head>
<meta charset="UTF-8">
<title>文件删除</title>
</head>
<body>
<h1>文件删除</h1>
<?php getfilename(); ?>
<form action="" method="post">
需要删除的文件:<input type="text" name="filename">
<input type="submit" value="删除">
</form>
<?php @$name=$_POST['filename'];filedel($name);?>
<h1>文件夹删除</h1>
<?php getfilename()?>
<form action="" method="post">
需要删除的文件夹:<input type="text" name="filedir">
<input type="submit" value="删除">
</form>
<?php @$dir=$_POST['filedir'];filedeldir($dir);?>
</body>
</html>
<?php
function getfilename(){
$dir=getcwd();
$file=scandir($dir);
foreach ($file as $value){
if($value != '.' && $value != '..') {
$arr[] = $value;
echo $value.'<br>';
}
}
}
//自定义文件删除函数
function filedel($name){
@unlink($name);
}
//自定义文件夹删除函数
function filedeldir($dir){
@rmdir($dir);
}
?>
unlink()删除文件
rmdir()删除文件夹
五、文件操作类
<html lang="en">
<head>
<meta charset="UTF-8">
<title>文件内容操作</title>
</head>
<body>
<h1>文件列表</h1>
<?php getfilename(); ?>
<h1>读取操作</h1>
<form action="" method="post">
需要读取的文件<input type="text" name="r">
<input type="submit" value="读取">
</form>
<?php @$name=$_POST['r'];fileread($name);?>
<h1>写入操作</h1>
<form action="" method="post">
文件:<input type="text" name="w">
内容:<input type="text" name="txt">
<input type="submit" value="写入">
</form>
<?php @$name=$_POST['w'];@$txt=$_POST['txt'];filewrite($name,$txt);?>
</body>
</html>
<?php
//自定义文件文件夹读取函数
function getfilename(){
$dir=getcwd();
$file=scandir($dir);
foreach ($file as $value){
if($value != '.' && $value != '..') {
$arr[] = $value;
echo $value.'<br>';
}
}
}
//自定义文件读取函数
function fileread($name){
$f=fopen($name,"r");
$code=fread($f,filesize($name));
echo $code;
fclose($f);
}
//自定义文件写入函数
function filewrite($name,$txt){
$f=fopen($name,"a+");//打开文件为读/写,如果不存在会创建
fwrite($f,$txt);
fclose($f);
}
?>
六、添加功能
①在index.php中修改
②新建file.php并写入代码
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>小迪博客</title>
<style type="text/css">
.nav li{
background-color: yellow;
padding: 8px 15px;
float: left;
list-style: none;
color:#fff;
}
</style>
</head>
<body>
<ul class="nav">
<li><a href="file-upload.php">文件上传</a></li>
<li><a href="file-del.php">文件删除</a></li>
<li><a href="file-down.php">文件下载</a></li>
<li><a href="file-rw.php">文件内容操作</a></li>
</ul>
总结
web漏洞的两个核心
1.可控变量
2.特定函数
什么函数决定什么漏洞,可控变量是决定有没有漏洞的原因。