成都爱特生信息技术有限公司

业界资讯

诠释黑客的网络攻击类型
一、名词解释

DDoS

Distributed Denial of Service,分布式拒绝服务,简称DDoS。指将多个计算机联合起来作为攻击平台,对一个或多个目标发动DoS(拒绝服务)攻击,从而成倍地提高拒绝服务攻击的威力。

ICMP

ICMP是(Internet Control Message Protocol)Internet控制报文协议。它是TCP/IP协议族的一个子协议,属于网络层协议,主要用于在主机、路由器之间传递控制信息,包括网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然不传输用户数据,但是对于用户数据的传递起着重要的作用。

Tracert

Tracert(路由跟踪)用于确定IP数据包访问目标所采取的路径。Tracert命令用IP生存时间(TTL,time to live)字段和ICMP错误消息来确定从一个主机到网络上其它主机的路由。

二、侦察/信息收集型攻击

侦察是未经授权的发现和扫描系统、服务或漏洞,也被称为信息收集。信息收集型攻击是一种基础的网络攻击方式,并不对目标本身造成危害,在大多数情况下,它是其它攻击方式的先导,被用来为进一步入侵提供有用的信息。通过向目标主机发送数据包,然后根据响应来搜集系统信息,发现服务器的端口分配及所提供服务和软件版本,可以进一步检测远程或者本地主机安全脆弱性。此类攻击通常包含地址扫描、网络端口扫描、操作系统探测、漏洞扫描。

2.1  地址扫描

地址扫描指的是攻击者利用ping、tracert或firewalk等攻击或者直接利用ICMP消息发向目标网络,请求应答,如果请求和应答没有被网络边界过滤掉,攻击者就可以借此来获得目的网络地址分配信息,进而分析目的网络的拓扑结构。防御方法是在防火墙上过滤掉ICMP应答消息。

此类工具非常多,网上随便都可以下载到,我这里有一个非常好用的IPMAC.exe小工具,该工具可以在指定的IP地址范围内扫描活跃的IP地址以及对应的MAC地址。

2.2  端口扫描

端口扫描就是通过连接到目标系统的TCP或UDP端口,来确定哪些端口开放?什么服务正在运行?

一般来说端口扫描有三个用途:识别目标系统上正在运行的TCP和UDP服务;识别目标系统的操作系统类型;识别某个应用程序或某个特定服务的版本号。

端口扫描方法有全连接扫描、半连接扫描、秘密扫描、UDP ICMP端口不可到达扫描。

全连接扫描是最基本的TCP扫描,它调用操作系统提供的connect()函数,通过完整的TCP三次握手,与目标计算机的端口进行尝试性的连接。如果connect()返回成功说明该端口打开,否者没有打开。

半连接扫描指的是不使用完整的TCP三次握手来进行连接尝试。此类扫描方式比全连接扫描隐蔽且速度快,但是需要自己构造IP包,因此需要root权限,并且需要防火墙可以过滤掉此类扫描包。

秘密扫描方法有TCP FIN扫描和TCP ACK扫描两种。TCP FIN(False Positives)扫描的指的是反向确定结果,即攻击者向主机发送虚假消息,当对方没有任何响应时认为目标端口是开放的,而如果返回数据包则认为目标端口是关闭的,这种方法在区分Unix和NT时,是十分有用的;TCP ACK扫描的原理是,当申请主机向目标主机一个端口发送一个只有ACK标志的TCP数据包,如果目标主机该端口是“开”状态,则返回一个TCP RST数据包,否则不回复,根据这一原理可以判断对方端口是处于开还是关状态。以上两种秘密扫描方式的优点是比较难记录,可以绕过某些防火墙,且不包含TCP三步握手建立连接中的任何一步,有很多的实现方法。但是需要用户具备root权限来构造IP包,另外,对Win NT系统,不管端口是否打开,都回复RST,TCP FIN扫描方法就失效了。

UDP ICMP端口不可到达扫描的扫描方法与上面几种方法的不同之处在于使用的是UDP协议,由于这个协议简单,扫描变得相对比较困难。这是由于打开的端口对扫描探测并不发送一个确认,关闭的端口也并不需要发送一个错误数据包。幸运的是,许多主机在你向一个未打开的UDP端口发送一个数据包时,会返回一个ICMP_PORT_UNREACH错误。这样你就能发现哪个端口是关闭的。UDP和ICMP错误都不保证能到达,因此这种扫描器必须还实现在一个包看上去是丢失的时候能重新传输。这种扫描方法是很慢的,因为RFC对ICMP错误消息的产生速率做了规定。同样,这种扫描方法需要具有root权限。

下方是三种端口扫描技术的优缺点总结:

管他如何实现的端口扫描,只要能成功获得端口扫描结果才是王道,下面是一个scanport.exe小工具的端口扫描效果图。

Nmap工具也可以实现主机端口扫描,如下图,在命令行下进入nmap软件目录,然后输入下方红框里的命令,执行即可。

2.3  操作系统探测

操作系统探测指的是攻击者使用具有已知响应类型的数据库的自动工具,对来自目标主机的、对坏数据包传送所作出的响应进行检查。由于每种操作系统都有其独特的响应方法(例如NT和Solaris的TCP/IP堆栈具体实现有所不同),通过将此独特的响应与数据库中的已知响应进行对比,黑客经常能够确定出目标主机所运行的操作系统。

另外,攻击者可以通过DNS域转换、Finger服务、LDAP服务获取操作系统的主机名或用户信息。

