上一篇讲了文件上传漏洞和解析漏洞的基础,这一篇讲通过DVWA测试上传漏洞。
注意DVWA安装时要在'config.inc.php'文件中填写数据库密码(默认为空)。
配置好后默认帐号密码为:admin/password
低等级源码(未进行任何过滤):
<?php if (isset($_POST['Upload'])) { $target_path = DVWA_WEB_PAGE_TO_ROOT."hackable/uploads/"; #上传文件的路径. $target_path = $target_path . basename( $_FILES['uploaded']['name']); #获取上传文件的名称. if(!move_uploaded_file($_FILES['uploaded']['tmp_name'], $target_path)) { #判断文件是否移动成功. echo '<pre>'; echo 'Your image was not uploaded.'; echo '</pre>'; } else { echo '<pre>'; echo $target_path . ' succesfully uploaded!'; echo '</pre>'; } } ?>
例子:直接上传php一句话.
中等级源码(对上传文件的类型和大小进行过滤):
<?php if (isset($_POST['Upload'])) { $target_path = DVWA_WEB_PAGE_TO_ROOT."hackable/uploads/"; $target_path = $target_path . basename($_FILES['uploaded']['name']); $uploaded_name = $_FILES['uploaded']['name']; #获取上传文件的名称 $uploaded_type = $_FILES['uploaded']['type']; #获取上传文件的类型 $uploaded_size = $_FILES['uploaded']['size']; #获取上传文件的大小 if (($uploaded_type == "image/jpeg") && ($uploaded_size < 100000)){ #判断上传文件的类型和大小 if(!move_uploaded_file($_FILES['uploaded']['tmp_name'], $target_path)) { echo '<pre>'; echo 'Your image was not uploaded.'; echo '</pre>'; } else { echo '<pre>'; echo $target_path . ' succesfully uploaded!'; echo '</pre>'; } } else{ echo '<pre>Your image was not uploaded.</pre>'; } } ?>
出现2个问题:
1.上传前后的文件名一致.
2.未进行后缀名验证.
jpg对应的filetype类型:
php对应的filetype类型:
修改文件type绕过:
00截断绕过:
输入%00,表示后面的.jpg将被截断.
给%00解码,原因是执行时burp会对字符进行编码,这样才能正常执行.
高等级可以使用 a.php:.jpg绕过。
静动态语言区别。
静态:服务端和客户端代码一致(html、js)。
动态:服务端和客户端代码不一致,只显示执行后的代码(php、asp)。