﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-沙漠绿洲-随笔分类-信息安全</title><link>http://www.blogjava.net/sunrisefe/category/13165.html</link><description>－－－－骆驼之行</description><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 11:57:48 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 11:57:48 GMT</pubDate><ttl>60</ttl><item><title>路由器能替代防火墙吗？</title><link>http://www.blogjava.net/sunrisefe/archive/2006/09/07/68193.html</link><dc:creator>小涧流水</dc:creator><author>小涧流水</author><pubDate>Thu, 07 Sep 2006 02:22:00 GMT</pubDate><guid>http://www.blogjava.net/sunrisefe/archive/2006/09/07/68193.html</guid><wfw:comment>http://www.blogjava.net/sunrisefe/comments/68193.html</wfw:comment><comments>http://www.blogjava.net/sunrisefe/archive/2006/09/07/68193.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sunrisefe/comments/commentRss/68193.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sunrisefe/services/trackbacks/68193.html</trackback:ping><description><![CDATA[ <strong>来源：</strong>网络世界   日期：2006-04-15  <br /><br /><span class="top11">      防火墙已经成为企业网络建设中的一个关键组成部分<a href="http://www.dohao.com/" target="_blank">。</a>但有很多用户，认为网络中已经有了路由器，可以实现一些简单的包过滤功能，所以，为什么还要用防火墙呢?以下我们针对防火墙与业界<font face="Arial" color="#000000">应用</font>最多、最具代表性的路由器在安全方面的对比，来阐述为什么用户网络中有了路由器还需要防火墙。<br />     （ 防火墙工作在大型网络中，成为网络中的主要安全设备，主要布置在一个网络或子网与另一个网络的接口处，保障整个网络的安全。而安全路由器主要应用在中小型企业的网络中央，承担主要的路由功能，同时兼顾网络安全，但是整个设备不能因为安全功能而导致整体网络性能的下降。也就是说，安全是安全路由器的辅助功能。在中小型网络中，安全路由器的部署的确使防火墙成为一个配置在路由器之中的设备，因此就没有必要再部署防火墙了。但是在大型的网络中，两者是完全不同的安全设备。） <br /><br /><strong>一、两种设备产生和存在的背景不同 </strong><br /><br /><em>1、两种设备产生的根源不同</em><br /><br />路由器的产生是基于对网络数据包路由而产生的<a href="http://www.dohao.com/" target="_blank">。</a>路由器需要完成的是将不同网络的数据包进行有效的路由，至于为什么路由、是否应该路由、路由过后是否有问题等根本不关心，所关心的是:能否将不同的网段的数据包进行路由从而进行通讯。<br /><br />防火墙是产生于人们对于安全性的需求。数据包是否可以正确的到达、到达的时间、方向等不是防火墙关心的重点，重点是这个(一系列)数据包是否应该通过、通过后是否会对网络造成危害。<br /><br /><em>2、根本目的不同</em><br /><br />路由器的根本目的是:保持网络和数据的“通”。<br /><br />防火墙根本的的目的是:保证任何非允许的数据包“不通”。<br /><br /><strong>二、核心技术的不同</strong><br /><br /><font color="#800080"><font face="Arial">Cisco路由</font>器核心的ACL列表是基于简单的包过滤，从防火墙技术实现的角度来说，防火墙是基于状态包过滤的应用级信息流过滤。</font><br /><br />一个最为简单的应用:企业内网的一台主机，通过路由器对内网提供服务(假设提供服务的端口为tcp 1455)。为了保证安全性，在路由器上需要配置成:外--&gt;内 只允许client访问 server的tcp 1455端口，其他拒绝。<br /><br />针对现在的配置，存在的安全脆弱性如下: <br /><br />1、IP地址欺骗(使<font face="Arial" color="#000000">连接</font>非正常复位) <br /><br />2、TCP欺骗(会话重放和劫持) <br /><br />存在上述隐患的原因是，路由器不能监测TCP的状态。如果在内网的client和路由器之间放上防火墙，由于防火墙能够检测TCP的状态，并且可以重新随机生成TCP的序列号，则可以彻底消除这样的脆弱性。同时，防火墙的一次性口令认证<font face="Arial" color="#000000">客户端</font>功能，能够实现在对应用完全透明的情况下，实现对用户的访问控制，其认证支持标准的Radius协议和本地认证数据库，可以完全与第三方的认证数据库进行互操作，并能够实现角色的划分。<br /><br />虽然，路由器的"Lock-<font face="Arial" color="#000000">and</font>-Key"功能能够通过动态访问控制列表的方式，实现对用户的认证，但该特性需要路由器提供Telnet服务，用户在使用使也需要先Telnet到路由器上，使用起来不很方便，同时也不够安全(开放的端口为黑客创造了机会)。 
<p><strong>三、安全策略制定的复杂程度不同</strong><br /><br />路由器的默认配置对安全性的考虑不够，需要一些高级配置才能达到一些防范攻击的作用，安全策略的制定绝大多数都是基于命令行的，其针对安全性的规则的制定相对比较复杂，配置出错的概率较高。<br /><br />防火墙的默认配置既可以防止各种攻击，达到既用既安全，安全策略的制定是基于全中文的GUI的管理工具，其安全策略的制定人性化，配置简单、出错率低。<br /><br /><strong>四、对性能的影响不同</strong><br /><br />      路由器是被设计用来转发数据包的，而不是专门设计作为全特性防火墙的，所以用于进行包过滤时，需要进行的运算非常大，对路由器的CPU和内存的需要都非常大，而路由器由于其硬件成本比较高，其高性能配置时硬件的成本都比较大。<br />      防火墙的硬件配置非常高(采用通用的INTEL芯片，性能高且成本低)，其软件也为数据包的过滤进行了专门的优化，其主要模块运行在操作系统的内核模式下，设计之时特别考虑了安全问题，其进行数据包过滤的性能非常高。<br /><br />由于路由器是简单的包过滤，包过滤的规则条数的增加，NAT规则的条数的增加，对路由器性能的影响都相应的增加，而防火墙采用的是状态包过滤，规则条数，NAT的规则数对性能的影响接近于零。<br /><br /><strong>五、审计功能的强弱差异巨大</strong> <br /><br />      路由器本身没有日志、事件的存储介质，只能通过采用外部的日志服务器(如syslog，trap)等来完成对日志、事件的存储；路由器本身没有审计分析工具，对日志、事件的描述采用的是不太容易理解的语言；路由器对攻击等安全事件的相应不完整，对于很多的攻击、扫描等操作不能够产生准确及时的事件。审计功能的弱化，使管理员不能够对安全事件进行及时、准确的响应。<br /><br /><strong>六、防范攻击的能力不同</strong> <br /><br />      对于像Cisco这样的路由器，其普通版本不具有应用层的防范功能，不具有入侵实时检测等功能，如果需要具有这样的功能，就需要生级升级IOS为防火墙特性集，此时不单要承担软件的升级费用，同时由于这些功能都需要进行大量的运算，还需要进行硬件配置的升级，进一步增加了成本，而且很多厂家的路由器不具有这样的高级安全功能。可以得出: <br /><br />·具有防火墙特性的路由器成本 &gt;防火墙 + 路由器 <br /><br />·具有防火墙特性的路由器功能&lt;防火墙 + 路由器 <br /><br />·具有防火墙特性的路由器可扩展性&lt;防火墙 + 路由器 <br /><br />      综上所述，可以得出结论：用户的网络拓扑结构的简单与复杂、用户应用程序的难易程度不是决定是否应该使用防火墙的标准，决定用户是否使用防火墙的一个根本条件是用户对网络安全的需求! <br /><br />      即使用户的网络拓扑结构和应用都非常简单，使用防火墙仍然是必需的和必要的；如果用户的环境、应用比较复杂，那么防火墙将能够带来更多的好处，防火墙将是网络建设中不可或缺的一部分，对于通常的网络来说，路由器将是保护内部网的第一道关口，而防火墙将是第二道关口，也是最为严格的一道关口。</p></span><img src ="http://www.blogjava.net/sunrisefe/aggbug/68193.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sunrisefe/" target="_blank">小涧流水</a> 2006-09-07 10:22 <a href="http://www.blogjava.net/sunrisefe/archive/2006/09/07/68193.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>揭开SVCHOST.exe进程之谜 </title><link>http://www.blogjava.net/sunrisefe/archive/2006/09/07/68176.html</link><dc:creator>小涧流水</dc:creator><author>小涧流水</author><pubDate>Thu, 07 Sep 2006 01:31:00 GMT</pubDate><guid>http://www.blogjava.net/sunrisefe/archive/2006/09/07/68176.html</guid><wfw:comment>http://www.blogjava.net/sunrisefe/comments/68176.html</wfw:comment><comments>http://www.blogjava.net/sunrisefe/archive/2006/09/07/68176.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sunrisefe/comments/commentRss/68176.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sunrisefe/services/trackbacks/68176.html</trackback:ping><description><![CDATA[
		<font style="BACKGROUND-COLOR: #a9a9a9" color="#0000ff">from:天极网</font>
		<br />
		<br />　svchost.exe是nt核心系统的非常重要的进程，对于2000、xp来说，不可或缺。很多病毒、木马也会调用它。所以，深入了解这个程序，是玩电脑的必修课之一。
