文件上传类:-任意文件上传
知识回顾:
前端入门须知:轻松学会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 "文件类型不正确";
}
?>
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() 等