[字号:  ]

拿PHP写病毒,感染目录及子目录中的所有PHP脚本文件(包含Webshell)

发布时间:2008-11-23 00:44   作者: yafeikf   信息来源: PHPChina 开源社区门户
原作者:炫木木
URL:http://www.phpcup.cn/viewthread.php?tid=574&highlight=%E7%97%85%E6%AF%92

题外话:其实没啥技术含量的,一种另类应用而已,可以搞破坏也可以染白,看具体应用了

病毒并不都是针对操作系统的恶意二进制文件,根据针对目标环境的不同可以产生出由多种不同语言编写的具有不同功能的病毒程序。本文主要介绍由PHP语言编写的脚本病毒,针对的目标也很明确了,那就是所有基于PHP语言编写的网站程序或者其他WEB应用程序。这种病毒看起来与一般的PHP文件并无太大差异,病毒程序所用的函数都是正常的PHP自带的函数,这么说来这种病毒就是一种带有“病毒特性”的正常的PHP文件,查杀这种病毒也是比较困难的。
本文将主要介绍编写PHP病毒的三个方面:
1, PHP文件感染型病毒
2, 基于WEB应用程序漏洞的PHP蠕虫
3, PHP病毒自身的保护机制

[1] PHP文件感染型病毒的编写
这种病毒编写的完整步骤有4个过程,分别是:
1, 确定感染的目录
2, 确定只感染后缀为.php的PHP文件
3, 植入恶意代码到所有的PHP文件中
4, 防止重复感染
下面就来分别实现这些功能吧!
这里我们以感染病毒程序当前目录下所有PHP文件为例子说明,当然感染目录也可以自定义。具体的实现代码如下:



接着需要确定只感染后缀为PHP的文件并且植入恶意代码,strstr函数就可以帮我们筛选出来制定后缀的文件,实现代码如下:



至此感染就完成了,但是这样一来每运行一次病毒文件,当前目录下的PHP文件都会被感染一次,甚至病毒文件本身都会被感染,那么怎么防止重复感染呢。我们要给已经被感染或者不需要被感染(病毒自身)的文件做一个标记,首先在病毒文件前加上注释//520,注释内容可以随便写,也不会被运行。有了这个标记后,在植入的恶意代码后面也加上注释<?phpinfo();//520?>,这样所有的被感染文件中都会包含一个注释“//520”,现在大家都有标记了,就用一段代码来识别这个标记:




这段代码作用是先用fread函数读取目标文件的前20个字节,再用strstr函数判断是否存在520这个字符串,为什么要读前20个字节呢,看看我们植入的恶意代码:<?phpinfo();//520?>一共19个字节,我们读取20个字节,则注释里的520肯定被读取到了,这样就可以通过查找感染文件是否包含这个标记来确定这个文件是否被感染了,如果没有读取到则通过函数rewind将指针指向文件头,这里很关键如果没有把指针指向文件头则可能插入的代码在文件末尾(fopen函数的a+参数),那样我们查找标记就复杂了。
至此我们就完成了一个PHP文件感染型病毒的编写过程,其中关键的地方就是读取防止重复感染的标记时一定要结合恶意代码的长度一起计算,具体实际中需要什么恶意代码还是要结合情况自己构造了。这个病毒样本只是个雏形而已~