DNS协议不对转换或信息性的更新进行身份认证,这使得该协议被人以一些不同的方式加以利用,如果你维护着一台公共的DNS服务器,黑客只需实施一次域转换操作就能得到你所有主机的名称以及内部IP地址。

Finger服务指的是黑客使用finger命令来刺探一台finger服务器以获取关于该系统的用户信息。

LDAP服务指的是黑客使用LDAP协议窥探网络内部的系统和它们的用户的信息。

可以使用nmap工具查看主机的操作系统信息,包括主机状态、主机名等信息。

可以使用NMAP工具探测主机的操作系统:

2.4  漏洞扫描

网络漏洞扫描技术建立在上述三种扫描技术的基础之上,通过上述三种方法可以收集到很多目标主机的各种信息,例如是否能用匿名登录、是否有可写的FTP目录、是否能用telnet、httpd是否用root在运行等。在获得目标主机TCP/IP端口和其对应的网络访问服务相关信息后,与网络漏洞扫描系统提供的漏洞库进行匹配,如果满足匹配条件,则视为漏洞存在。

基于上述三种扫描技术形成的漏洞扫描工具有Nmap、Nessus、X-scan。

nmap基本功能有三个,一是探测一组主机是否在线;其次是扫描 主机端口,嗅探所提供的网络服务;还可以推断主机所用的操作系统 。

允许系统管理员察看一个大的网络系统有哪些主机以及其上运行何种服务。它支持多种协议的扫描如UDP,TCP connect(),TCP SYN (half open), ftp proxy (bounce attack),Reverse-ident, ICMP (ping sweep), FIN, ACK sweep, Xmas Tree, SYN sweep, 和Null 扫描。你可以从SCAN TYPES 一节中察看相关细节。nmap 还提供一些实用功能如通过tcp/ip 来甄别操作系统类型、秘密扫描、动态延迟和重发、平行扫描、通过并行的PING 侦测下属的主机、欺骗扫描、端口过滤探测、直接的RPC 扫描、分布扫描、灵活的目标选择以及端口的描述。

nmap -oX - --system-dns 192.168.76.201 –sn

nmap -oX - --system-dns 192.168.76.201 -P0 –O

nmap -oX - --system-dns 192.168.76.201 -sP

Nessus 是一个功能强大而又易于使用的远程安全扫描器,它不仅免费而且更新极快。安全扫描器的功能是对指定网络进行安全检查,找出该网络是否存在有导致对手攻击的安全漏洞。该系统被设计为client/sever 模式,服务器端负责进行安全检查,客户端用来配置管理服务器端。在服务端还采用了plug-in的体系,允许用户加入执行特定功能的插件,这插件可以进行更快速和更复杂的安全检查。在Nessus 中还采用了一个共享的信息接口,称之知识库,其中保存了前面进行检查的结果。检查的结果可以HTML、纯文本、LaTeX(一种文本文件格式)等几种格式保存。

X-scan是Xfocus小组自己写的一款扫描软件,有图形界面和命令行两种形式,运行在windows平台,实际上使用的是nmap 的核心内容,采用多线程方式对指定IP地址段进行安全漏洞检测,支持插件功能,提供了图形界面和命令行两种操作方式,扫描内容包括远程服务类型、操作系统类型及版本、各种弱口令漏洞、后门、应用服务漏洞、网络设备漏洞、拒绝服务漏洞等等。

三、访问类攻击

访问类攻击指的是攻击者在获得或者拥有访问主机、网络的权限后,肆意滥用这些权限进行信息篡改、信息盗取等攻击行为。我通过在网络上搜集资料,暂介绍三种访问类攻击行为:口令攻击、端口重定向、中间人攻击,下面分别对其做个具体描述。

3.1  口令攻击击

攻击者攻击目标时常常把破译用户的口令作为攻击的开始,只要攻击者能猜测或者确定用户的口令,他就能获得机器或者网络的访问权,并能访问到用户能访问到的任何资源。特别是若这个用户有域管理员或root用户权限,这是极其危险的。

口令攻击的原理是先得到该主机上的某个合法用户的账号,然后再进行合法用户口令的破译。

获得普通用户账号的方法很多,比如:

1) 利用目标主机的Finger功能:当用Finger命令查询时,主机系统会将保存的用户资料显示在终端或计算机上。

2) 从电子邮件地址中收集:有些用户电子邮件地址会透漏其在目标主机上的账号,很多系统会使用一些习惯性的账号,造成账号的泄漏。

获取用户口令有三种方法:

1) 利用网络监听非法得到用户口令。当前,很多协议根本就没有采用任何加密或身份认证技术,如在Telnet、FTP、HTTP、SMTP等传输协议中,用户帐户和密码信息都是以明文格式传输的,攻击者利用数据包截取工具便可很容易收集到帐户和密码。

2) 在知道用户账号后,利用一些专门软件强行破解用户口令。例如,攻击者采用字典穷举法来破解用户的密码,这个破译过程完全可以由计算机程序来自动完成,因而几个小时就可以把上万条记录的字典里所有单词都尝试一遍。

3) 利用系统管理员的失误。在UNIX操作系统中,用户的基本信息存放在password文件中,而所有的口令经过DES加密方法加密后专门存放在一个叫shadow 的文件中。攻击者获取口令文件后,就会使用专门的摩羯DES加密法的程序来解口令。

3.2  端口重定向

端口重定向指的是攻击者对指定端口进行监听,把发给这个端口的数据包转发到指定的第二目标。一旦攻陷了某个关键的目标系统,比如防火墙,攻击者就可以使用端口重定向技术把数据包转发到一个指定地点去,这种攻击的潜在威胁非常大,能让攻击者访问到防火墙后面的任何一个系统。

