• 上传文件的同时传递参数(以PHP为例)


    最近在做靶机的时候遇到如下代码审计题目:

    在接收文件时会校验文件后缀。但是如果在上传文件时,同时post一个secure参数,就可以接受php文件的上传

    <?php
    
    if(isset($_FILES['file']['name'])){
       // file name
       $filename = $_FILES['file']['name'];
    
       // Location
       $location = 'owls/'.$filename;
    
       // file extension
       $file_extension = pathinfo($location, PATHINFO_EXTENSION);
       $file_extension = strtolower($file_extension);
    
       
       // Valid extensions
       if(isset($_COOKIE['admin']) && $_COOKIE['admin'] == '&G6u@B6uDXMq&MsR'){
            if(isset($_POST['secure']) && $_POST['secure'] == 'val1d'){
            
                $valid_ext = array("pdf","php","txt");
            }
            else{
    
                $valid_ext = array("txt");
            }
       }
       else{
    
            $valid_ext = array("txt");
       }
    
       
       $response = 0;
       if(in_array($file_extension,$valid_ext)){
          // Upload file
          if(move_uploaded_file($_FILES['file']['tmp_name'],$location)){
             $response = 1;
          } 
       }
    
       echo $response;
       exit;
    }

    curl -X POST时,-F和-d只能选一个,解决方法记录如下:

    来自:https://www.shuzhiduo.com/A/D854pE165E/

    一般使用linux原生态的命令curl上传文件时命令如下

    
    

    假如要上传文件是myfile.txt

    curl -F "file_name=@myfile.txt" -X POST "http://192.168.1.111/server"
    
    

    其中file_name是接收的key 后面的myfile.txt是要上传的文件,在=后面加上@符号表示要上传的是文件

    
    

    如果要单独上传参数则是

    curl -d "usernaem=u1&age=13" -X POST "http://192.168.1.111/server"
    
    

    要同时上传文件与参数,则需要将参数分开一次指定,如下:

    curl -F "file_name=@myfile.txt" -F "usernaem=u1" -F "age=13" -X POST "http://192.168.1.111/server"
    
    

    有多少个参数,后面就跟多少个-F指定要上传携带的参数值

     

    所以通过-F参数,不加@前缀提交多个参数即可,对应的数据包如下

    POST /server HTTP/1.1
    Host: 192.168.1.111
    User-Agent: curl/7.64.0
    Accept: */*
    Content-Length: 426
    Content-Type: multipart/form-data; boundary=------------------------e83ac844d0d2372c
    Connection: close
    
    --------------------------e83ac844d0d2372c
    Content-Disposition: form-data; name="file_name"; filename="myfile.txt"
    Content-Type: text/plain
    
    sjfkjfsalfjsdalfjaslfjsalfjsafjsalfjasl
    
    --------------------------e83ac844d0d2372c
    Content-Disposition: form-data; name="usernaem"
    
    u1
    --------------------------e83ac844d0d2372c
    Content-Disposition: form-data; name="age"
    
    13
    --------------------------e83ac844d0d2372c--
  • 相关阅读:
    py二级习题
    js 闪烁的文字
    用windows 画图 裁剪照片
    JS 练习
    弧度制与角度制
    Knockout.Js官网学习(event绑定、submit绑定)
    js中进行金额计算 parseFloat 会产生精度问题,toFixed(2) 方法修正
    JQuery通过类选择器捕获click事件获取bai当前点击对象的id, javascript中onclick(this)用法介绍
    jQuery检查元素是否含有指定的class类,使用.hasClass()方法
    ajax的dataType有哪些类型?
  • 原文地址:https://www.cnblogs.com/zlgxzswjy/p/14919369.html
Copyright © 2020-2023  润新知