1. 程式人生 > 其它 >上傳檔案的同時傳遞引數(以PHP為例)

上傳檔案的同時傳遞引數(以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 "[email protected]" -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 "[email protected]" -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--