fpipe是Foundstone公司开发的一个TCP源端口转发/重定向工具,它可以创建一个TCP数据流,并允许指定一个源端口,此种攻击可以绕过一些阻断特定通信进入内部网络的防火墙的限制。fpipe工具的基本功能就是端口重定向,在启动fpipe时需要指定一个服务器端的监听端口、一个远程目的地端口(即实际想要连接的、躲在防火墙后面的那个端口)和一个(可选的)本地源端口。当fpipe启动时,它将等待客户来连接到它的监听端口。在建立起监听连接之后,目标机器(被攻击者)上的目的地端口与本地机器(攻击者)上的指定源端口之间就会建立起一个新的连接,这样就创建出了一个完备的通信通道。建立起这条完整通道之后,fpipe就能把它从外来连接上接收到的所有数据转发到防火墙后面的远程目的地端口、把应答信息返回给发起这次连接的系统。

3.3  中间人攻击(会话劫持)

中间人攻击是一种“间接”的入侵攻击,这种攻击模式,是通过各种技术手段将受入侵者控制的一台计算机虚拟放置在网络连接中的两台通信计算机之间,而这台计算机就称为“中间人”,然后入侵者把这台计算机模拟成一台或两台原始计算机,使“中间人”能够与原始计算机建立活动连接,并允许其读取或修改传递的信息,两个原始计算机用户却认为他们是在互相通信。通常,这种“拦截数据-修改数据-发送数据”的过程就被称为“会话劫持”。通过中间人攻击,攻击者可以实现信息篡改、信息盗取等目的。

下面一个具体实例来形象地描述通过中间人攻击来进行信息篡改的过程。

假设a希望与b通信。同时, c希望拦截窃会话以进行窃听并可能在某些时候传送给b一个虚假的消息。

首先,a会向b索取他的公钥。如果b将他的公钥发送给a,并且此时c能够拦截到这个公钥,一个中间人攻击就可以开展。c发送给a一个伪造的消息,声称自己是b,并且附上了c自己的公钥(而不是b的)。

a收到公钥后相信这个公钥是b的,于是a将她的消息用c的公钥(a以为是b的)加密,并将加密后的消息回给b。c再次截获a回给b的消息,并使用c自己的私钥对消息进行解密,如果c愿意,她也可以对消息进行修改,然后c使用b原先发给a的公钥对消息再次加密。当b收到新加密后的消息时,他会相信这是从a那里发来的消息。

1. a发送给b一条消息,被c截获:

a “嗨,b,我是a。给我你的公钥” --> c、b

2.c将这条截获的消息转送给b;此时b不能分辨这条消息是否真的是从a那里发来的:

a、c “嗨,b,我是a。给我你的公钥” --> b

3. b回应a的消息,并附上了他的公钥:

a c <-- [b的公钥]-- b

4. c用自己的密钥替换了消息中b的密钥,并将消息转发给a,声称这是b的公钥:

a <-- [c的公钥]-- c b

5. a用她以为是b的公钥加密了她的消息,以为只有b才能读到它:

a “我们在公共汽车站见面!”--[使用c的公钥加密] --> c b

6. 然而,由于这个消息实际上是用c的密钥加密的,所以c可以解密它,阅读它,并在愿意的时候修改它,然后使用b的密钥重新加密,并将重新加密后的消息转发给b:

a c “在家等我!”--[使用b的公钥加密] --> b

7. b认为,这条消息是经由安全的传输通道从a那里传来的。

这个例子显示了a和b需要某种方法来确定他们是真正拿到了属于对方的公钥,而不是拿到来自攻击者的公钥。否则,这类攻击一般都是可行的,在原理上,可以针对任何使用公钥——密钥技术的通讯消息发起攻击。幸运的是,有各种不同的技术可以帮助抵御MITM攻击。

四、Web攻击

Web这种应用的可操作性很大,用户使用的自由度也很高,同时,此应用也非常脆弱,遭遇的攻击也非常普遍。当攻击者在Web站点或应用程序后端 “描绘” 某个目标时,通常出于以下两个目的之一:阻碍合法用户对站点的访问,或者降低站点的可靠性。而根据国内某IT网站对网友和Web安全专家调查,以下是当前较“流行”和威胁排名靠前的攻击方式:SQL注入式攻击、跨站脚本攻击、CC攻击、Script/ActiveX攻击以及DDos攻击。DDoS攻击会在后面有一章专门讲述,本章节具体介绍一下SQL注入攻击、跨站脚本攻击、CC攻击、Script/ActiveX攻击。

4.1  SQL注入攻击
4.1.1  SQL注入原理

SQL注入和缓冲区溢出都是一种依赖于开发人员没测试输入数据的疏漏的攻击。SQL注入攻击的基本原理是在用户输入中注入一些额外的特殊符号或SQL语句,使系统构造出来的SQL语句在执行时或者改变了查询条件,或者附带执行了攻击者注入的整个SQL语句,从而让攻击者达到了非法的目的。由于SQL注入攻击利用的是SQL语法,使得这种攻击具有广泛性。理论上说,对于所有基于SQL语言标准的数据库软件都是有效的,包括MSSQL Server、Oracle、DB2、Sybase、MySQL等。只要这个恶意代码负荷SQL语句的规则,则在代码编译与执行的时候,就不会被系统所发现。它的产生主要是由于程序对用户输入的数据没有进行细致的过滤,导致非法数据导入查询。

