通过实现PHP代码开发实现相关的功能,我们可以更好的了解漏洞产生的原理,以及那种方式会产生漏洞,哪种方式不会产生漏洞,以方便我们更好的选择相关的攻击方式

文件上传类

文件上传类总共包括两种方式,一种是代码自主写,另一种是引用相关的富文本编辑器

代码自主写

相关实现代码

@$file_name = $_FILES['upload']['name'];
@$file_type = $_FILES['upload']['type'];
@$file_size = $_FILES['upload']['size'];
@$file_tmpname = $_FILES['upload']['tmp_name'];
@$file_error = $_FILES['upload']['error'];
//执行检测上传文件类型
if ($file_type=='image/png')
{
if(!move_uploaded_file("$file_tmpname","upload/".$file_name)){
echo "上传失败";
}else{
echo "上传成功!";
echo "upload/".$file_name;
}
}else{
echo "文件上传错误!只允许上传图片格式";
}

其中$_FILES是PHP全局数组,用来展示上传文件的基本属性

move_uploaded_file(文件临时名,文件路径.文件名),其中在php中一般使用.来连接变量名

编辑器引用

引用别人写的相关的编辑器为js文件,即使用别人封装好的代码,例如以下相关代码

<script type="text/javascript" charset="utf-8" src="../../ueditor/ueditor.config.js"</script>

img

如果相关编辑器爆出相关漏洞,那么这个网站也会有相关漏洞,如果引用的编辑器没有任何漏洞,那么这个网站在文件上传方面就没有漏洞

总结:
自写代码验证上传:验证核心在自己写的代码里
引用外部编辑器实现:验证核心在编辑器
引用开发框架实现:验证核心在相关框架

文件下载类

直连URL访问

相关代码

function filenameurl($name){
$url='http://'.$_SERVER['HTTP_HOST'].'/blog/soft'.$name;
#header("$url"); //重定向到url网址
}

直连url下载,即访问相关url即下载相关文件,例如访问http://www.xxx.com/xxx.zip,会直接执行下载xxx.zip

但是直连下载也有一个特点,如果是zip、rar、png、jpg等文件,就会去下载,如果是php或者txt这一类文件,就会去执行,不会去下载,当然,php不会当作php执行,而是将其中的内容输出出来,并不会当作php文件执行

所以,如果是直连URL访问,那么是不可能存在漏洞的,因为参数是不可控的,就算传进去了php文件,也无法执行,只能看看

传参下载

<?php

$file_name = $_POST["file_name"]; // 下载文件名
$file_dir = "./"; // 下载文件存放目录
// 检查文件是否存在
if (!file_exists($file_dir . $file_name)) {
header('HTTP/1.1 404 NOT FOUND');
} else {
// 以只读和二进制模式打开文件
$file = fopen($file_dir . $file_name, "rb");

// 告诉浏览器这是一个文件流格式的文件
Header("Content-type: application/octet-stream");
// 请求范围的度量单位
Header("Accept-Ranges: bytes");
// Content-Length是指定包含于请求或响应中数据的字节长度
Header("Accept-Length: " . filesize($file_dir . $file_name));
// 用来告诉浏览器,文件是可以当做附件被下载,下载后的文件名称为$file_name该变量的值。
Header("Content-Disposition: attachment; filename=" . $file_name);

// 读取文件内容并直接输出到浏览器
echo fread($file, filesize($file_dir . $file_name));
fclose($file);

exit ();
}

从这串代码可以看出,传参下载的参数我们是可以控制的,并且传参下载是通过文件流的形式一点一点返回的,即无论是否是php还是zip,都会进行下载处理,并且php代码会被执行,并不是简简单单的打开php代码

所以这种方式进行文件下载是有漏洞的,如果后端没有对传入的参数进行过滤,我们就可以实现任意文件访问

形如http://www.xxx.com/?filename=

文件删除类

文件删除

function filedel($name){
@unlink($name);
}

文件夹删除

function filedeldir($dir){
@rmdir($dir);
}

无论是文件还是文件夹的删除,如果导致了任意文件删除,那么非常可能造成源码被删,网站崩溃

文件内容操作类

文件读取

function fileread($name){
$f=@fopen($name,"r");//fopen函数用来打开一个文件或者url,mode的r代表"只读"
$code=@fread($f,filesize($name));//fread(读取的文件,读取到哪个位置)函数代表读取打开的文件,filesize代表返回文件的最大字节,
echo $code;
@fclose($f);//关闭打开的文件
}

文件写入

function filewrite($name,$txt){
$f=fopen($name,"a+");//以读写方式打开文件
fwrite($f,$txt);//fwrite(写入的文件名,写入的内容)
fclose($f);
}

文件读取和文件写入都存在后门植入的风险