<p>　　大家对windows操作系统一定不陌生，但你是否注意到系统中“svchost.exe”这个文件呢？细心的朋友会发现windows中存在多个 “svchost”进程（通过“ctrl+alt+del”键打开任务管理器，这里的“进程”标签中就可看到了），为什么会这样呢？下面就来揭开它神秘的面纱。</p><p><strong>发现</strong></p><p>　　在基于nt内核的windows操作系统家族中，不同版本的windows系统，存在不同数量的“svchost”进程，用户使用“任务管理器”可查看其进程数目。一般来说，win2000有两个svchost进程，winxp中则有四个或四个以上的svchost进程（以后看到系统中有多个这种进程，千万别立即判定系统有病毒了哟），而win2003 server中则更多。这些svchost进程提供很多系统服务，如：rpcss服务（remote procedure call）、dmserver服务（logical disk manager）、dhcp服务（dhcp client）等。</p><p>　　如果要了解每个svchost进程到底提供了多少系统服务，可以在win2000的命令提示符窗口中输入“tlist -s”命令来查看，该命令是win2000 support tools提供的。在winxp则使用“tasklist /svc”命令。</p><p>svchost中可以包含多个服务</p><p><strong>深入</strong></p><p>　　windows系统进程分为独立进程和共享进程两种，“svchost.exe”文件存在于“%systemroot% system32”目录下，它属于共享进程。随着windows系统服务不断增多，为了节省系统资源，微软把很多服务做成共享方式，交由 svchost.exe进程来启动。但svchost进程只作为服务宿主，并不能实现任何服务功能，即它只能提供条件让其他服务在这里被启动，而它自己却不能给用户提供任何服务。那这些服务是如何实现的呢？</p><p>　　原来这些系统服务是以动态链接库（dll）形式实现的，它们把可执行程序指向 svchost，由svchost调用相应服务的动态链接库来启动服务。那svchost又怎么知道某个系统服务该调用哪个动态链接库呢？这是通过系统服务在注册表中设置的参数来实现。下面就以rpcss（remote procedure call）服务为例，进行讲解。</p><p>　　从启动参数中可见服务是靠svchost来启动的。</p><p><strong>实例</strong></p><p>　　以windows xp为例，点击“开始”/“运行”，输入“services.msc”命令，弹出服务对话框，然后打开“remote procedure call”属性对话框，可以看到rpcss服务的可执行文件的路径为“c:\windows\system32\svchost -k rpcss”，这说明rpcss服务是依靠svchost调用“rpcss”参数来实现的，而参数的内容则是存放在系统注册表中的。</p><p>　　在运行对话框中输入“regedit.exe”后回车，打开注册表编辑器，找到[hkey_local_machine systemcurrentcontrolsetservicesrpcss]项，找到类型为“reg_expand_sz”的键“magepath”，其键值为“%systemroot%system32svchost -k rpcss”（这就是在服务窗口中看到的服务启动命令），另外在“parameters”子项中有个名为“servicedll”的键，其值为“% systemroot%system32rpcss.dll”，其中“rpcss.dll”就是rpcss服务要使用的动态链接库文件。这样 svchost进程通过读取“rpcss”服务注册表信息，就能启动该服务了。</p><p><strong>解惑</strong></p><p>　　因为svchost进程启动各种服务，所以病毒、木马也想尽办法来利用它，企图利用它的特性来迷惑用户，达到感染、入侵、破坏的目的（如冲击波变种病毒“w32.welchia.worm”）。但windows系统存在多个svchost进程是很正常的，<font color="#800080"><strong>在受感染的机器中到底哪个是病毒进程呢？</strong></font>这里仅举一例来说明。</p><p>　　假设windows xp系统被“w32.welchia.worm”感染了。正常的svchost文件存在于“c:\windows\system32”目录下，如果发现该文件出现在其他目录下就要小心了。“w32.welchia.worm”病毒存在于“c:\windows\system32wins”目录中，因此使用进程管理器查看svchost进程的<font color="#800080"><strong>执行文件路径</strong></font>就很容易发现系统是否感染了病毒。windows系统自带的任务管理器不能够查看进程的路径，可以使用第三方进程管理软件，如“windows优化大师”进程管理器，通过这些工具就可很容易地查看到所有的svchost进程的执行文件路径，一旦发现其执行路径为不平常的位置就应该马上进行检测和处理。</p><p>　　由于篇幅的关系，不能对svchost全部功能进行详细介绍，这是一个windows中的一个特殊进程，有兴趣的可参考有关技术资料进一步去了解它。</p><img src ="http://www.blogjava.net/sunrisefe/aggbug/68176.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sunrisefe/" target="_blank">小涧流水</a> 2006-09-07 09:31 <a href="http://www.blogjava.net/sunrisefe/archive/2006/09/07/68176.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IP欺骗的原理</title><link>http://www.blogjava.net/sunrisefe/archive/2006/09/06/68042.html</link><dc:creator>小涧流水</dc:creator><author>小涧流水</author><pubDate>Wed, 06 Sep 2006 07:41:00 GMT</pubDate><guid>http://www.blogjava.net/sunrisefe/archive/2006/09/06/68042.html</guid><wfw:comment>http://www.blogjava.net/sunrisefe/comments/68042.html</wfw:comment><comments>http://www.blogjava.net/sunrisefe/archive/2006/09/06/68042.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sunrisefe/comments/commentRss/68042.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sunrisefe/services/trackbacks/68042.html</trackback:ping><description><![CDATA[
		<p>
				<font size="3">
						<span style="FONT-SIZE: 12px">
								<font size="3">    <u><font style="BACKGROUND-COLOR: #d3d3d3">来源：</font></u><a href="http://www.blog.sh/user1/1706/archives/2005/7798.html"><font style="BACKGROUND-COLOR: #d3d3d3">http://www.blog.sh/user1/1706/archives/2005/7798.html</font></a><br /><br />  IP欺骗是在服务器不存在任何漏洞的情况下，通过利用TCP/IP协议本身存在的一些缺陷进行攻击的方法，这种方法具有一定的难度，需要掌握有关协议的工作原理和具体的实现方法。<br /></font>
								<br />
								<font style="BACKGROUND-COLOR: #deb887" color="#800080" size="4">
										<strong>一、TCP、IP协议的简单说明：<br /></strong>
								</font>
								<br />   <font size="3"> TCP/IP（传输入控制地议/网际协议）是一种网络通信协议，它规范了网络上的所有通信设备，尤其是一个主机与另一个主机之间的数据传输格式以及传送方式，TCP/IP是因特网的基础协议。要想当黑客就有必要了解TCP/IP协议。 <br />    在数据传送中，可以形象的理解为有两个信封：TCP和IP信封。要送递的信息被分成若***段，每一段塞入一个TCP信封，并在该信封上记录有分段号的信息，再将TCP信封塞入IP大信封里，发送到网上。在扫收端，一个TCP软件包收集信封，抽出数据，按发送关的顺序还原，并加以校验，若发现差错，TCP将会要求重发。因此TCP/IP在因特网中几乎可以无差错地传送数据。对因特网用户来说，并不需要了解网络协议的整个结构，仅需了解IP的地址格式，即可与世界各地进行网络通信。 <br />   <font style="BACKGROUND-COLOR: #f5f5dc" color="#000080"><strong> 1、TCP/IP的层次结构：<br /></strong></font>    TCP/IP协议组中的协议因特网上数据的传输，提供了几乎目前上网所用到的所有服务，在TCP/IP协议组中有两种协议：<br />    （1）网络层协议：<br />    网络层协议管理离散计算机间的数据传输。这些协议用户注意不到，它们是个系统表层以下工作的。比如，IP协议为用户和远程计算机提供了信息包的传输方法，它是在许多信息的基础上工作的。比如机器的IP地址。在机器的IP地址和其他信息的基础上，IP确保信息包正确达到目的机器。通过这一过程，IP和其他网络层的协议一共同用于数据传输。如果没有网络工具，用户就看不到在系统里工作的机器的IP。<br />    （2）应用层协议：<br />    相反地，应用层协议是可以看到的。比如，文件传输协议（FTP)是可以看到的。用户为了传一个文件而请求一个和其他计算机连接，连接建立后，就开始传输文件，在传输时，用户和远程计算机的交换的一部分是能看到的。 <br />   <font style="BACKGROUND-COLOR: #f5f5dc" color="#000080"><strong> 2、TCP/IP的重要协议：<br /></strong></font>    （1）地址解析协议（ARP)：<br />    在网络上进行通信的主机必须知道对方主机的硬件地址（网卡的物理地址）。地址解析协议的目的就是将IP地址映射成物理地址。这在使信息通过网络时特别重要。一个消息（或者其他数据）在发送之前，被打包到IP包里面，或适合于因特网传输信息块中，其中包括两台计算机的IP地址。 在这个包离开发送计算机前，必须找到目标的硬件地址，这就是ARP最初到达的地方。<br />    一个ARP请求消息会在网上广播。请求由一个进程接收，它回复物理地址。这个回复消息由原先的那台发送广播消息的计算机接收，从而传输过程就开始了。<br />    ARP的设计包括一个缓存。为了减少广播量，ARP在缓存中保存地址映射以备后用。ARP级存保存有动态项和静态项。动态项是自动加和删除的，静态项则是保留在缓存(Cache)中，直到计算机重启为止。ARP缓存总是为本地子网保留硬件广播地址(0xffffffffffffh)用为一个永久项，此项使主机能够接收ARP广播。当果看存时，该项不会显示。每条ARP缓存记录的生命周期为10分种，如果2分种未用则删除。缓存容量满时，删除最早的记录，但是，缓存也引起了安全性的问题。那就是缓存溢出——这不是本文的讨论内容，所以就不说了。<br />    （2）因特网控制消息协议（ICMP）：<br />    因特网控制消息协议（ICMP)用于报告错误并IP对消息进行控制。IP运用互联组管理协议(IGMP)来告诉路由器某一网络上指导组中有哪些可用主机。 <br />    以ICMP实现的最著名的网络工具是Ping。Ping通常用来判断一台远程机器是否正开着，数据包从用户的计算机发到远程计算机，这些包通常返回到用户的计算机，如果数据据包没有返回到用户计算机，Ping程序就产生一个表示远程计算机关机的错误消息。 <br /><br /><font style="BACKGROUND-COLOR: #deb887" color="#800080" size="4"><strong>二、IP攻击中如何建立建立信任关系：<br /></strong></font><br />    IP欺骗是利用了主机之间的正常信任关系来发动的，所以在介绍IP欺骗攻击之前，先说明一下什么是信任关系，信任关系是如何建立的。<br />    在UNIX主机中，存在着一种特殊的信任关系。假设有两台主机hosta和hostb，上面各有一个帐户Tomy，在使用中会发现，在hosta上使时要输入在hosta上的相应帐户Tomy，在hostb上使用时必须输入用hostb的帐户Tomy，主机hosta和hostb把Tomy当做两个互不相关的用户，这显然有些不便。为了减少这种不便，可以在主机hosta和hostb中建立起两个帐户的相互信任关系。在hosta和hostb上Tomy的home目录中创建.rhosts文件。从主机hosta上，在你的home目录中用命令echo “hostb Tomy”&gt;~/.hosts实现hosta&amp;hostb的信任关系，这时，你从主机hostb上，你就能毫无阻碍的使用任何以r开头的远程调用命令，如：rlogin、rsh、rcp等，而无需输入口令验证就可以直接登录到hosta上。这些命令将充许以地址为基础的验证，允许或者拒绝以IP地址为基础的存取服务。这里的信任关系是基于IP的地址的。<br />    当/etc/hosts.equiv中出现一个 “+”或者$HOME/.rhosts中出现 “++”时，表明任意地址的主机可以无须口令验证而直接使用r命令登陆此主机，这是十分危险的，而这偏偏又是某些管理员不重视的地方。下面我们看一下rlogin的用法。<br />    rlogin是一个简单的/服务器程序，它的作用和telnet差不多，不同的是telnet完全依赖口令验证，而rlogin是基于信任关系的验证，其次到才进行口令验证的，它使用了TCP协议进行传输。当用户从一台主机登陆到另一台主机上，并且，如果目录主机信任它，rlogin将允许在不应答口令的性况下使用目标主机上的资源，安全验证完便基于源主机的IP地址。因此，根据以上所举的例子，我们能利用rlogin来从hostb远程登陆到hosta，而且不会被提示出入口令！<br /><br /><font style="BACKGROUND-COLOR: #deb887" color="#800080" size="4"><strong>三、IP欺骗的理论根据：</strong></font><br /><br />    看到上面的说明，每一个黑客都会想到：<font color="#000080"><strong>既然hosta和hostb之间的信任关系是基于IP址而建立起来的，那么假如能够冒充hostb的IP，就可以使用rlogin登录到hosta，而不需任何口令验证。这就是IP欺骗的最根本的理论依据。</strong></font><font color="#800080">但是，事情远没有想像中那么简单！</font>虽然可以通过编程的方法随意改变发出的包的IP地址，但TCP协议对IP进行了进一步的封装，它是一种相对可靠的协议，不会让黑客轻易得逞。下面看一下正常的TCP/IP会话的过程：<br />    由于TCP是面向连接的协议，所以在双方正式传输数据之前，需要用“三次握手”来建立一个稳重的连接。假设还是hosta和hostb两台主机进行通信，hostb首先发送带有SYN标志的数据段通知hosta建立TCP连接，TCP的可靠性就是由数据包中的多位控制字来提供的，其中最重要的是数据序列SYN和数据确认标志ACK。B将TCP报头中的SYN设为自己本次连接中的初始值（ISN）。<br />    当hosta收到hostb的SYN包之后，会发送给hostb一个带有SYN+ACK标志的数据段，告之自己的ISN，并确认hostb发送来的第一个数据段，将ACK设置成hostb的SYN+1。<br />    当hostb确认收到hosta的SYN+ACK数据包后，将ACK设置成hosta的SYN+1。Hosta收到hostb的ACK后，连接成功建立，双方可以正式伟输数据了。<br />    看了这个过程，我们就很容易想到，<font color="#800080">假如想冒充hostb对hosta进行攻击，就要先使用hostb的IP地址发送SYN标志给hosta，但是当hosta收到后，并不会把SYN+ACK发送到我们的主机上，而是发送到真正的hostb上去，这时IP欺骗就失败了，因为hostb根本没发送发SYN等。所以如果要冒充hostb，首先要让hostb失去工作能力，也就是所谓的拒绝服务攻击，设法让让hostb瘫痪</font>。<br />    <font color="#800080">可是这样还是远远不够的，最难的就是要对hosta进行攻击，必须知道hosta使用的ISN。</font>TCP使用的ISN是一个32位的计数器，从0到4,294,967,295。TCP为每一个连接选择一个初始序列号ISN，为了防止因为延迟、重传等扰乱三次握手，ISN不能随便选取，不同的系统有着不同的算法。理解TCP如何分配ISN以及ISN随时间的变化规律，对于成功的进行IP欺骗攻击是很重要的！ISN约每秒增加128 000，如果有连接出现，每次连接将把计数器的数值增加64,000。很显然，这使得用于表示ISN的32位计数器在没有连接的情况下每9.32小时复位一次。这所以这样，是因为它有利于最大于度地减少“旧有”连接的信息***扰当前连接的机会。如果初始序例号是随意选择的，那么不能保证现有序例号是不同于先前的。假设有这样一种情况，在一个路由回路中的数据包最终跳出循环，回到了“旧有”的连接，显然这会对现有连接产生***扰。预测出攻击目标的序例号非常困难，而且各个系统也不想同，在Berkeley系统，最初的序列号变量由一个常数每秒加1产生，等加到这个常数的一半时，就开始一次连接。这样，如果开始啊一个合法连接，并观察到一个ISN正在使用，便可以进行预测，而且这样做有很高的可信度。现在我们假设黑客已经使用某种方法，能预测出ISN。在这种情况下，他就可以将ACK序便号送给hosta，这时连接就建立了。 <br /><br /><font style="BACKGROUND-COLOR: #deb887" color="#800080" size="4"><strong>四、IP欺骗攻击过程解析：<br /></strong></font><br />    IP欺骗由若***步骤组成，下面是它的详细步骤：<br />  <font style="BACKGROUND-COLOR: #f5f5dc" color="#000080"><strong>  1、使被信任主机失去工作能力：</strong></font><br />    为了伪装成被信任主机而不露陷，需要使其完全失去工作能力。由于攻击者将要代替真正的被信任主机，他必须确保真正的被信任主机不能收到任何有效的网络数据，否则将会被揭穿。有许多方法可以达到这个目的（如SYN洪水攻击、TTN、Land等攻击）。现假设你已经使用某种方法使得被信任的主机完全失去了工作能力。 <br />   <font style="BACKGROUND-COLOR: #f5f5dc" color="#000080"><strong> 2、序例号取样和猜测：</strong></font><br />    前面讲到了，对目标主机进行攻击，必须知道目标主机的数据包序例号。通常如何进行预测呢？往往先与被攻击主机的一个端口（如：25）建立起正常连接。通常，这个过程被重复N次，并将目标主机最后所发送的ISN存储起来。然后还需要进行估计他的主机与被信任主机之间的往返时间，这个时间是通过多次统计平均计算出来的。往返连接增加64,000.现在就可以估计出ISN的大小是128,000乘以往返时间的一半，如果此时目标主机刚刚建立过一个连接，那么再加上64 ,00。<br />    一旦估计出ISN的大小，就开始着手进行攻击，当然你的虚假TCP数据包进入目标主机时，如果刚才估计的序例号是准确的，进入的数据将被放置在目标机的缓冲区中。但是在实际攻击过程中往往没这么幸运，如果估计序例号的小于正确值，那么将被放弃。而如果估计的序例号大于正确值，并且在缓冲区的大小之内，那么该数据被认为是一个未来的数据，TCP模块将等待其他缺少的数据。如果估计序例号大于期待的数字且不在缓冲区之内，TCP将会放弃它并返回一个期望获得的数据序例号。 <br />    你伪装成被信任的主机IP，此时该主机仍然处在瘫痪状态，然后向目标主机的513端口（rlogin）发送连接请求。目标主机立刻对连接请求作出反应，发更新SYN+ACK确认包给被信任主机，因为此时被信任主机仍然处于瘫痪状态，它当然无法收到这个包，紧接关攻击者向目标主机发送ACK数据包，该包使用前面估计的序例号加1。如果攻击者估计正确的话，目标主机将会接收该ACK。连接就正式建立起了，可以开始数据传输了。这时就可以将cat ‘++’&gt;&gt;~/.rhosts命令发送过去，这样完成本次攻击后就可以不用口令直接登录到目标主机上了。如果达到这一步，一次完整的IP欺骗就算完成了，黑客已经在目标机上得到了一个Shell权限，接下来就是利用系统的溢出或错误配置扩大权限，当然黑客的最终目的还是获得服务器的root权限。<br />    <font style="BACKGROUND-COLOR: #f5f5dc" color="#000080"><strong>3、总结一下IP攻击的整个步骤：<br /></strong></font><font style="BACKGROUND-COLOR: #ffa500">    （1）首先使被信任主机的网络暂时瘫痪，以免对攻击造成***扰；<br />    （2）然后连接到目标机的某个端口来猜测ISN基值和增加规律；<br />    （3）接下来把源址址伪装成被信任主机，发送带有SYN标志的数据段请求连接；<br />    （4）然后等待目标机发送SYN+ACK包给已经瘫痪的主机；<br />    （5）最后再次伪装成被信任主机向目标机发送的ACK，此时发送的数据段带有预测的目标机的ISN+1；<br />    （6）连接建立，发送命令请求。</font></font></span>
						<font style="BACKGROUND-COLOR: #ffa500">
						</font>
				</font>
		</p>