这种类型的脆弱点是对 Web 应用程序最有效的攻击类型之一,并且随着对 Web 应用程序的信任的增加,这种利用的力量甚至将更令人畏缩。幸运的消息是,像溢出类型的攻击一样,可以通过清洁输入数据,并且从不立即相信用户输入(至少对于输入的数据)来防止大部分这种脆弱点。

4.1.2  SQL注入具体实例

对一些存在SQL注入漏洞的应用系统来说,利用这些漏洞,攻击者可以窃取用户数据,提升权限等,根据注入方式的不同,注入方法主要有以下几种:

1、没有正确或不严格过滤转义字符

在用户的输入没有对转义字符过滤时,就会发生这种形式的注入式攻击,它会被传递给一个SQL语句。这样就会导致应用程序的终端用户对数据库上的语句实施操纵。比方说,下面的这行代码就会演示这种漏洞:

SELECT * FROM users WHERE 'username' = '$USER' AND 'password'='$PASS'; $USER 和 $PASS 会用用户提供的用户名和密码来代替。那么如果用户输入‘bob’和‘1234’,那么结果的查询是:

SELECT * FROM users WHERE 'username' = 'bob' AND 'password' = '1234';

而来自数据库的返回值会是所有用 bob 作为用户名且用 1234 作为密码的数据元组。但是如果黑客输入 admin 和hi' OR 1=1--,那么查询是:

SELECT * FROM users WHERE 'username' = 'admin' and `password` = 'hi' OR 1=1--'

注意用户输入的引号如何与原始查询中的第三个引号匹配。数据库现在会返回用户名为 admin 的所有元组,并且会取消对密码的检查,因为 'password' = 'hi' OR 1=1 命令数据库寻找密码是 hi 的元组或 1=1 的元组,而由于 1 总是 1,所以每行都是候选。-- 是 SQL 注释标志,取消查询中原始的其他引号,并且还将取消任何额外的检查,因此如果有额外的凭证也会被忽略。

在一些SQL服务器上,如在SQL Server中,任何一个SQL命令都可以通过这种方法被注入,包括执行多个语句。下面语句中的username的值将会导致删除“users”表,又可以从“data”表中选择所有的数据(实际上就是透露了每一个用户的信息)。

a'; DROP TABLE userTable; SELECT * FROM data WHERE name LIKE '% 这就将最终的SQL语句变成下面这个样子:

SELECT * FROM userTable WHERE name = 'a'; DROP TABLE userTable; SELECT * FROM DATA WHERE name LIKE '%';

其它的SQL执行不会将执行同样查询中的多个命令作为一项安全措施。这会防止攻击者注入完全独立的查询,不过却不会阻止攻击者修改查询。

2、类型不正确的处理

如果一个用户提供的字段并非一个强类型,或者没有实施类型强制,就会发生这种形式的攻击。当在一个SQL语句中使用一个数字字段时,如果程序员没有检查用户输入的合法性(是否为数字型)就会发生这种攻击。例如:

SELECT * FROM data WHERE id = " + a_variable + ";

从这个语句可以看出,作者希望a_variable是一个与“id”字段有关的数字。不过,如果终端用户选择一个字符串,就绕过了对转义字符的需要。例如,将a_variable设置为:1; DROP TABLE userTable,它会将“userTable”表从数据库中删除,SQL语句变成:

SELECT * FROM DATA WHERE id = 1; DROP TABLE users;

3、数据库服务器中的漏洞

有时,数据库服务器软件中也存在着漏洞,如SQL Server服务器漏洞。例如:分别由NameTxt,PwdTxt接受页面输入用户名和密码,然后构造如下sql语句:

select * from [User] where userName = '" + NameTxt + "'and userPassword = '" + PwdTxt + "'";

比如你的用户名为your,我不知道密码,但是我在"用户名"处输入 your '--",SQL语句变成:

select * from [User] where userName='your '-- 'and userPassword =....

注意"--",会把后边的sql作为注释。

4、盲目SQL注入式攻击

当一个Web应用程序易于遭受攻击而其结果对攻击者却不见时,就会发生所谓的盲目SQL注入式攻击。有漏洞的网页可能并不会显示数据,而是根据注入到合法语句中的逻辑语句的结果显示不同的内容。这种攻击相当耗时,因为必须为每一个获得的字节而精心构造一个新的语句。但是一旦漏洞的位置和目标信息的位置被确立以后,一种称为Absinthe的工具就可以使这种攻击自动化。

5、条件响应

注意,有一种SQL注入迫使数据库在一个普通的应用程序屏幕上计算一个逻辑语句的值:SELECT booktitle FROM booklist WHERE bookId = 'OOk14cd' AND 1=1

这会导致一个标准的面面,而语句SELECT booktitle FROM booklist WHERE bookId = 'OOk14cd' AND 1=2在页面易于受到SQL注入式攻击时,它有可能给出一个不同的结果。如此这般的一次注入将会证明盲目的SQL注入是可能的,它会使攻击者根据另外一个表中的某字段内容设计可以评判真伪的语句。

6、条件性差错

如果WHERE语句为真,这种类型的盲目SQL注入会迫使数据库评判一个引起错误的语句,从而导致一个SQL错误。例如:

SELECT 1/0 FROM users WHERE username='Your'。显然,如果用户Your存在的话,被零除将导致错误。

7、时间测定

时间测定注入则是在注入语句中加入像“ wait for 100”这样的语句,根据该查询结果出现的时间来判定是否能注入、注入是否成功以及推导数据值的范围。这些方法都是通过问一些相关但并非直接且能得到回应的问题,从响应信息推出想要的信息,进而进行攻击。

