原理
文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。这种攻击方式是最为直接和有效的,“文件上传”本身是没有问题,有问题的是文件上传后,服务器怎么处理、解释文件。如果服务器的处理逻辑做的不够安全,则会导致严重的后果。
漏洞危害
上传文件的时,服务器端脚本语言未对上传的文件进行严格的验证和过滤,就有可能上传恶意的文件,从而控制整个网站,甚至是服务器。
漏洞条件
- 文件可上传
- 知道文件上传的路径
- 上传文件可以被访问
- 上传文件可以被执行
文件上传可控点
- Content-Length,即上传内容大小
- MAX_FILE_SIZE,即上传内容的最大长度,一般在php.ini文件中设置
- filename,即上传文件名
- Content-Type,即上传文件类型
- 请求包中的乱码字段,即是所上传文件的内容
- 有可能存在请求包中的可控点还有上传路径,只是上面的示例中没有出现
挖掘思路
- 上传点都调用同一个上传类,直接全局搜索上传函数
- 黑盒寻找上传点,代码定位
代码展示
upload.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>文件上传漏洞</title>
</head>
<body>
<form action="upload.php" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit" name="文件上传">
<input type="hidden" name="">
</form>
</body>
</html>
upload.php
<?php
header("Content-Type:text/html;charset=utf-8");
$upload_dir = "C:\Program Files\PHPStudy\WWW\PHP\upload";
if(isset($_FILES['file'])){
$upload_name = $upload_dir . "\\" . $_FILES['file']['name'];
move_uploaded_file($_FILES['file']['tmp_name'],$upload_name);
echo "Type:". $_FILES['file']['type'] . "<br>";
echo "Size:". ($_FILES['file']['size'] / 1024) . "<br>";
echo "Name:". $_FILES['file']['name'];
}else{
echo "上传失败";
}
当我们点击上传1.php文件时,内容可以是一句话木马,显示上传成功
然后我们使用菜刀来连接,成功连接得到目录,在连接是一定要填写密码,密码即是一句话木马的内容
文件上传绕过-客户端
- 用firebug将form表单中的onsubmit事件删除
- 上传木马文件,Burp拦截数据包,修改扩展名
文件上传绕过-服务端
- 黑白名单过滤
- 修改MIME类型
- 截断上传攻击
- .htaccess文件攻击
- 目录验证
- htaccess 文件是Apache服务器中的一个配置文件,用于实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能
修复方案
- 检测文件上传内容
- 黑白名单验证,检测文件扩展名是否合法
- MIME验证,检测文件的MIME类型
- 限制文件大小
- 更改临时文件夹的路径
- 读取上传文件的绝对路径 与文件名称
- 隐藏文件路径