<img src ="http://www.blogjava.net/sunrisefe/aggbug/68042.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sunrisefe/" target="_blank">小涧流水</a> 2006-09-06 15:41 <a href="http://www.blogjava.net/sunrisefe/archive/2006/09/06/68042.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SYN Flood攻击原理及防范</title><link>http://www.blogjava.net/sunrisefe/archive/2006/09/06/67954.html</link><dc:creator>小涧流水</dc:creator><author>小涧流水</author><pubDate>Wed, 06 Sep 2006 02:09:00 GMT</pubDate><guid>http://www.blogjava.net/sunrisefe/archive/2006/09/06/67954.html</guid><wfw:comment>http://www.blogjava.net/sunrisefe/comments/67954.html</wfw:comment><comments>http://www.blogjava.net/sunrisefe/archive/2006/09/06/67954.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sunrisefe/comments/commentRss/67954.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sunrisefe/services/trackbacks/67954.html</trackback:ping><description><![CDATA[SYN Flood是当前最流行的DoS（拒绝服务攻击）与DdoS（分布式拒绝服务攻击）的方式之一，这是一种利用TCP协议缺陷，发送大量伪造的TCP连接请求，从而使得被攻击方资源耗尽（CPU满负荷或内存不足）的攻击方式。
<p>　　要明白这种攻击的基本原理，还是要<font color="#000080"><strong>从TCP连接建立的过程</strong></font>开始说起：</p><p>    大家都知道，TCP与UDP不同，它是基于连接的，也就是说：为了在服务端和客户端之间传送TCP数据，必须先建立一个虚拟电路，也就是TCP连接，建立TCP连接的标准过程是这样的：</p><p>　　首先，请求端（客户端）发送一个包含SYN标志的TCP报文，SYN即同步（Synchronize），同步报文会指明客户端使用的端口以及TCP连接的初始序号；</p><p>　　第二步，服务器在收到客户端的SYN报文后，将返回一个SYN+ACK的报文，表示客户端的请求被接受，同时TCP序号被加一，ACK即确认（Acknowledgement）。</p><p>　　第三步，客户端也返回一个确认报文ACK给服务器端，同样TCP序列号被加一，到此一个TCP连接完成。</p><p>    以上的连接过程在TCP协议中被称为三次握手（Three-way Handshake）。</p><p>　　<font color="#000080">问题就出在TCP连接的三次握手中，假设一个用户向服务器发送了SYN报文后突然死机或掉线，那么服务器在发出SYN+ACK应答报文后是无法收到客户端的ACK报文的（第三次握手无法完成），这种情况下服务器端一般会重试（再次发送SYN+ACK给客户端）并等待一段时间后丢弃这个未完成的连接，这段时间的长度我们称为SYN Timeout，一般来说这个时间是分钟的数量级（大约为30秒-2分钟）；一个用户出现异常导致服务器的一个线程等待1分钟并不是什么很大的问题，但如果有一个恶意的攻击者大量模拟这种情况，服务器端将为了维护一个非常大的半连接列表而消耗非常多的资源----数以万计的半连接，即使是简单的保存并遍历也会消耗非常多的CPU时间和内存，何况还要不断对这个列表中的IP进行SYN+ACK的重试。实际上如果服务器的TCP/IP栈不够强大，最后的结果往往是堆栈溢出崩溃---即使服务器端的系统足够强大，服务器端也将忙于处理攻击者伪造的TCP连接请求而无暇理睬客户的正常请求（毕竟客户端的正常请求比率非常之小），此时从正常客户的角度看来，服务器失去响应，这种情况我们称作：服务器端受到了SYN Flood攻击（SYN洪水攻击）。</font></p><p>　　<font color="#800080">从防御角度来说，有几种简单的解决方法</font>：</p><p>　　第一种是缩短SYN Timeout时间，由于SYN Flood攻击的效果取决于服务器上保持的SYN半连接数，这个值=SYN攻击的频度 x  SYN Timeout，所以通过缩短从接收到SYN报文到确定这个报文无效并丢弃改连接的时间，例如设置为20秒以下（过低的SYN Timeout设置可能会影响客户的正常访问），可以成倍的降低服务器的负荷。</p><p>　　第二种方法是设置SYN Cookie，就是给每一个请求连接的IP地址分配一个Cookie，如果短时间内连续受到某个IP的重复SYN报文，就认定是受到了攻击，以后从这个IP地址来的包会被丢弃。</p><p>　　可是上述的两种方法只能对付比较原始的SYN Flood攻击，缩短SYN Timeout时间仅在对方攻击频度不高的情况下生效，SYN Cookie更依赖于对方使用真实的IP地址，如果攻击者以数万/秒的速度发送SYN报文，同时利用SOCK_RAW随机改写IP报文中的源地址，以上的方法将毫无用武之地。<br /></p><img src ="http://www.blogjava.net/sunrisefe/aggbug/67954.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sunrisefe/" target="_blank">小涧流水</a> 2006-09-06 10:09 <a href="http://www.blogjava.net/sunrisefe/archive/2006/09/06/67954.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Smurf攻击及其对策</title><link>http://www.blogjava.net/sunrisefe/archive/2006/09/06/67953.html</link><dc:creator>小涧流水</dc:creator><author>小涧流水</author><pubDate>Wed, 06 Sep 2006 02:08:00 GMT</pubDate><guid>http://www.blogjava.net/sunrisefe/archive/2006/09/06/67953.html</guid><wfw:comment>http://www.blogjava.net/sunrisefe/comments/67953.html</wfw:comment><comments>http://www.blogjava.net/sunrisefe/archive/2006/09/06/67953.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sunrisefe/comments/commentRss/67953.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sunrisefe/services/trackbacks/67953.html</trackback:ping><description><![CDATA[
		<font color="#000080">Smurf攻击是以最初发动这种攻击的程序名Smurf来命名。这种攻击方法结合使用了IP欺骗和ICMP回复方法使大量网络传输充斥目标系统，引起目标系统拒绝为正常系统进行服务。</font>
		<p>　　攻击的过程是这样的：Woodlly Attacker向一个具有大量主机和因特网连接的网络的广播地址发送一个欺骗性Ping分组（echo 请求），这个目标网络被称为反弹站点，而欺骗性Ping分组的源地址就是Woolly希望攻击的系统。</p>
		<p>　　这种攻击的前提是，路由器接收到这个发送给IP广播地址（如206.121.73.255）的分组后，会认为这就是广播分组，并且把以太网广播地址FF:FF:FF:FF:FF:FF:映射过来。这样路由器人因特网上接收到该分组，会对本地网段中的所有主机进行广播。</p>
		<p>　　读者肯定能够想到下面会发生什么情况。网段中的所有主机都会向欺骗性分组的IP地址发送echo响应信息。如果这是一个很大的以太网段，可以会有500个以上的主机对收到的echo请求进行回复。</p>
		<p>　　由于多数系统都会尽快地处理ICMP传输信息，Woodlly Attacker把分组的源地址设置为目标系统，因些目标系统都很快就会被大量的echo信息吞没，这样轻而易举地就能够阻止该系统处理其它任何网络传输，从而引起拒绝为正常系统服务。</p>
		<p>　　这种攻击不仅影响目标系统，还影响目标公司的因特网连接。如果反弹站点具有T3连接（45Mbps），而目标系统所在的公司使用的是租用线路（56Kbps），则所有进出该公司的通讯都会停止下来。</p>
		<p>　　那么如何防止这种类型的攻击？用户可以分别在源站点、反弹站点和目标站点三个方面采取步骤，以限制Smurf攻击的影响。[page]<span class="f14"><font size="3">　　<strong><font color="#ff0000">解决办法：</font></strong></font></span></p>
		<p>
		</p>
		<p>　　<strong>阻塞Smurf攻击的源头</strong></p>
		<p>　　Smurf攻击依靠攻击者的力量使用欺骗性源地址发送echo请求。用户可以使用路由路的访问保证内部网络中发出的所有传输信息都具有合法的源地址，以防止这种攻击。这样可以使欺骗性分组无法找到反弹站点。</p>
		<p>　　<strong>阻塞Smurf的反弹站点</strong></p>
		<p>　　用户可以有两种选择以阻塞Smurf攻击的反弹站点。第一种方法可以简单地阻塞所有入站echo请求，这们可以防止这些分组到达自己的网络。</p>
		<p>　　如果不能阻塞所有入站echo请求，用户就需要罅自己的路由器把网络广播地址映射成为LAN广播地址。制止了这个映射过程，自己的系统就不会再收到这些echo请求。</p>
		<p>　　如果使用Cisco路由路，制止网络广播映射成为LAN广播的方法是在LAN接口的配置模式中输入命令：<br />no ip directed-broadcast</p>
		<p>　　注意：必须在所有路由器的所有LAN接口都使用该命令。只在某些外围路由器上使用上述命令不会起作用。</p>
		<p>　　<strong>防止Smurf攻击目标站点</strong></p>
		<p>　　除非用户的ISP愿意提供帮助，否则用户自己很难防止Smurf对自己的WAN接连线路造成的影响。虽然用户可以在自己的网络设备中阻塞这种传输，但对于防止Smurf吞噬所有的WAN带宽已经太晚了。</p>
		<p>　　但至少用户可以把Smurf的影响限制在外围设备上。通过使用动态分组过滤技术，或者使用防火墙，用户可以阻止这些分组进入自己的网络。防火墙的状态表很清楚这些攻击会话不是本地网络中发出的（状态表记录中没有最初的echo请求记录），因些它会象对待其它欺骗性攻击行为那样把这样信息丢弃。 </p>