以上仅是对SQL攻击方法的粗略分类,但从技术上讲,如今的SQL注入攻击者们在如何找出有漏洞的网站方面更加聪明,也更加全面了,攻击者们可以使用各种工具来加速漏洞的发现和利用过程。

4.2  跨站脚本攻击
4.2.1  跨站脚本攻击原理

跨站脚本攻击(Cross Site Scripting,安全专家们通常将其缩写为XSS),是指攻击者利用网站程序对用户输入过滤不足、输入可以显示在页面上对其它用户造成影响的HTML代码,从而盗取用户资料、利用用户身份进行某种动作或者对访问者进行病毒侵害的一种攻击方式。

静态站点不会受到此类攻击影响,但是动态站点往往会,这是因为动态站点的网站中包含大量的动态内容以提高用户体验,所谓的动态内容,就是根据用户环境和需要,Web应用程序能够输出相应的内容。

用户在浏览网站、使用即时通讯软件,甚至在阅读电子邮件时,通常会点击其中的链接。攻击者通过在链接中插入恶意代码,就能够盗取用户信息。攻击者通常会用十六进制(或其他编码方式)将链接编码,以免用户怀疑它的合法性。网站在接收到包含恶意代码的请求之后会产生一个包含恶意代码的页面,而这个页面看起来就像是那个网站应当生成的合法页面一样。许多流行的留言本和论坛程序允许用户发表包含HTML和javascript的贴子,假设用户甲发表了一篇包含恶意脚本的贴子,那么用户乙在浏览这篇贴子时,恶意脚本就会执行,盗取用户乙的session信息。

随着AJAX(Asynchronous JavaScript and XML,异步JavaScript和XML)技术的普遍应用,XSS的攻击危害将被放大。使用AJAX的最大优点,就是可以不用更新整个页面来维护数据,Web应用可以更迅速地响应用户请求。AJAX会处理来自Web服务器及源自第三方的丰富信息,这对XSS攻击提供了良好的机会。AJAX应用架构会泄漏更多应用的细节,如函数和变量名称、函数参数及返回类型、数据类型及有效范围等。AJAX应用架构还有着较传统架构更多的应用输入,这就增加了可被攻击的点。

4.2.2  跨站脚本攻击具体实例

根据XSS跨站脚本攻击存在的形式及产生的效果,可以将其分为以下三类并分别介绍实例:

1、 非持久型XSS跨站脚本攻击

非持久型XSS又叫反射型XSS脚本,它是指那些浏览器每次都要在参数中提交恶意数据才能触发的跨站脚本漏洞。该类XSS跨站脚本攻击方式,只是简单地将用户输入的数据直接或未经过完善的安全过滤就在浏览器中进行输出,导致输出的数据中存在可被浏览器执行的代码数据。由于此种类型的跨站代码存在于URL中,所以黑客通常需要通过诱骗或加密变形等方式,将存在恶意代码的链接发给用户,只有用户点击以后才能使得攻击成功实施。

下面这个页面的主要作用是获取用户输入的参数作为用户名,并在页面中显示“欢迎您,XXX”的形式,具体代码如下:

<?php

$username = $_GET["name"];

echo "<p>欢迎您, ".$username."!</p>";

?>

正常情况下,用户会在URL中提交参数name的值为自己的姓名,然后该数据内容会通过以上代码在页面中展示,如用户提交姓名为“张三”,完整的URL地址如下:

http://localhost/test.php?name=张三

在浏览器中访问时,会显示如下图1所示内容:

图4-1 页面显示用户信息

此时,因为用户输入的数据信息为正常数据信息,经过脚本处理以后页面反馈的源码内容为

欢迎您, 张三!

。但是如果用户提交的数据中包含有可能被浏览器执行的代码的话,会是一种什么情况呢?我们继续提交name的值为<script>alert(/我的名字是张三/)</script>,即完整的URL地址为

http://localhost/test.php?name=<script>alert(/我的名字是张三/)</script>

在浏览器中访问时,我们发现会有弹窗提示,如下图2所示:

那么此时页面的源码又是什么情况呢?

源码变成了“欢迎您, <script>alert(/我的名字是张三/)</script>!”,从源代码中我们发现,用户输入的数据中, 标签中的代码被浏览器执行了,而这并不是网页脚本程序想要的结果。这个例子正是最简单的一种XSS跨站脚本攻击的形式,称之为反射型XSS。

2、持久型XSS脚本攻击

持久型XSS又叫存储XSS,与非持久型XSS相反,它是指通过提交恶意数据到存储器(比如数据库、文本文件等),而Web应用程序输出的时候是从存储器中读出恶意数据输出到,持久型XSS脚本攻击是指Web应用程序会将用户输入的数据信息保存在服务端的数据库或其他文件形式中,网页进行数据查询展示时,会从数据库中获取数据内容,并将数据内容在网页中进行输出展示,因此持久型XSS具有较强的稳定性。

持久型XSS多出现在Web邮箱、BBS、社区等从数据库读取数据的正常页面,由于不需要浏览器提交攻击参数,所以其危害往往大于非持久型XSS攻击。

4.3  CC攻击
4.3.1  CC攻击原理

CC攻击(ChallengeCollapsar)指的是攻击者利用大量代理服务器对目标计算机发起大量连接,导致目标服务器资源枯竭造成拒绝服务,CC攻击也属于拒绝服务类攻击的一种,不过主要是用来攻击页面的。

每个人都有这样的体验:当一个网页访问的人数特别多的时候,打开网页就慢了,而CC就是模拟多个用户(多少线程就是多少用户),不停地进行访问哪些需要大量数据操作(就是需要大量CPU时间)的页面,造成服务器资源的浪费,如果CPU长时间处于100%,永远都有处理不完的连接,那么最后就造成网络拥塞,正常的访问被中止。

