文章目录[隐藏]

目录:

  • 初级
  • 中级
  • 高级
  • 防护措施

1.初级:

上传漏洞很简单,刚刚看完一个多小时的教程心情很是惆怅,决定把老师讲的记下来。
依旧是用DVWA这玩意进行练习。先从初级开始,首先分析一下php的源代码:

 <?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>';

    }

}
?> 

分析:

初级的代码很简单,第二是判断是否有upload这个参数如果有就继续执行,什么?我怎么看出的?抓包!…如果没有则报错。下面的代码是取上传文件名的名字拼凑一个名字给上传的文件重命名,然后放到一个位置,这个很简单,直接上传就可以。

利用:

可以新建一个名叫1.php的文件,然后找个webshell的源码粘贴进去。关于webshell的源码。Github上又有一个收集webshell的项目,可以去这里找:https://github.com/JohnTroony/php-webshells
粘贴后,直接上传这个php文件,就得到了shell

Webshell里可以运行命令:

2.中级

然后清理一下数据库。

中级也是如此,先分析源代码:

<?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>';
    }
}
?> 

分析:

可以看出,中级代码里做了过滤,增加了三个变量,一个文件名name,一个文件类型type,还有一个大小size,然后下面的判断中,判断力两个变量,类型和大小,这种类型的过滤属于mimetype判断。可以抓包并改包过滤,这时候就得用到抓包神器——BurpSuite。然后抓包,吧type类型改成image/jpeg就可以绕过。

利用:

启动工具,设置好代理。上传!截获数据,改包type为image/jpeg,发包。完成。。。

成功拿到shell..

3.高级:

老样子,清空数据库,分析代码:

<?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_ext = substr($uploaded_name, strrpos($uploaded_name, '.') + 1);
    $uploaded_size = $_FILES['uploaded']['size'];

    if (($uploaded_ext == "jpg" || $uploaded_ext == "JPG" || $uploaded_ext == "jpeg" || $uploaded_ext == "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>';
        echo 'Your image was not uploaded.';
        echo '</pre>';

    }
}

?>

分析:

高级代码好像更牛逼了,仔细研究后发现,作者加了个文件后缀名的过滤,只允许jpg和jpeg这种格式的上传,这个时候也可以利用抓包修改文件名的后缀为1.php.jpg这样,可以绕过过滤,而且服务器是可以执行的。原理就不扯了,快吃饭了。。。

执行效果如下,注意。虽然后缀是jpg,但是服务器仍然会以php文件进行解析。原理自己找资料了解吧。

有些牛逼的大神可能会用更严格的过滤方法,但是只要细心,也是可以绕过的。比如。有些大神会判断图片文件的前几个字节来过滤。这时候,可以用php代码将剩余的替换掉。但是apache会以图片的方式进行解析。不过也可以修改文件拓展名来绕过。

4.防护措施:

使用代码进行过滤
系统配置文件的合理配置
文件权限的分配
比如去除对upload目录的执行权限:

sudo chmod a-x upload

完毕。。

朱古力

By 朱古力

一条咸鱼

发表评论

电子邮件地址不会被公开。 必填项已用*标注