<img src ="http://www.blogjava.net/sunrisefe/aggbug/67953.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sunrisefe/" target="_blank">小涧流水</a> 2006-09-06 10:08 <a href="http://www.blogjava.net/sunrisefe/archive/2006/09/06/67953.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数字时间认证</title><link>http://www.blogjava.net/sunrisefe/archive/2006/07/30/60829.html</link><dc:creator>小涧流水</dc:creator><author>小涧流水</author><pubDate>Sun, 30 Jul 2006 02:50:00 GMT</pubDate><guid>http://www.blogjava.net/sunrisefe/archive/2006/07/30/60829.html</guid><wfw:comment>http://www.blogjava.net/sunrisefe/comments/60829.html</wfw:comment><comments>http://www.blogjava.net/sunrisefe/archive/2006/07/30/60829.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sunrisefe/comments/commentRss/60829.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sunrisefe/services/trackbacks/60829.html</trackback:ping><description><![CDATA[
		<p class="text1" align="center">
				<font color="#669933">
						<b>来源于：<a href="http://www.time.ac.cn/serve/d.htm">http://www.time.ac.cn/serve/d.htm</a></b>
				</font>
		</p>
		<p class="maintext">
				<b>数字时间戳（digital time-stamp） </b>
				<br />　　在各种政务和商务文件中，时间是十分重要的信息。在书面合同中，文件签署的日期和签名一样均是十分重要的防止文件被伪造和篡改的关键性内容。 <br />　　在电子文件中，同样需对文件的日期和时间信息采取安全措施，而数字时间戳服务（DTS：digital time-stamp service）就能提供电子文件发表时间的安全保护。 <br />　　数字时间戳服务（DTS）是网上安全服务项目，由专门的机构提供。时间戳(time-stamp)是一个经加密后形成的凭证文档，它包括三个部分：<br /><b>①</b> 需加时间戳的文件的摘要 (digest)；<br /><b>②</b> DTS收到文件的日期和时间；<br /><b>③</b> DTS的数字签名。 <br />　　<font color="#000080">时间戳产生的过程为：用户首先将需要加时间戳的文件用HASH编码加密形成摘要，然后将该摘要发送到DTS，DTS在加入了收到文件摘要的日期和时间信息后再对该文件加密（数字签名），然后送回用户。</font>由 Bellcore 创造的DTS采用如下的过程：加密时将摘要信息归并到二叉树的数据结构；再将二叉树的根值发表在报纸上，这样更有效地为文件发表时间提供了佐证。注意，书面签署文件的时间是由签署人自己写上的，而数字时间戳则不然，它是由认证单位DTS来加的，以DTS收到文件的时间为依据。因此，时间戳也可作为科学家的科学发明文献的时间认证。 </p>
		<p class="maintext">
				<b>时间认证中心 (TCA Time Certification Authority) </b>
				<br />　　在电子交易中，无论是数字时间戳服务（DTS）还是数字证书 (Digital ID)的发放，都<br />不是靠交易的双方自己能完成的，而需要有一个具有权威性和公正性的第三方来完成。认证中心(CA)就是承担网上安全电子交易认证服务、能签发数字证书、并能确认用户身份的服务机构。认证中心通常是企业性的服务机构，主要任务是受理数字证书的申请、签发及对数字证书的管理。认证中心依据认证操作规定 (CPS：Certification Practice Statement)来实施服务操作。</p>
		<p>
				<span class="maintext">
						<b>我国数字时间认证中心</b>
						<br />国家授时中心（NTSC）作为我国标准时间产生、保持和传递的中心，具有数字时间认证的技术条件和权威性。国家授时中心正在积极建立我国的数字时间认证中心，以满足日益发展的电子政务和电子商务的迫切需求。预计该中心将在2001年建成并投入使用。<br /></span>
		</p>