4.3.2  CC攻击具体实例

我们假设服务器A对Search.asp的处理时间需要0.01s,也就是说,它1s可以而保证100个用户的Search请求,如果服务器允许的最大连接时间是60s,那么我们使用CC模拟120个用户并发连接,在经过1分钟后,服务器就被请求了7200次,处理的有6000次,于是剩下了1200个用户并发连接没有被处理。

有的朋友会说:丢连接!丢连接!问题是服务器是按“先来后到”的顺序丢的,这1200个是在最后10秒的时候发起的,想丢?还早!经过计算,服务器满负开始丢连接的时候,应该是有7200个并发连接存在队列,然后服务器开始120个/秒的丢连接,发动的连接也是120个/秒,服务器永远有处理不完的连接,服务器的CPU 100%并长时间保持,然后丢连接的60秒服务器也判断处理不过来了,新的连接也处理不了,这样服务器达到了超级繁忙状态。

我们这里假设的服务器处理Search只用了0.01S,也就是10毫秒,使用的线程也只有120,实际的环境下,很多服务器的丢连接时间远比60S长,使用线程远比120多,可以想象可怕了吧。而且客户机只要发送了断开,连接的保持又是代理在做,此时一旦服务器收到SQL请求,肯定会进入队列。不论连接是否已经断开,只要服务器是并发的,不是顺序执行,就会使得更多的请求进入内存请求,对服务器造成更大的负担。

4.4  Script/ActiveX攻击

Script是一种可执行的脚本,它一般由一些脚本语言写成,比如常见的JAVA SCRIPT,VB SCRIPT等。这些脚本在执行的时候,需要一个专门的解释器来翻译,翻译成计算机指令后,在本地计算机上运行。这种脚本的好处是,可以通过少量的程序写成,而完成大量的功能。

这种SCRIPT的一个重要应用就是嵌入在WEB页面里面,执行一些静态WEB页面标记语言(HTML)无法完成的功能,比如本地计算、数据库查询和修改,以及系统信息的提取等。这些脚本在带来方便和强大功能的同时,也为攻击者提供了方便的攻击途径。如果攻击者写一些对系统有破坏的SCRIPT,然后嵌入在WEB页面中,一旦这些页面被下载到本地,计算机便以当前用户的权限执行这些脚本,这样,当前用户所具有的任何权限,SCRIPT都可以使用,可以想象这些恶意的SCRIPT的破坏程度有多强,这就是所谓的SCRIPT攻击。

ActiveX是一种控件对象,它是建立在MICROSOFT的组件对象模型(COM)之上的,而COM则几乎是Windows操作系统的基础结构。ActiveX控件可以嵌入在WEB页面里面,当浏览器下载这些页面到本地后,相应地也下载了嵌入在其中的ActiveX控件,这样控件便可以在本地浏览器进程空间中运行(ActiveX空间没有自己的进程空间,只能由其它进程加载并调用),因此,当前用户的权限有多大,ActiveX的破坏性便有多大。如果一个恶意的攻击者编写一个含有恶意代码的ActiveX控件,然后嵌入在WEB页面中,被一个浏览用户下载后执行,其破坏作用是非常大的,这便是所谓的ActiveX攻击。

五、拒绝服务类攻击

拒绝服务攻击即攻击者想办法让目标机器停止提供服务或资源访问。这些资源包括磁 盘空间、内存、进程甚至网络带宽,从而阻止正常用户的访问。其实对网络带宽进行的消耗性攻击只是拒绝服务攻击的一小部分,只要能够对目标造成麻烦,使某些服务被暂停甚至主机死机,都属于拒绝服务攻击。拒绝服务攻击问题也一直得不到合理的解决,究其原因是因为这是由于网络协议本身的安全缺陷造成的,从而拒绝服务攻击也成为了攻击者的终极手法。

拒绝服务类攻击有两种形式:带宽消耗性以及资源消耗型,它们都是通过大量合法或伪造的请求占用大量网络以及器材资源,以达到瘫痪网络以及系统的目的,接下来介绍一下这两种类型下的常见攻击方式。

5.1  带宽消耗型攻击
5.1.1  UDP洪水攻击(UDP Flood)

UDP洪水攻击(UDP Flood)是日渐猖獗的流量型DoS攻击,这种攻击是抓住了UDP协议是一种面向无连接的传输层协议,以至于数据传送过程中,不需要建立连接和进行认证这一特点。进行攻击时,供给方向被攻击方发送大量的异常高流量的完成UDP数据包,这样一方面通过占用带宽使得被攻击主机所在的网络资源被耗尽,还会使被攻击主机忙于处理UDP数据包,而是系统无暇顾及正常的连接请求,甚至系统资源耗尽或者崩溃。攻击者往往利用UDP Flood攻击方式伪造源IP地址发送大量的小UDP包冲击DNS服务器、Radius认证服务器或流媒体视频服务器。

UDP Flood易于实施,只要被攻击者开放一个UDP服务端口,即可针对该服务发动攻击。

构造udp flood包没有特殊的设置,只要在同一时间发送足够多数量的UDP报文就可以形成。

5.1.2  ICMP洪水攻击(ICMP Flood)

正常情况下,为了对网络进行诊断,一些诊断程序,比如PING等,会发出ICMP响应请求报文(ICMP ECHO),接收计算机收到ICMP ECHO后,会回应一个ICMP ECHO Reply报文。而这个过程是需要CPU处理的,有的情况下还可能消耗点大量的资源,比如处理分片的时候。这样如果攻击者向目标计算机发送大量的ICMP ECHO报文(产生ICMP洪水),则目标计算机会忙于处理这些ECHO报文,而无法继续处理其它的网络数据报文,这也是一种拒绝服务攻击。

