针对Web的攻击技术
简单的HTTP协议本身并不存在安全性问题,因此协议本身几乎不会成为攻击对象。而应用HTTP协议的服务器和客户端,以及运行在服务器上的Web应用等才是攻击的目标。
HTTP本身不具备必要的安全功能
从整体上看HTTP就是一个通用的单纯协议机制,它并不具备会话(session)安全,加密处理等安全性方面的功能,开发者需要自行设计并开发认证及会话管理来腕足web应用的安全,自行设计就意味着可能会出现各种各样的Bug。
针对Web应用的攻击模式
主动攻击(以服务器为目标的主动攻击)
主动攻击是指攻击者通过直接访问Web应用,把攻击代码传入的攻击模式,主动攻击模式里最具代表性的攻击是SQL注入攻击
和OS命令注入攻击
。
被动攻击(以服务器为目标的被动攻击)
被动攻击是利用圈套策略执行攻击代码的攻击模式。在被动攻击过程中,攻击者不直接对目标web网站发起攻击,而是事先布置好攻击的陷阱然后借助用户来进行攻击,被动攻击模式中最具代表性的是跨站攻击脚本
和跨站点请求伪造
。
因输出值转义不完全引发的安全漏洞
跨站脚本攻击(XSS)
XSS(Cross-Site Scripting,XSS)是指通过存在安全漏洞的Web网站浏览器内运行非法的HTML标签或JavaScript进行的一种攻击。动态创建的HTML部分有可能隐藏着安全漏洞。攻击者编写脚本设下陷阱,用户在自己的浏览器上运行时,一不小心就会收到被动攻击。
跨站脚本攻击有可能造成以下影响:
- 利用虚假输入表单骗取用户个人信息
- 利用脚本窃取用户的Cookie值,被害者在不知情的情况下,帮助攻击者发送恶意请求
- 显示伪造的页面(文章或者图片)
跨站脚本攻击常用的手段有:
- 存储型:在用户输入框内输入恶意的HTML标签,或者恶意的
<script>some script..</script>
,然后用户把恶意的代码提交到了服务端,下次服务端回传给客户端这些恶意的代码的时候,攻击代码就会执行。 - 反射型:该攻击方式一般是把恶意代码存在URL中,然后诱导用户去点击这个地址,然后成功实施攻击,例如窃取用户的cookie等(eg:
http://www.some.com/user="><script src='恶意代码地址'></script>
).
跨站脚本攻击的案例:
- 存储型:页面上有个评论的输入框,正常情况下大部分的用户都是输入了正常的用评论文字,不过如果有攻击者,输入了
<script>alert('XSS')</script>
,然后直接提交到了服务端,存储到数据库中,当用户下次展示的时候,页面上就是弹出XSS
,如果攻击者是其他更恶意的代码,后果不堪设想。 - 反射型:如上已经说明
防御XSS攻击的常用方法
- 所有前端的页面渲染,尽量使用ajax异步进行,从后台获取要显示的数据。
- 前端提交过来的数据,在后台入口处统统对HTML中的关键字进行html编码转义。
SQL注入攻击
SQL注入是指针对Web应用使用的数据库,通过运行非法的SQL而产生的攻击,SQL注入产生的根本原因在未经检查或者未充分检查的用户输入数据或URLc传递的参数,意外变成了代码被执行(被数据库系统编译而产生了开发者预期之外的动作,也就是用户输入的数据,在拼接SQL语句的过程中,超越了数据本身,成为了SQL语句的一部分,然后这样被拼接出来的SQL语句被数据库执行,产生了开发者预期之外的动作)
,该安全隐患可能引发极大地危险,搞不好就是:从删库到跑路
。
SQL注入可能引发一下危险:
- 非法查看或篡改数据库内的数据
- 规避认证
- 执行和数据服务器业务关联的程序等。
典型的SQL攻击的示例
假设用户在输入框内输入的用户名为张三
,那么查询关于张三的内容,并且flag = 1
的数据,SQL语句如下:
SELECT * FROM userTb where username = '张三' and flag = 1;
如果我们想进行sql注入攻击,我们输入的用户名为张三'--
,SQL语句就变成了:
SELECT * FROM userTb where username = '张三'--' and flag = 1;
那么我们可以看到总共有三个(')
,第一个表示username
的值的开始,第二个表示结束,那么--
后面的则相当于被注释掉了,那么这个时候我们的查询语句很明显少了一个条件,这样查询出来的数据,已经偏离了开发人员的预想,而攻击人员已经拿到了更多的数据,达到了攻击的目的。
如何确定SQL注入漏洞 黑客并不知道我们程序代码的逻辑和SQL语法,那么他是如何确定一个网站是否存在SQL注入安全漏洞的呢?一般来说有如下两种途径:
- 错误提示
如果目标Web网站开启了错误提示,攻击者就可以通过反复调整发送的参数、查看页面打印的错误日志,推测出Web网站使用的数据库和表结构等信息。
- 盲注
除非运维人员疏忽,否则大部分的Web运营网站都应该变比了错误提示信息,此时攻击者一般会采取盲注的技巧来进行反复的尝试。
如何防御SQL攻击
通过以上对SQL注入攻击的分析可以发信啊,对于用户输入的内容或者传递的参数,我们应该要时刻保持警惕,这就是安全领域的外部数据不可信任原则
,Web安全领域的各种攻击方式,大都是因为开发人员违反了这个原则,那么我们就可以从变量的检测、过滤、验证下周,确保变量是开发者所预想的。
- 绑定变量,使用预编译语句
实际上,绑定变量使用预编译语句是预防SQL注入的最佳方式,使用预编译的SQL语句语义不会发生改变,在SQL语句中,变量用问号?表示,黑客即使本事再大,也无法改变SQL语句的结构,像上面例子中,username变量传递的张三'--
参数,也只会当作username字符串来解释查询,从根本上杜绝了SQL注入攻击的发生。
- 检查变量的类型和格式
如果你的SQL语句是类似where id = {$id}
这种形式,数据库里所有的id都是数字,那么就应该在SQL被执行前,检查确保变量的id是init类型,如果是邮箱,那么就应该检查并确保变量一定是邮箱格式的,其他的类型比如日期,时间等也是一个道理。总结起来就是:只要是有固定格式的变量,在SQL语句执行之前,就应该严格按照固定格式去检查,确保变量比我们余项的格式,(这部分的校验在前端开发中同样适用),这样很大程度上可以避免SQL注入攻击。
- 过滤特殊符号
对于无法固定格式的变量一定要进行特殊富豪过滤或转义处理,一般会转义(')、("")
等特殊字符。
数据库信息加密 一般会对数据库中的关键数据,例如账号密码等进行MD5,SHA-1等加密酸处理之后,在进行存贮,这样即使攻击者拿到了数据,也无法解密。
HTTP首部注入攻击
HTTP首部注入攻击(HTTP Header Injection)是指攻击者通过在响应首部字段内插入换行,添加任意响应首部或主体的一种攻击,属于被动攻击的一种。
向首部主体内添加内容的攻击称为HTTP响应截断攻击(HTTP Respone Splitting Attack)。
HTTP首部注入攻击有可能会造成一下一些影响:
- 设置任何Cookie信息
- 重定向至人意URL
- 显示任意的主体(HTTP响应截断攻击)
HTTP首部注入攻击的案例
假设我们通过一个URLhttp://example.com/?user=1
来定位到某个页面,那么攻击者可能会把user=1
替换成user=1%0D%0ASet-Cookie:+SID=1234
。
其中,%0D%0A
代表HTTP报文中的换行符,紧接着的是可以将被攻击网站的回话ID设置成SID=1234
的Set-Cookie首部字段。
发送该请求之后,假设结果返回一下响应:
Location: http://example/?user=1(%0D%0A:换行符)
Set-Cookie:SID=1234
攻击者输入的%0D%0A
原本应该属于首部字段Location的查询值部分,但经过解析之后,%0D%0A
变成了换行符,结果插入了新的首部字段Set-Cookie
,攻击者可以伪装成用户,同理,攻击者可在响应中插入任意的首部字段。
HTTP响应截断攻击案例
HTTP响应阶段攻击是用在HTTP首部注入的一种攻击。攻击顺序相同,但是要将两个%0D%0A%0D%0A
并排插入字符串后发送。利用这两个连续的换行就可作出HTTP首部与主体分隔所需的空行了,这样就能显示伪造的主体,达到攻击的目的。例如:
%0D%0A%0D%0A<html><head><title>....想要显示的网页内容 <!--
。
在可能进行HTTP受不住如的环节,通过发送上面的字符串,返回结果得到如下响应:Set-Cookie:UID=(%0D%0A:换行符)(%0D%0A:换行符)<html><head><title>....想要显示的网页内容 <!--(原本正常情况的html内容被注释)
。
OS命令注入攻击
OS命令诸如攻击是指通过Web应用,执行非法的操作系统命令达到攻击的目的。只要在存在Shell函数的地方就有存在被攻击的风险。
可以从Web应用中通过Shell来调用操作系统命令。倘若调用Shell时存在疏漏,就可以执行插入非法的OS命令。
OS命令注入攻击可以向Shell发送命令,使Window或Linux操作系统的命令行启动程序。也就是说,通过OS注入攻击可执行OS上安装着的各种程序。
目录遍历攻击
目录遍历(Directory Traversal)攻击是指对本无意公开的文件目录,通过非法截断其目录路径后,达成访问 目的的一种攻击。这种攻击有时也称为路径遍历(Path Traversal)攻击。 通过 Web 应用对文件处理操作时,在由外部指定文件名的处理存在疏漏的情况下,用户可使用 .../ 等相对路 径定位到 /etc/passed 等绝对路径上,因此服务器上任意的文件或文件目录皆有可能被访问到。这样一来,就 有可能非法浏览、篡改或删除 Web 服务器上的文件。 固然存在输出值转义的问题,但更应该关闭指定对任意文件名的访问权限。
因设置或设计上的缺陷引发的安全漏洞
强制浏览
强制浏览(Forced Browsing)安全漏洞是指,从安置在 Web 服务器的公开目录下的文件中,浏览那些原本 非自愿公开的文件。 强制浏览有可能会造成以下一些影响。 泄露顾客的个人信息等重要情报 泄露原本需要具有访问权限的用户才可查阅的信息内容 泄露未外连到外界的文件 对那些原本不愿公开的文件,为了保证安全会隐蔽其 URL。可一旦知道了那些 URL,也就意味着可浏览 URL 对应的文件。直接显示容易推测的文件名或文件目录索引时,通过某些方法可能会使 URL 产生泄露。
容易被推测的文件名及目录名 http://www.example.com/entry/entry_081202.log
文件名称容易推测(按上面的情况,可推出下一个文件是entry_081203.log
)
因会话管理疏忽引发的安全漏洞
会话管理是用来管理用户状态的必备功能,但是如果在会话管理上有所疏忽,就会导致用户的认证状态被窃取等后果。
会话劫持
会话劫持(Session Hijack)是指攻击者通过某种手段拿到了用户的会话ID,并非法使用此会话ID伪装成用户,达到攻击的目的。
会话劫持攻击的案例 下面我们以认证功能为例讲解会话劫持。这里的认证功能通过会话管理机制,会将成功认证的用户的会 话 ID(SID)保存在用户浏览器的 Cookie 中。 攻击者在得知该 Web 网站存在可跨站攻击(XSS)的安全漏洞后,就设置好用 JavaScript 脚本调用 document.cookie 以窃取 Cookie 信息的陷阱,一旦用户踏入陷阱(访问了该脚本),攻击者就能获取含 有会话 ID 的 Cookie。 攻击者拿到用户的会话 ID 后,往自己的浏览器的 Cookie 中设置该会话 ID,即可伪装成会话 ID 遭窃的 用户,访问 Web 网站了。
会话固定攻击 对以窃取目标会话 ID 为主动攻击手段的会话劫持而言,会话固定攻击(Session Fixation)攻击会强制用户使用攻击者指定的会话 ID,属于被动攻击。
会话固定攻击的案例: 下面我们以认证功能为例讲解会话固定攻击。这个Web网站的认证功能,会在认证前发布一个会话ID,若认证成功,就会在服务器内改变认证状态。
- 攻击者准备陷阱,先访问 Web 网站拿到会话 ID(SID=f5d1278e8109)。此刻,会话ID在服务器上的记录仍是(未认证)状态。
- 攻击者设置好强制用户使用该会话ID的陷阱,并等待用户拿着这个会话I 前去认证。一旦用户触发陷 阱并完成认证,会话 ID(SID=f5d1278e8109)在服务器上的状态(用户A已认证)就会被记录下来。
- 攻击者估计用户差不多已触发陷阱后,再利用之前这个会话ID访问网站。由于该会话ID目前已是(用户A已认证)状态,于是攻击者作为用户A的身份顺利登录网站。
跨站点请求伪造
跨站点请求伪造(Cross-Site Request Forgeries,CSRF)攻击是指攻击者通过设置好的陷阱,强制对已完 成认证的用户进行非预期的个人信息或设定信息等某些状态更新,属于被动攻击。
跨站点请求伪造有可能会造成以下等影响。
- 利用已通过认证的用户权限更新设定信息等
- 利用已通过认证的用户权限购买商品
- 利用已通过认证的用户权限在留言板上发表言本论
跨站点请求伪造的案例: 以留言板为例,留言板一般只允许已认证并且登录的用户在留言板上发表内容。
那么攻击者可以在留言板上发表含有恶意代码的评论:<img src = 'http://example.com/msg?q=你好'>
,那么在其他用户认证并登陆之后,会自动发送请求:GET http://example.com/msg?q=你好 HTTP/1.1
,这个时候攻击者就可以利用其他用户的身份干坏事。
其他安全漏洞
密码破解
密码破解攻击(Password Cracking)即算出密码,突破认证。攻击不仅限于 Web 应用,还包括其他的系统 (如 FTP 或 SSH 等),本节将会讲解对具备认证功能的 Web 应用进行的密码破解。 密码破解一般有:穷举法和字典攻击两种
Dos攻击
DoS 攻击(Denial of Service attack)是一种让运行中的服务呈停止状态的攻击。有时也叫做服务停止攻击或拒绝服务攻击。DoS 攻击的对象不仅限于 Web 网站,还包括网络设备及服务器等。 主要有以下两种 DoS 攻击方式:
- 集中利用访问请求造成资源过载,资源用尽的同时,实际上服务也就呈停止状态。
- 通过攻击安全漏洞使服务停止。
其中,集中利用访问请求的DoS攻击,单纯来讲就是发送大量的合法请求。服务器很难分辨何为正常请求,何为攻击请求,因此很难防止DoS攻击。
多台计算机发起的 DoS 攻击称为 DDoS 攻击(Distributed Denial of Service attack)。DDoS 攻击通常利用那些感染病毒的计算机作为攻击者的攻击跳板。
后门程序(Backdoor)
是指开发设置的隐藏入口,可不按正常步骤使用受限功能。利用后门程序就能够使用 原本受限制的功能。 通常的后门程序分为以下 3 种类型。
- 开发阶段作为 Debug 调用的后门程序
- 开发者为了自身利益植入的后门程序
- 攻击者通过某种方法设置的后门程序
可通过监视进程和通信的状态发现被植入的后门程序。但设定在 Web 应用中的后门程序,由于和正常使用时 区别不大,通常很难发现。