上一篇讲了文件上传漏洞和解析漏洞的基础,这一篇讲通过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)。