此类攻击方法也很简单,只要向被攻击主机发送大量ICMP echo request报文达到一定阀值即可。

5.1.3  死亡之ping(Ping of Death)

Ping of Death指的是攻击者估计发送大于65535字节的ip数据包给被攻击者,被攻击者收到全部分段并重组报文时总的长度超过了65535字节,导致内存溢出,这时主机就会出现内存分配错误而导致TCP/IP堆栈崩溃,系统死机。

不过,现在所有的标准TCP/IP实现都已实现对付超大尺寸的包,并且大多数防火墙能够自动过滤这些攻击,包括:从windows98之后的windows,NT(service pack 3之后),linux、Solaris、和Mac OS都具有抵抗一般ping of death攻击的能力。此外,对防火墙进行配置,阻断ICMP以及任何未知协议,都能防止此类攻击。

5.1.4  Smurf攻击

ICMP ECHO请求包用来对网络进行诊断,当一台计算机接收到这样一个报文后,会向报文的源地址回应一个ICMP ECHO REPLY。一般情况下,计算机是不检查该ECHO请求的源地址的,因此,如果一个恶意的攻击者把ECHO的源地址设置为一个广播地址,这样计算机在回复REPLY的时候,就会以广播地址为目的地址,这样本地网络上所有的计算机都必须处理这些广播报文。如果攻击者发送的ECHO 请求报文足够多,产生的REPLY广播报文就可能把整个网络淹没,这就是所谓的Smurf攻击。

除了把ECHO报文的源地址设置为广播地址外,攻击者还可能把源地址设置为一个子网广播地址,这样,该子网所在的计算机就可能受影响。

要制造此类包,只要设备报文类型为ECHO报文,源地址为广播地址即可。

5.1.6  泪滴攻击(tear drop)

Fraggle攻击实际上就是对Smurf攻击作了简单的修改,使用的是UDP应答消息而非ICMP。

5.1.5  Fraggle攻击

泪滴攻击是一个特殊构造的应用程序,通过发送伪造的相互重叠的IP分组数据包,使其难以被接收主机重新组合,通常会导致目标主机内核失措。泪滴攻击不被认为是一个严重的DOS攻击,不会对主机系统造成重大损失。 在大多数情况下,一次简单的重新启动是最好的解决办法,但重新启动操作系统可能导致正在运行的应用程序中未保存的数据丢失。

5.2  资源消耗型
5.2.1  SYN洪水攻击(SYN Flood)

SYN(Synchronize)即同步报文,同步报文会指明客户端使用的端口以及TCP连接的初始序号。SYN Flood是当前最流行的DoS与DDoS的方式之一,这是一种利用TCP协议缺陷,发送大量伪造的TCP连接请求,从而使得被攻击方资源耗尽(CPU满负荷或内存不足)的攻击方式。

想了解SYN洪水攻击,首先要了解TCP连接的三次握手。客户端向服务器发送一个包含SYN标志的TCP报文,指明客户端使用的端口号以及TCP连接的初始序号,这样客户端就同服务器建立了第一次握手;服务器在收到客户端的SYN报文后,将返回一个SYN+ACK的报文,表示客户端的连接请求被接受,同时TCP序号加1,这样就客户端与服务器就建立了第二次握手;客户端也返回一个确认报文ACK给受害的服务器,同样TCP序列号加1,到此一个TCP连接完成,三次握手也完成。

在TCP连接的三次握手中,假设一个用户向服务器发送了SYN报文后突然死机或掉线,那么服务器在发出SYN+ACK应答报文后市无法收到客户端的ACK报文的(第三次握手无法完成),在这种情况下,服务器端一般会重试(再次发送SYN+ACK报文给客户端)并等待一段时间后,丢弃这个未完成的连接。这段时间的长度我们称为SYN Timeout,一般来说,这个时间是分钟的数量级(大约为30秒~2分钟)。

SYN Flood攻击是在TCP协议的三次握手中实现的。具体原理是:攻击者通过伪造IP地址向服务器发送连接请求,服务器端收到请求后,会使用一些资源为这个连接提供服务,并回复一个肯定答复(SYN+ACK),由于SYN+ACK是返回到一个伪装的地址,没有任何响应,服务器端便继续进行SYN+ACK的重试。如果服务器的TCP/IP栈不够强大,最后的结果往往是堆栈溢出崩溃;如果服务器端的系统足够强大,服务器端也将忙于处理攻击者伪造的TCP连接请求,而无暇理睬客户的正常请求。此时,从正常客户的角度来看,服务器失去响应,这种情况被称作服务器端受到了SYN Flood攻击(SYN洪水攻击)。

5.2.2  Land攻击

LAND攻击方式与SYN Flood类似,不过在LAND攻击包中的源地址和目标地址都是攻击对象的IP,这种攻击会导致被攻击的机器死循环,最终耗尽资源而死机。

具体来讲讲,LAND攻击利用了TCP连接建立的三次握手过程,通过向一个目标计算机发送一个TCP SYN报文(连接建立请求报文)而完成对目标计算机的攻击。与正常的TCP SYN报文不同的是,LAND攻击报文的源IP地址和目的IP地址是相同的,都是目标计算机的IP地址。这样目标计算机接收到这个SYN报文后,就会向该报文的源地址发送一个ACK报文,并建立一个TCP连接控制结构(TCB),而该报文的源地址就是自己,因此,这个ACK报文就发给了自己。这样如果攻击者发送了足够多的SYN报文,则目标计算机的TCB可能会耗尽,最终不能正常服务。

