最近在做靶機的時候遇到如下代碼審計題目:
在接收文件時會校驗文件后綴。但是如果在上傳文件時,同時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--