浅解点击劫持与注入攻击

来源:互联网 发布:华为悦盒怎么设置网络 编辑:程序博客网 时间:2024/06/06 14:05

点击劫持(ClickJacking

1:什么是点击劫持?

点击劫持是一种视觉上的欺骗手段,攻击者使用一个透明的、不可见的iframe,覆盖在一个网页上,然后诱使用户在该网页上进行操作,此时用户在不知情的情况下点击了透明的iframe页面。通过调整iframe页面的位置,可以诱使用户恰好点击在iframe页面的一些功能性按钮上。

2:点击劫持与CSRF攻击有异曲同工之妙,都是在用户不知道情况下进行的攻击。但是:在CSRF中,如果出现用户交互的页面,则攻击可能无法顺利完成。与之相反的是,点击劫持没有这个顾虑,他利用的就是与用户产生交互的页面。

Flash点击劫持

攻击者通过Flash构造出了点击劫持,在完成一系列复杂的动作之后,最终控制了用户的摄像头,原理:黑客在Flash游戏页面内嵌了一个iframe,通过游戏选项按钮诱导用户去点击按钮,从而最终实现Flash点击劫持!每次点击完成之后按钮的位置都是可变化的、移动的。

图片覆盖攻击(XSIO

点击劫持的本质就是一种视觉欺骗,通过这种思想,黑客可以完成很多劫持,例如:钓鱼网站的实现,通过图片覆盖导致链接到一些未知的网站,从而达到黑客正真的目的。原理:通过调整图片的style使得图片能够覆盖在他所指定的任意位置。

XSIO不同于XSS,它利用的是图片的style,或者能够控制CSS。如果应用没有限制stylepositionabsolute的话,图片就可以覆盖到页面上的任意位置,形成点击劫持。

拖拽劫持与数据窃取

目前很多浏览器都开始支持Drag&DropAPI。对于用户来说,拖拽他们的操作更加简单。浏览器拖拽的对象可以是一个连接,也可以是一段文字,还可以从一个窗口拖拽到另外一个窗口,因此拖拽不受同源策略的影响。

“拖拽劫持”的思路是诱使用户从隐藏的不可见iframe中拖拽出攻击者希望得到的数据,然后放到攻击者能够控制的另外一个页面,从而窃取数据。

ClickJacking 3.0:触屏劫持(TapJacking

触屏,从手机OS的角度来看,触屏实际上就是一个事件,手机OS捕捉这些事件,并执行相应的动作。

一次触屏操作,可能会对应一下几个事件的发生:

(1)touchstart,手指触摸屏幕时发生;

(2)Touchend,手指离开屏幕时发生;

(3)Touchmove,手指滑动时发生;

(4)Touchcancel,系统可取消touch事件;

防御点击劫持

针对传统的点击劫持,一般是通过禁止跨域的iframe来防范;

Frame busting

通常可以写一段JavaScript代码,以禁止iframe的嵌套。这种方法叫做frame busting

例如下代码:

If(top.location !=location)  {

Top.location=self.location;

}

 

但是frame busting也存在一些缺陷。由于它是用JavaScript写的,控制能力并不是特别强,因此有许多方法可以绕过它。

X-Frame-Options

因为frame busting存在被绕过的可能,所以我们需要寻找更好的解决方案。一个比较好的解决方案就是使用一个http---X-Frame-Options

它有三个可选的值:DENY   SAMEORIGIN    ALLOW-FROM-origin

当值为deny时,浏览器会拒绝当前页面加载任何frame页面;若值为SAMEORIGIN  ,则frame页面的地址只能为同源域名下面的页面;若值为ALLOW-FROM-origin,则可以定义允许frame加载页面地址。

除以上方式以外:Firefox的“Content Security Policy”以及FirefoxNoScript扩展也能够有效防御ClickJacking.

HTML 5安全

HTML 5新标签

 

 

 

Iframesandbox

HTML 5中,专门为iframe定义了一个新的属性,叫做sandbox;使用sandbox这一个属性后,<iframe >标签加载的内容将被视为一个独立的“源”,其中的脚本将被禁止执行,表单被禁止提交,插件被禁止加载,指向其他浏览器对象的连接也会被禁止。

Canvas的妙用

Canvas可以说是HTML 5中最大的创新之一。不同于<img>标签只是远程加载一个图片, 《canvas》标签让JavaScript可以在页面中直接操作图片对象,也可以直接操作像素,构造出图片区域。Canvas的出现极大地挑战了传统富客户端插件的地位,开发者甚至可以用canvas在浏览器上写一个小游戏。

Canvas提供的强大功能,甚至可以用来破解验证码。

注入攻击

什么是SQL

结构化查询语言(Structured Query Language)简称SQL(发音:/ˈes kjuː ˈel/ "S-Q-L"),是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。

 

注入攻击是web安全领域中一种最为常见的攻击方式,而我们提出的安全设计原则-“数据和代码分离”原则,它可以说是专门为了解决注入攻击而生的。

注入攻击的本质:是把用户输入的数据当做代码执行。这里有2个关键条件,第一是用户能够控制输入;第二个是原本程序要执行的代码,拼接了用户输入的数据。

SQL注入

所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。

原理:SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。

根据相关技术原理,SQL注入可以分为平台层注入和代码层注入。前者由不安全的数据库配置或数据库平台的漏洞所致;后者主要是由于程序员对输入未进行细致地过滤,从而执行了非法的数据查询。基于此,SQL注入的产生原因通常表现在以下几方面:不当的类型处理;不安全的数据库配置;不合理的查询集处理;不当的错误处理;转义字符处理不合适;多个提交处理不当。

寻找SQL注入点

如果要对一个网站进行SQL注入攻击,首先就需要找到存在SQL注入漏洞的地方,也就是寻找所谓的注入点。可能的SQL注入点一般存在于登录页面、查找页面或添加页面等用户可以查找或修改数据的地方。

  最常用的寻找SQL注入点的方法,是在网站中寻找如下形式的页面链接:http://www.xxx.com/xxx.asp?id=YY

  其中“YY”可能是数字,也有可能是字符串,分别被称为整数类型数据或者字符型数据。在本章中我们主要针对整数型数据进行SQL注入讲解。

  通常可以使用以下两种方法进行检测,判断该页面链接是否存在SQL注入漏洞。

.“加引号”法 

  在浏览器地址栏中的页面链接地址后面增加一个单引号,如下所示:

  http://www.xxx.com/xxx.asp?id=YY’

  然后访问该链接地址,浏览器可能会返回类似于下面的错误提示信息:

  Microsoft JET Database Engine 错误’80040e14’

  字符串的语法错误在查询表达式’ID=YY’中。

  /xxx.asp 8

  如图1.3所示,页面中如果返回了类似的错误信息,说明该网站可能存在SQL注入攻击的漏洞。

 

 

可能的SQL注入点一般存在于登录页面、查找页面或添加页面等用户可以查找或修改数据的地方

来自《白帽子讲web安全》一书中的一个例子:

Var shipcity

Shipcity=request.form(“shipcity”);

Var sql=”select*from orderstable where shipcity=’”+shipcity+”’”;

变量shipcity的值由用户提交,在正常情况下,假如用户输入“beijing”那么SQL语句会执行:select*from orderstable where shipcity=beijing

假如用户输入一段有语义的SQL语句,比如:

Beijing‘;drop table  ordertable--

那么SQL语句在实际执行时就会如下:

select*from orderstable where shipcity=Beijing‘;drop table  ordertable--

可以看到原本正常执行的查询语句,现在查询完之后,再执行一个drop表的删除操作,而这个操作是用户构造了恶意数据的结果。

SQL注入的过程中,如果网站的web服务器开启来了错误回显,则会为攻击者提供极大的便利,因为错误回显会涉及到服务器的数据库类型,这样就可以更容易构造SQL语句进行攻击了。

盲注(Bind Injection

很多时候web服务器关闭了错误回显,攻击者应对这种情况,研究出了“盲注的技巧”。

所谓盲注就是在服务器没有错误回显时完成的注入攻击。服务器没有错误回显,对于攻击者来说缺少了非常重要的“调试信息”,所以攻击者必须找到一个方法来验证注入SQL语句是否得到执行。

最常见的盲目验证方法是:构造简单的条件语句,根据返回页面是否发生变化,来半段SQL语句是否得到执行。

例:一个应用的URL如下:http://newspaer.com/items.php?id=2

执行的SQL语句为:SELECT  title,  desription,body  FROM items WHERE  ID =2

如果攻击者构造出如下的条件语句:

http://newspaer.com/items.php?id=2  and  1=2

实际执行的SQL语句就会变成:

SELECT  title,  desription,body  FROM items WHERE  ID =2  and  1=2

因为“and  1=2”永远是一个假命题,所以这条SQL语句的and条件永远无法成立。对于web应用来说,也不会将结果返回给用户,攻击者看到的页面为空或者是一个出错页面。

攻击者继续构造请求如下:

http://newspaer.com/items.php?id=2  and  1=1

当攻击者构造条件“and  1=1”时,如果页面正常返回了,则说明SQL语句的and成功执行,那么就可以判断ID参数存在SQL漏洞了!

在这个攻击过程中,服务器虽然关闭了错误回显,但是攻击者通过简单的条件判断,再对比页面返回结果的差异,就可以判断出SQL注入漏洞是否存在,这就是盲注的工作原理!!!

Timing Attack是盲注的一种高级技巧。在不同的数据库中,都有着类似于BENCHMARK()的函数,可以被Timing Attack利用;  

数据库攻击技巧

找到SQL漏洞仅仅是一个开始,要实施一次完整的攻击,还需要做很多事。

SQL注入是基于数据库的一种攻击。不同的数据库有着不同的功能、不同的语法和函数,因此针对不同的数据库,SQL注入的技巧也有所不同。

(1)SQL注入可以猜解出数据库的对应版本。

(2)进一步要猜解出usernamepassword具体值,可以通过判断字符的范围,一步步读出来。(这个过程非常繁琐,所以非常有必要使用一个自动化工具来帮助完成整个过程。Sqlmap.py就是一个非常好的自动化注入工具

(3)在注入攻击的过程中,常常会用到一些读写文件的技巧。比如在MySQL中,就可以通过load_file()读取系统文件,并通过into dumpfile写入本地文件。当然这也要求当前数据库用户有读写系统相应文件或目录的权限。写入文件的技巧,经常被用于导出一个webshell,为攻击者的进一步攻击做铺垫。因此在设计数据库安全方案时,可以禁止普通数据库用户具备操作文件的权限。

正确的防御SQL注入

对于防御需要做的就是两件事:(1)找到所有的SQL注入漏洞;(2)修补这些漏洞;

1使用预编译语句

一般来说,防御SQL语句注入的最佳方式,就是使用预编译语句,绑定变量。

使用预编译的SQL语句,SQL语句的语义不会发生改变,在SQL语句中,变量用?表示,攻击者无法改变SQL的结构。

使用存储过程

除了使用预编译语句外,我们还可以使用安全的存储过程对抗SQL注入。使用存储过程的效果和使用预编译语句类似,其区别就是存储过程需要先将SQL语句定义在数据库中。但需要注意的是,存储过程中也可能会存在注入问题,因此应该尽量避免在存储过程内使用动态的SQL语句,如果无法避免,则应该使用严格的输入过滤或者是编码函数来处理用户的输入数据。

检查数据类型

检查输入数据的数据类型,在很大程度上可以对抗SQL注入。

使用安全函数

一般来说,各种web语言都实现了一些编码函数,可以帮助对抗SQL注入。

在最后,从数据库自身的角度来说,应该使用最小权限原则,避免web应用直接使用rootdbowner等高权限账户直接连接数据库。如果有多个不同的应用在使用同一个数据库,则也应该为每个应用分配不同的账户。Web应用使用的数据库账户,不应该创建自定义函数、操作本地文件的权限。

其他注入攻击

除了SQL注入外,在web安全领域还有其他的攻击注入,这些注入攻击都有相同的特点,就是违背了“数据与代码分离”原则。

XML注入

XML是一种常用的标记语言,通过标签对数据进行结构化表示。XMLHTML都是标准通用标记语言。

XMLHTML一样,也存在注入攻击,甚至在注入的方法上也非常相似。XML注入,也需要满足注入攻击的两大条件:用户能控制数据的输入;程序并凑了数据。

代码注入

代码注入比较特别一点。代码注入与命令注入往往都是由一些不安全的函数或者方法引起的,其中的典型代表就是eval()

代码注入往往是由于不安全的编程习惯所造成的,危险函数应该尽量避免在开发中使用,可以在开发规范中明确指出哪些函数是禁止使用的。这些函数一般在开发语言的官方文档中可以找到一些建议!

小结:注入攻击是应用违背了“数据与代码分离原则”导致的结果。它有两个条件:一是用户能够控制数据的输入;二是代码拼凑了用户输入的数据,把数据当成代码执行了。

在对抗注入攻击时,只需要牢记“数据与代码分离原则”,在“拼凑”发生的地方进行安全检查,就能避免此类问题。

理论上,通过设计和实施合理的安全解决方案,注入攻击是可以彻底 杜绝

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1 0
原创粉丝点击