5.2.3  IP欺骗攻击

这种攻击利用RST位来实现。假设现在有一个合法用户(61.61.61.61)已经同服务器建立了正常的连接,攻击者构造攻击的TCP数据,伪装自己的IP为61.61.61.61,并向服务器发送一个带有RST位的TCP数据段。服务器接收到这样的数据后,认为从61.61.61.61发送的连接有错误,就会清空缓冲区中建立好的连接。这时,如果合法用户61.61.61.61再发送合法数据,服务器就已经没有这样的连接了,该用户就必须重新开始建立连接。攻击时,攻击者会伪造大量的IP地址,向目标发送RST数据,使服务器不对合法用户服务,从而实现了对受害服务器的拒绝服务攻击。

六、病毒类攻击

计算机病毒是一种在认为或非认为的情况下产生的,在用户不知情或未批准下,能自我复制或运行的计算机程序,该类攻击往往会影响受感染计算机的正常运作。病毒类型根据中国国家计算机病毒应急处理中心发表的报告统计,占近45%的病毒是木马程序,蠕虫占病毒总数的25%以上,占15%以上的是文档型病毒(例如宏病毒),还有其他类型比较少见的病毒类型。

6.1  特洛伊木马

木马(Trojan)程序是比较流行的病毒文件,与一般的病毒不同,它不会自我繁殖,也并不可以去感染其他文件,它通过将自身伪装吸引用户下载执行,向施种木马者提供打开被种者电脑的门户,用户一旦感染了木马,就会成为“僵尸“,施种者可以任意毁坏、窃取被种者的文件,甚至远程操控被种者的电脑。

一个完整的特洛伊木马套装程序包含两部分:服务器端(被控制端)部分和客户端(控制端)部分。植入被种者电脑的是服务端,而黑客正式利用客户端进入运行了服务端的电脑。运行了木马程序的服务端以后,被种者电脑就会有一个或几个端口被打开,黑客就可以利用这些打开的端口进入电脑系统,安全和个人隐私也就全无障碍了。

特洛伊木马不会自动运行,它是暗含在某些用户感兴趣的文档中,用户下载时附带的。当用户运行文档程序时,特洛伊木马才会运行,信息或文档才会被破坏和遗失。特洛伊木马和后门不一样,后门指隐藏在程序中的秘密功能,通常是程序设计者为了能在日后随意进入系统而设置的。

特洛伊木马可以集成到程序中、隐藏在配置文件中、潜伏在Win.ini中、伪装在普通文件中、内置到注册表中、藏身在驱动程序中、隐形与启动组中、加载在Winstart.bat中、捆绑在启动文件中、设置在超级连接中。

6.2  蠕虫病毒

蠕虫病毒是一种常见的计算机病毒。它是利用网络进行复制和传播,传染途径是通过网络和电子邮件。最初的蠕虫病毒定义是因为在DOS环境下,病毒发作时会在屏幕上出现一条类似虫子的东西,胡乱吞吃屏幕上的字母并将其改形。蠕虫病毒是自包含的程序(或是一套程序),它能传播自身功能的拷贝或自身(蠕虫病毒)的某些部分到其他的计算机系统中(通常是经过网络连接)。

2007年1月流行的“熊猫烧香”以及其变种就是蠕虫病毒。这一病毒利用了微软视窗操作系统的漏洞,计算机感染这一病毒后,会不断自动拨号上网,并利用文件中的地址信息或者网络共享进行传播,最终破坏用户的大部分重要数据。

6.3  宏病毒

宏病毒是一种寄存在文档或模板的宏中的计算机病毒。一旦打开这样的文档,其中的宏就会被执行,于是宏病毒就会被激活,转移到计算机上,并驻留在Normal模板上。从此以后,所有自动保存的文档都会“感染”上这种宏病毒,而且如果其他用户打开了感染病毒的文档,宏病毒又会转移到他的计算机上。

如果您并不希望在文档中包含宏,或者不了解文档的确切来源。例如,文档是作为电子邮件的附件收到的,或是来自网络或不安全的 Internet节点。在这种情况下,为了防止可能发生的病毒传染,打开文档过程中出现宏警告提示时最好选择“取消宏”。

七、溢出类攻击

缓冲区溢出(又称堆栈溢出)攻击是最常用的黑客技术之一,这种攻击之所以泛滥,是由于开放源代码程序的本质决定的。Unix本身以及其上的许多应用程序都是用C语言编写的,而C语言不检查缓冲区的边界。在某些情况下,如果用户输入的数据长度超过应用程序给定的缓冲区,就会覆盖其他数据区,这就称作“缓冲区溢出”。

对缓冲区溢出漏洞攻击,可以导致程序运行失败、系统崩溃以及重新启动等后果。更为严重的是,可以利用缓冲区溢出执行非授权指令,甚至取得系统特权,进而进行各种非法操作。如果程序员使用像strcpy(),strcat()类似的不进行有效位检查的函数,最终可能导致恶意用户编写利用程序来进一步打开安全豁口然后将该代码缀在缓冲区有效载荷末尾,这样当发生缓冲区溢出时,返回指针指向恶意代码,这样系统的控制权就会被夺取。

从“缓冲区溢出攻击”的原理可以看出,要防止此类攻击,我们可以在开放程序时仔细检查溢出情况,不允许数据溢出缓冲区,经常检查操作系统和应用程序提供商的站点,一旦发现补丁程序就马上下载是最好的方法。