dvwa-file inclusion&upload

file inclusion

文件包含是指当服务器开启allow_url_include选项时,就可以通过php的某些特性函数(include(),require()和include_once(),require_once())利用url去动态包含文件,此时如果没有对文件来源进行严格审查,就会导致任意文件读取或者任意命令执行。文件包含漏洞分为本地文件包含漏洞与远程文件包含漏洞,远程文件包含漏洞是因为开启了php配置中的allow_url_fopen选项(选项开启之后,服务器允许包含一个远程的文件)。

low

这边没有任何防御机制,那上传一个php文件试试

地址填错了不过这里会爆出文件地址

修改成功后,会弹出info相关信息但是我这里会消失就没截图了

medium

这边对”http://“, “https://“ “../“, “.."“进行了过滤,前面用双写绕过,后者并不能阻止我使用绝对地址(手动滑稽

http://127.0.0.1/dvwa/vulnerabilities/fi/?page=D:\phpStudy\PHPTutorial\WWW\dvwa\6.php

有趣的是我这里没进行双写,但是成功上传了

high

file? 读取本地文件用的不就是这个协议嘛

很奇怪,报错了

使用反斜杠即可

impossible

白名单的保护方式,除了以上四个文件其余的都不能打开。

file upload

上传文件漏洞,通常是由于对上传文件的类型、内容没有进行严格的过滤、检查,使得攻击者可以通过上传木马获取服务器的webshell权限,因此文件上传漏洞带来的危害常常是毁灭性的,Apache、Tomcat、Nginx等都曝出过文件上传漏洞。

low

这里并没有对文件名做任何检查,那直接上传php文件试试

上传成功,打开试试

medium

这里只支持上传jpeg或png格式的图片

抓个包看看

png和php文件上传还是有差,不如尝试改一下content-type

上传成功

有尝试过直接修改后缀然后上传,但是蚁剑连接不上。图片马的话是可以的

high

这里白名单检查文件名,用图片马即可绕过

同时也可以采取%00截断的方式进行上传,这里并没有上传成功

impossible

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
<?php



if( isset( $_POST[ 'Upload' ] ) ) {

// Check Anti-CSRF token

checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );





// File information

$uploaded_name = $_FILES[ 'uploaded' ][ 'name' ];

$uploaded_ext = substr( $uploaded_name, strrpos( $uploaded_name, '.' ) + 1);

$uploaded_size = $_FILES[ 'uploaded' ][ 'size' ];

$uploaded_type = $_FILES[ 'uploaded' ][ 'type' ];

$uploaded_tmp = $_FILES[ 'uploaded' ][ 'tmp_name' ];



// Where are we going to be writing to?

$target_path = DVWA_WEB_PAGE_TO_ROOT . 'hackable/uploads/';

//$target_file = basename( $uploaded_name, '.' . $uploaded_ext ) . '-';

$target_file = md5( uniqid() . $uploaded_name ) . '.' . $uploaded_ext;

$temp_file = ( ( ini_get( 'upload_tmp_dir' ) == '' ) ? ( sys_get_temp_dir() ) : ( ini_get( 'upload_tmp_dir' ) ) );

$temp_file .= DIRECTORY_SEPARATOR . md5( uniqid() . $uploaded_name ) . '.' . $uploaded_ext;



// Is it an image?

if( ( strtolower( $uploaded_ext ) == 'jpg' || strtolower( $uploaded_ext ) == 'jpeg' || strtolower( $uploaded_ext ) == 'png' ) &&

​ ( $uploaded_size < 100000 ) &&

​ ( $uploaded_type == 'image/jpeg' || $uploaded_type == 'image/png' ) &&

​ getimagesize( $uploaded_tmp ) ) {



// Strip any metadata, by re-encoding image (Note, using php-Imagick is recommended over php-GD)

if( $uploaded_type == 'image/jpeg' ) {

​ $img = imagecreatefromjpeg( $uploaded_tmp );

​ imagejpeg( $img, $temp_file, 100);

​ }

else {

​ $img = imagecreatefrompng( $uploaded_tmp );

​ imagepng( $img, $temp_file, 9);

​ }

​ imagedestroy( $img );



// Can we move the file to the web root from the temp folder?

if( rename( $temp_file, ( getcwd() . DIRECTORY_SEPARATOR . $target_path . $target_file ) ) ) {

// Yes!

​ $html .= "<pre><a href='${target_path}${target_file}'>${target_file}</a> succesfully uploaded!</pre>";

​ }

else {

// No

​ $html .= '<pre>Your image was not uploaded.</pre>';

​ }



// Delete any temp files

if( file_exists( $temp_file ) )

​ unlink( $temp_file );

}

else {

// Invalid file

​ $html .= '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>';

}

}



// Generate Anti-CSRF token

generateSessionToken();



?>


in_get(varname)

函数返回相应选项的值

imagecreatefromjpeg ( filename )

函数返回图片文件的图像标识,失败返回false

imagejpeg ( image , filename , quality)

从image图像以filename为文件名创建一个JPEG图像,可选参数quality,范围从 0(最差质量,文件更小)到 100(最佳质量,文件最大)。

imagedestroy( img )

函数销毁图像资源

可以看到,Impossible级别的代码对上传文件进行了重命名(为md5值,导致%00截断无法绕过过滤规则),加入Anti-CSRF token防护CSRF攻击,同时对文件的内容作了严格的检查,导致攻击者无法上传含有恶意脚本的文件。

参考资料:

https://www.freebuf.com/articles/web/119150.html

https://www.freebuf.com/articles/web/119467.html