<img src ="http://www.blogjava.net/sunrisefe/aggbug/60829.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sunrisefe/" target="_blank">小涧流水</a> 2006-07-30 10:50 <a href="http://www.blogjava.net/sunrisefe/archive/2006/07/30/60829.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转　Web应用的输入攻击及其防范</title><link>http://www.blogjava.net/sunrisefe/archive/2006/07/23/59668.html</link><dc:creator>小涧流水</dc:creator><author>小涧流水</author><pubDate>Sun, 23 Jul 2006 09:43:00 GMT</pubDate><guid>http://www.blogjava.net/sunrisefe/archive/2006/07/23/59668.html</guid><wfw:comment>http://www.blogjava.net/sunrisefe/comments/59668.html</wfw:comment><comments>http://www.blogjava.net/sunrisefe/archive/2006/07/23/59668.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sunrisefe/comments/commentRss/59668.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sunrisefe/services/trackbacks/59668.html</trackback:ping><description><![CDATA[
		<h3>来自：<a href="http://www.vbyte.com/blog/detail.asp?blog_id=1&amp;content_id=3&amp;cat_id=7">http://www.vbyte.com/blog/detail.asp?blog_id=1&amp;content_id=3&amp;cat_id=7</a></h3>
		<div>
				<p>
				</p>
				<div>一、攻击者绕过身份验证的方法 <br /><br />　　设想有这样一个简单的用户登录程序：它通过表单获取用户名字和密码，然而把这些数据发送到服务器端，服务器端程序查找数据库并验<br /><br />证用户身份。这种用户身份验证方法非常常见。检查用户名字和密码时，许多开发者使用的是类如下面的代码： <br /><br /><br />&lt;HTML&gt;<br />&lt;%@language=javascript....%&gt;<br />&lt;%<br />if (isPasswordOK(Request.form("name"),Request.form("pwd"))) {<br />Response.write("身份验证通过!");<br />// 其他操作<br />} else {<br />Response.write("拒绝访问!");<br />}<br /><br />function isPasswordOK(strName, strPwd) {<br />var fAllowLogon = false;<br />try {<br />var oConn = new ActiveXObject("ADODB.Connection");<br />var strConnection="Provider=Microsoft.Jet.OLEDB.4.0;Data<br />Source=c:\\auth\\auth.mdb;"<br />oConn.Open(strConnection);<br />var strSQL = "SELECT count(*) FROM client WHERE " +<br />"(name='" + strName + "') " + <br />" and " +<br />"(pwd='" + strPwd + "')";<br />var oRS = new ActiveXObject("ADODB.RecordSet");<br />oRS.Open(strSQL,oConn);<br />fAllowLogon = (oRS(0).Value &gt; 0) ? true : false;<br />oRS.Close();<br />delete oRS;<br />oConn.Close();<br />delete oConn;<br />} catch(e) {<br />fAllowLogon = false;<br />}<br /><br />return fAllowLogon;<br />}<br />%&gt;<br />&lt;/HTML&gt;<br /><br /><br /><br />　　注意，在上面的代码中，程序从表单数据中提取出用户名字和密码，然后直接传递给了进行验证的函数isPasswordOK。查询数据库的SQL命<br /><br />令直接利用表单输入数据构造，这是一个不安全的过程。假设用户名字是“mikey”，密码是“&amp;y-)4Hi=Qw8”，则实际查询数据库的SQL命令是<br /><br />： <br /><br /><br />SELECT count(*) FROM client WHERE (name='mikey') and<br />(pwd='&amp;y-)4Hi=Qw8')<br /><br /><br /><br />　　当查询结果中count(*)返回合适的数值时，用户“mikey”的身份验证通过。如果count(*)返回的结果是0，则查询未能找到匹配的记录，<br /><br />用户被拒绝访问。 <br /><br />　　那么，攻击者如何绕过这个验证过程呢？首先，攻击者会假定验证过程使用上面这种SQL命令进行验证，然后他们就发送伪造的用户名字和<br /><br />密码，改变SQL命令的判断逻辑。例如，如果攻击者输入的用户名字是“x' or 1) or ('1”，密码是“anyoldpassword”，则实际查询数据库<br /><br />的SQL命令将变成： <br /><br /><br />SELECT count(*) FROM client WHERE (name='x' or 1) or ('1')<br />and (pwd='anyoldpassword')<br /><br /><br /><br />　　可以看出，这个查询选出的行数量总是大于或等于1，即count(*)的返回结果总是1或者更大。由此，虽然攻击者并不知道合法的用户名字<br /><br />和密码，他总是能够通过身份验证！ <br /><br />　　注意下面5点有助于防止攻击者绕过Web应用的身份验证过程。 <br /><br />二、防止错误信息泄密 <br /><br /><br />　　不要向浏览器返回带有出错SQL命令的错误信息。出现脚本错误时，默认情况下IIS会返回一个500-100错误信息。事实上，返回不带调试信<br /><br />息的错误信息更有利于安全。例如，当我们在登录表单输入伪造的用户名字和密码时，服务器返回的错误信息可能如下： <br /><br /><br />Error Type:<br />Microsoft JET Database Engine (0x80040E14)<br />Syntax error (missing operator) in query expression <br />'(name='x' or 1) or ('1') and (pwd=''p')'.<br />/login.asp, line 24<br /><br /><br /><br />　　可以看到，错误信息中包含了部分SQL命令，它会帮助攻击者改正原先的错误，为攻击者快速构造出虽然伪造、但在SQL命令中合法的用户<br /><br />名字和密码带来了方便。 <br /><br />　　要减少服务器返回的错误信息量，最简单的方法是修改%winnt%\help\iisHelp\500-100.asp；或者创建一个新的文件，同时设置IIS，使得<br /><br />500.100错误出现时服务器返回这个新的文件。设置IIS服务器的步骤如下： <br /><br /><br />1.打开IIS管理工具 <br />2.右击要设置的Web服务器 <br />3.选择“属性” <br />4.选择定制错误的选项卡 <br />5.输入定制的500.100错误页面文件的名字 <br />　　对于安全来说，错误信息中最好永远不要出现服务器上的物理路径。例如，返回“不能在c:\wwwroot\secretlocation目录下找到foo.doc<br /><br />文件”这种错误信息并不有利于安全，一个简单的404提示已经足够了。 <br /><br />三、确定合法性规则 <br /><br />　　利用VBscript....、Jscript....以及Perl语言的正则表达式，我们可以为用户输入数据定义合法性规则。不要去分析哪些输入数据非法，因为攻击<br /><br />者会找出绕过非法数据检查规则的办法。例如，假设为了防止用户向网站发送HTML数据，我们要替换输入数据中的“&lt;”和“&gt;”符号： <br /><br /><br />strInput = strInput.replace(/[&lt;&gt;]/,""); <br /><br /><br /><br />　　上面这个语句把“&lt;”和“&gt;”符号替换成空字符串。那么，是否这样一来攻击者所发送的HTML就不能再发送到服务器上了呢？答案是否定<br /><br />的。攻击者只需把“&lt;”和“&gt;”替换为相应的HTML实体符号，上述分析用户输入的代码就不能再找出HTML。由此我们认识到，正确的方法应该<br /><br />是先确定什么是合法的，然后验证用户输入的合法性，拒绝所有不符合合法性规则的输入： <br /><br /><br />if (strName.search(/[^A-Za-z 0-9]/) != -1) return false; <br /><br /><br /><br />　　这行代码搜索strName，如果strName包含除了大写字母、小写字母、数字和空白字符之外的（这就是^的含义）字符，则输入数据被拒绝。 <br /><br /><br />　　进行输入检验时还要注意伪造的文件名字。攻击者可能尝试把数据发送到某些敏感的位置，或者可能发出请求试图得到源文件，等等。下<br /><br />面这个正则表达式对文件名字作严格的限制。合法文件名字的规则描述如下： <br /><br /><br />●一个或者多个0-9a-zA-Z或_，再加上 <br /><br />●一个或者多个0-9a-zA-Z、-、\、/和_，再加上 <br /><br />●一个句点，再加上 <br /><br />●’’、’txt’、’jpg’、’jpeg’、’gif’、’htm’、’html’、’png’、’bmp’或’zip’ <br /><br />　　所有不符合上述规则的文件名字都非法。这个文件名字规则非常严格，但确实有效。你可以看到，文件名字不能以斜杠开头，因为斜杠是<br /><br />磁盘的根目录。除了攻击者之外，另外还有谁需要从磁盘的根目录开始访问呢？所有对文件的访问都应该相对于Web网站的根进行： <br /><br /><br />var strInput = Request.form("filename"); <br /><br />var re = /^[\w]{1,}[\w\-\/\\]{1,}\.(txt|jpg|jpeg|gif|htm|html|png|bmp|zip) <br /><br />{0,1}$/i; <br /><br />var fIsFilenameValid = (re.test(strInput)) ? true : false; <br /><br />四、正确处理引号 <br /><br />　　引号有时候很难处理，因为它们会干扰SQL命令。如本文开头的例子，攻击者利用引号改变SQL命令的逻辑，使得不具备合法用户名字和密<br /><br />码的人也能够登录系统。防止利用引号攻击的另外一种方法是事先转义引号字符。下面这个正则表达式将把所有单引号和双引号分别替换为两<br /><br />个单引号和两个双引号。替换得到的SQL命令完全合乎SQL语法，而且它使得许多攻击更难进行。 <br /><br /><br />strPwd = strPwd.replace(/([\’\"])/g,"$1$1"); <br /><br /><br /><br />　　这个语句可以替换前面加上的正则表达式。但也可以两者一起使用，加强防卫力量！ <br /><br />五、检查SQL查询返回的数据 <br /><br />　　一种完全防止这类攻击的方法是停止使用只能表示“赞成、反对”的count(*)，改为检查用户名字、密码是否和SQL命令返回的用户名字、<br /><br />密码匹配。具体代码如下所示： <br /><br /><br />var strSQL = "SELECT name, pwd FROM client WHERE " + <br /><br />"(name=’" + strName + "’) " + <br /><br />" and " + <br /><br />"(pwd=’" + strPwd + "’)"; <br /><br />var oRS = new ActiveXObject("ADODB.RecordSet"); <br /><br />oRS.Open(strSQL,oConn); <br /><br />fAllowLogon = (oRS(0).Value == strName &amp;&amp; oRS(1).Value == strPwd) <br /><br />? true : false; <br /><br /><br /><br />　　如果SQL查询没有返回数据，程序将触发一个异常，随后这个异常就被catch()捕获。 <br /><br /><br />六、禁用父路径 <br /><br />　　确保文件名字中没有出现“..”。按照如下步骤禁用父路径： <br /><br /><br />右击Web网站的根，从菜单选择“属性”。 <br /><br />●选择“主目录”选项卡。 <br /><br />●点击“配置”。 <br /><br />●点击“应用程序选项”。 <br /><br />●取消“启用父路径”。 <br /><br />　　如果要从命令行禁用父路径，请执行如下命令： <br /><br /><br />cscript.... adsutil.vbs set w3svc/1/root/AspEnableParentPaths false <br /><br /><br /><br />　　要真正做到对输入攻击的全面防范，你必须有一切输入数据都可能有危险的心理准备。检查合法的输入，而不是检查不合法的输入，因为<br /><br />攻击者很快就可以找出突破不合法规则的办法。同时，学习并正确地运用正则表达式。记住了这几点，你就能够大大减少Web应用被侵入的机会。 </div>
		</div>
<img src ="http://www.blogjava.net/sunrisefe/aggbug/59668.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sunrisefe/" target="_blank">小涧流水</a> 2006-07-23 17:43 <a href="http://www.blogjava.net/sunrisefe/archive/2006/07/23/59668.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>