[2] 基于WEB应用程序漏洞的PHP蠕虫
提到PHP蠕虫就不得不说强大的santy蠕虫了。04年,基于PHPBB论坛的一个远程文件包含漏洞,诞生了著名的santy蠕虫,santy蠕虫借助于搜索引擎的强大的目标搜索能力在很短的时间迅速感染了很多的基于PHPBB论坛的网站,并且先后衍生出了20多个变种。
说到蠕虫传播,一定是利用了系统或者程序的某个漏洞,拿santy来说,利用的就是PHPBB论坛的一个文件包含漏洞,简单的说下这个漏洞的原因就是因为WEB程序里使用了include之类的文件包含函数,把程序运行所需要的一个头文件或配置文件包含进来。问题在于有些程序使用include函数接受变量作为参数,而所接受的变量事先没有经过初始化,导致在允许全局变量的情况下我们可以给该变量赋予任何值,也就是说,我们可以指定任意文件作为include函数的参数,这样以来,如果我们指定了一个包含恶意代码的文件,则该恶意代码将被包含到程序中执行,就产生了所谓的文件包含漏洞。
PHP蠕虫是基于文件包含漏洞的,但是包含一个恶意代码很简单,如何进行更好的传播呢?santy运用了搜索引擎的力量,利用搜索引擎来搜索所有使用PHPBB论坛的网站地址,并且找到相应的存在漏洞的PHP文件,就这样,在很短的时间里,santy可以迅速获得很多的传播目标,再根据搜索出来的这些目标分别依次提交恶意代码到漏洞文件的相对应的变量中,就实现了快速传播的效果。
可以这么说,一个远程包含漏洞的出现就可以诞生一只PHP蠕虫,如果你愿意编写它的话。
下面来看一下蠕虫的具体实现,首先看一下santy是如何实现的,santy采用perl编写,看看他的核心代码,也就是目标搜索部分:


该段代码构造了一个google的搜索URL,关键字为viewtopic.php,也就是存在漏洞的PHP文件,然后随机取一个结果数目,然后调用GrabURL('www.google.com' . $1)来实现传播。GrabURL函数构造了一个GET请求,来访问搜索的目标,接着提交恶意代码,进行传播。具体恶意代码这里就不再分析了,感兴趣的朋友可以搜索一下santy.a的代码。
知道了原理,那编写一个PHP蠕虫也就不难了。



至于worm.php里可以写什么呢?可以结合第一个文件感染型病毒的技术.
Worm.php:


这样我们就实现了一个简单的PHP蠕虫的编写,该蠕虫利用PHP文件包含漏洞并通过搜索引擎进行传播,传播后被感染的网站目录下所有的PHP文件中将被插入恶意代码“<?phpinfo();//520?>”,游戏结束。

[3] PHP病毒自身的保护机制
任何病毒都需要对自身进行保护,针对PHP脚本病毒最简单的保护就是调用base64_encode函数对代码进行编码,这样可以防止代码中可能出现某些敏感的命令执行函数被一些查杀webshell的程序杀掉。但是这样只是防止不会被程序检查,如果是人为的删除呢?这里就需要我们用另外一个PHP文件来监视我们的病毒文件。这里用file_exists函数最好不过了。假设我们的病毒文件为virus.php,我们可以在index.php中插入一段代码:


这里的viruscode就是病毒代码。

PS:贴个网上摘的感染vbs的代码,感染其他类型的文件原理都一样,有闲心的自己琢磨吧


[ 本帖最后由 yafeikf 于 2008-11-23 00:46 编辑 ]

最新回复

koin at 2008-11-23 01:01:16
好家伙,不错,版主加分,送Kyb
wzj5 at 2008-11-23 01:03:15
的确不错~~~主要是操作文件
liexusong at 2008-11-23 01:18:16
中毒都是主机中毒,想客户的机器中毒~好难!
wbsifan at 2008-11-23 23:15:23
light2000 at 2008-11-24 08:47:56

QUOTE:

原帖由 liexusong 于 2008-11-23 01:18 发表
中毒都是主机中毒,想客户的机器中毒~好难!
拿主机的才难好不好,客户鸡只要在网站挂个马就源源不断了。
panjinww at 2008-11-24 08:56:38

QUOTE:

原帖由 light2000 于 2008-11-24 08:47 发表

拿主机的才难好不好,客户鸡只要在网站挂个马就源源不断了。
小郭同志 at 2008-11-24 09:44:40
不错不错
小郭同志 at 2008-11-24 09:44:52
如果没有可写权限怎么感染
syb328 at 2008-11-24 10:15:56
不就是挂马嘛。唉。。。
xiejohnson at 2008-11-24 10:52:53
不错的文章,收藏,慢慢看......