上传漏洞讲解(2)

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


猜你喜欢

转载自blog.csdn.net/sufeiboy/article/details/79522252