Upload-Labs靶场闯关


以下是文件上传绕过的各种思路,不过是鄙人做题记下来的一些思路笔记罢了。


GitHub靶场环境下载:upload-labs


Pass-01

先传一个图片过去,成功上传。
image
尝试传muma过去,提示失败,但是这个提示是在前端直接显示出来的,好像并没有发送请求过去。
image
尝试找到前端校验代码,直接在开发者模式将其js调用的函数删掉。
image
image
然后再次尝试上传木马,上传成功了
image
直接看服务端也是上传成功了。
image

Pass-02

观察前端也是有之前的第一关的前端校验,删除后直接尝试上传木马。

发现上传失败。
image
image
可以看到前端代码我们通过了,但是后端可能又校验没有通过,所以抓包观察一下。

  • 首先尝试修改content-type是否能够上传过去。

    Content-Type: image/jpg
    image
    可以看得到还是失败了。
    image
    可能jpg不行,那试试png?
    还真过去了!现在就是直接找到回显的这个路径直接连接就行了。因为这个回显的路径和文件名都是php,也能够直接访问,然后也被当成php执行了里面的木马代码。
    image

我很纳闷为什么jpg不行,难道jpg列入黑名单了?那就showcode看看

原来是jpg没有进白名单,所以有时候多尝试几个mime头还是OK的。

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
   
   
    if (file_exists(UPLOAD_PATH)) {
   
   
        if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) {
   
   
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH . '/' . $_FILES['upload_file']['name']            
            if (move_uploaded_file($temp_file, $img_path)) {
   
   
                $is_upload = true;
            } else {
   
   
                $msg = '上传出错!';
            }
        } else {
   
   
            $msg = '文件类型不正确,请重新上传!';
        }
    } else {
   
   
        $msg = UPLOAD_PATH.'文件夹不存在,请手工创建!';
    }
}

但是我仔细一想,发现要是我一开始就先尝试看看哪种文件能够上传成功那就和自己对着能够上传过去的文件进行修改不就好了吗?我重新尝试了一下上传jpg图片看看是不是真的没法上传,但是意外上传成功了!?
image
后面再另外上传一个伪装jpg一抓包发现,原来jpg图片现在的mime头都是JPEG了。。。。原来是我的问题。。。。
image

Pass-03

先传一个带木马的jpg文件看看过不过得去
image
正常过去了
image
看下该文件路径,使用时间戳进行更改名字。但是我们的web.jpg确实过去了,很有可能没有对我内容进行检查,所以我们要抓包在文件名处做文章。
image

  • 尝试直接修改后缀名但是Content-Type为jpeg(失败了)
    image
    image

  • 首先要理解服务端保存文件名字路径的方式,他是将.前面的全当成文件名然后用时间戳替换了,.后面符合过滤条件就使用不符合就不保存返回错误提示。
    由于我们知道服务端是采用的apache,现在有如下几种手段

    • 赌一下运维人员配置不当,存在php3,php7等等也当做php文件执行了。
      (当然这一关就是这个答案,但是需要我们手动配置好)
      在http.d文件中:AddType application/x-httpd-php .php .phtml .php5

    • 双写(肯定不行,因为直接给php拦下来了,不然的话就会变成没有后缀名的时间戳文件名的文件)

    • 尝试xx.php . 或者 xx.php. .,但是都不行,因为服务端会把最后一个点的前面都当成文件名用时间戳替换掉,那么你的filename就会成为: 时间戳.

    • 大小写混合 (失败)

    • 双写
      成功但后缀名没有被替换,依旧是失败了。
      image

    • ::DATA(可能可以,因为windows刚好是服务端使用的系统)

    • 冒号: 二次传输(同理或许能行得通,因为也是针对windows系统)

    • .htaccess(试过了也失败了)

  • 上传php5后缀名,上传成功,根据回显路径访问文件。
    image
    image
    image

  • 但是在访问的时候发现版本也是一个问题,如图所示,只有非nts版本的才能够在我们http.d下添加的后缀名能够被执行,其他都是直接下载而不是执行。(当然都是在http.d下天了php5后缀名的了,只是效果不同而已)
    下面的5.5.38由于我在windowsserver2003中,他不支持就切不了。
    image

  • 重新发送一下木马
    image
    直接访问看看,访问成功了。终于结束了这场闹剧。。。。
    image

Pass-04

传一个木马图片过去看看什么情况,发现文件名没有改,然后也没有校验文件的内容
image
image
尝试::$DATA看看不行不

::$DATA失败
image
尝试windows的其他特性

  • xx.php .

    失败
    image

  • xx.php. .
    成功了!!!!!!!!!!!!!但是回显是1.php.,但是没有关系,因为windows特性是不会让文件名最后一个字符是.的,所以我们接访问1.php即可
    image
    image
    使用蚁剑连接成功
    image

  • xx.php:.jpg(这里需要二次传输)

    • 第一次:(成功了!!!!!!!!!!)
      传过去但是该文件没有内容,第一次的作用就是创建一个文件。
      image
      可以看到服务端的这个文件也是0kb
      image
    • 第二次:作用是传输文件内容进去
      这里注意传的文件名是1.<<,<<是追加符号,把内容追加到文件名为1的文件中去
      image
      看到路径是1.<<,但是没关系,接着看后面
      image
      我们现在尝试着连接一下1.php,同样是成功了!!!!!!!!!!!!
      image
      回到服务器看看怎么个事。
      果然成功将内容输入进去了,不再是0kb内容。而且里面的内容就是我们要的
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

竹等寒

谢过道友支持,在下就却之不恭了

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值