Linux命令長度限制在7個字符的情況下,如何拿到shell?
<?php
$param = $_REQUEST['param'];
If ( strlen($param) < 8 ) { echo shell_exec($param);
}
?分析代碼:
這段代碼傳入參數param然后進入if語句判斷是否小于8個字符,然后如果小于就會進入echo語句執行系統函數shell_exec執行輸入的參數param。
.加空格可以執行函數
?那么我可以不可上傳一個文件然后在.加空格執行它呢?
說干就干,
當我們上傳一個文件的時候這個文件無論上傳成功都會在tmp臨時文件目錄下生成文件,那我們上傳一個帶有惡意執行語句的代碼。
上面這個phpXtjWyo就是上傳文件時生成的臨時文件,我們需要給他包含執行起來就ok
?我們通過抓包的方式先抓一個上傳param值的包,再抓一個文件上傳的包然后給他們組合一下
上傳param的包
上傳文件的包
將他們這樣組合其中要看的是Content-Type的值要與下面
------geckoformboundary5c61f8803035a54aa08abfb9e1039af8
?
換行符也是不能錯的不然上傳會不成功。?
最后上傳成功,這個文件的上傳成功也證明了我們可以上傳任何東西。
如何編寫一個不使用數字和字母的webshell
<?php
if(!preg_match('/[a-z0-9]/is',$_GET['shell'])) {eval($_GET['shell']);
}
他的閑置就是不允許是字母和數字那我可不可以用上面的方法來解決它呢?上面對臨時文件匹配的格式是
. /t*/*
因為這次不允許輸入字母和數字,那么就不能輸入t那么我可不可以這樣匹配呢?
. /*/*顯然是不可以的
?
太多了那還有沒有其他的匹配呢?
有的有的兄弟
?:?匹配0次或1次?
那我們的php臨時文件的格式是phpXtjWyo
那么我們就可以是
/tmp/phpXtjWyo
/???/?????????
是不是就匹配上了呢?
?還是有這么多>_<
那么上傳的這個文件是不是還有上面特點呢,來減少這些匹配的項。
有的有的兄弟
這個臨時文件最后以為有可能是大寫所以我們可以將最后一個的匹配改為大寫的匹配但是又不能用字母所以
是不是可以這樣匹配呢?
/???/????????[@~[]
?ok啊也是匹配上了
但是傳入的時候報錯了我們搜索一下
傳入的參數如果是code的時候需要被執行的字符串,然后傳入的時候必須先結束php模式通過
?>來結束然后才可以傳入新的參數,傳入的時候要echo傳入,但是在這里不能用字母,所以只有
用<?=,它和短標簽的效果是一樣的所以可以用<?=`. /???/???????[@-[]?`;?>。應該就可以傳入了
ok了?