加入收藏 | 设为首页 | 会员中心 | 我要投稿 辽源站长网 (https://www.0437zz.com/)- 云专线、云连接、智能数据、边缘计算、数据安全!
当前位置: 首页 > 运营中心 > 建站资源 > 策划 > 正文

从三类常见高危漏洞 洞见那些“风平浪静”的代码

发布时间:2019-07-23 00:38:41 所属栏目:策划 来源:刘隽良@默安科技
导读:在研发人员眼中,编码开发的目的是实现相关功能逻辑可用,无明显功能 bug。而实际上,在安全人员眼中,很多这样看似没有功能问题的代码,却可以利用来进行安全漏洞攻击。虽然这在很多研发人员眼中是看似天方夜谭,但很不幸,通过以往的无数重大安全事件的
副标题[/!--empirenews.page--]

在研发人员眼中,编码开发的目的是实现相关功能逻辑可用,无明显功能 bug。而实际上,在安全人员眼中,很多这样看似没有功能问题的代码,却可以利用来进行安全漏洞攻击。虽然这在很多研发人员眼中是看似天方夜谭,但很不幸,通过以往的无数重大安全事件的验证,这个事实客观存在。

从三类常见高危漏洞 洞见那些“风平浪静”的代码

本文主要针对三类最有代表性、安全威胁等级最高的安全漏洞进行着重分析,从安全角度介绍看似合理的功能实现代码是如何被 “攻破” 的。

一、SQL注入

所谓 SQL 注入,就是通过把 SQL 命令插入到 Web 表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的 SQL 命令。具体来说,它是利用现有应用程序,将(恶意的)SQL 命令注入到后台数据库引擎执行的能力,它可以通过在 Web 表单中输入(恶意)SQL 语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行 SQL 语句。

由于用户的输入, 也是 SQL 语句的一部分, 所以攻击者可以利用这部分可控制内容, 注入自己定义的语句, 改变SQL语句执行逻辑, 让数据库执行任意自己需要的指令. 通过控制部分SQL语句, 攻击者可以查询数据库中任何自己需要的数据, 利用数据库的读写文件等特性, 可以直接获取数据库服务器的系统权限。

举例来说,以下代码动态地构造并执行了一个 SQL 查询,该查询可以搜索与指定名称相匹配的项。该查询仅会显示条目所有者与被授予权限的当前用户一致的条目。

  1. ... 
  2. String userName = ctx.getAuthenticatedUserName();    
  3. String itemName=request.getParameter("itemName");  String query = "SELECT * FROM items WHERE owner = '"+ userName + "' AND itemname = '"  + itemName + "'";     
  4. ResultSet rs = stmt.execute(query); 
  5. ... 

这一代码所执行的查询遵循如下方式:

  1. SELECT * FROM items 
  2. WHERE owner = 
  3. AND itemname = ; 

但是,由于这个查询是动态构造的,由一个不变的基查询字符串和一个用户输入字符串连接而成,因此只有在 itemName 不包含单引号字符时,才会正确执行这一查询。如果一个用户名为 wiley 的攻击者为 itemName 表单字段输入字符串 “name' OR 'a'='a”,那么构造的查询就会变成:

  1. SELECT * FROM items 
  2. WHERE owner = 'wiley' 
  3. AND itemname = 'name' OR 'a'='a'; 

附加条件 OR 'a'='a' 会使 where 从句永远评估为 true,因此该查询在逻辑上将等同于一个更为简化的查询:

  1. SELECT * FROM items; 

这种查询的简化会使攻击者绕过查询只返回经过验证的用户所拥有的条目的要求;而现在的查询则会直接返回所有储存在 items 表中的条目,不论它们的所有者是谁。

再更为极端一些,如果这个用户名为 wiley 的攻击者在itemName这个表单字段输入字符串 “name'; DELETE FROM items; --”,那么构造成的查询语句将会变为两个:

  1. SELECT * FROM items 
  2. WHERE owner = 'wiley' 
  3. AND itemname = 'name'; 
  4. DELETE FROM items; 
  5. --' 

第二个语句会造成什么结果,不言自明。

针对此类 SQL 注入攻击,较为有效的方式是使用参数化查询。

参数化查询 (Parameterized Query 或 Parameterized Statement) 是指在设计与数据库链接并访问数据时,在需要填入数值或数据的地方,使用参数 (Parameter) 来给值,这个方法目前已被视为最有效可预防SQL注入攻击 (SQL Injection) 的攻击手法的防御方式。

举例来说,我们可以把上面存在SQL注入攻击的例子改成如下代码:

  1. ... 
  2. String userName = ctx.getAuthenticatedUserName(); 
  3. String itemName =request.getParameter("itemName"); 
  4. String query = "SELECT * FROM items WHERE itemname=? AND owner=?"; 
  5. PreparedStatement stmt =conn.prepareStatement(query); 
  6. stmt.setString(1, itemName); 
  7. stmt.setString(2, userName); 
  8. ResultSet results = stmt.execute(); 
  9. ... 

通过这种参数绑定方式,无论攻击者在 itemName、userName 表单字段填入任何内容,这一代码所执行的查询永远遵循如下方式:

  1. SELECT * FROM items 
  2. WHERE owner = 
  3. AND itemname =; 

即通过参数化查询的方式将后台 SQL 查询语句固化,防止攻击者构造恶意参数拼接 SQL 语句导致的 SQL 语句篡改实现的SQL注入攻击问题。

二、跨站脚本 (XSS)

(编辑:辽源站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读