加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

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

发布时间:2019-07-22 18:09:12 所属栏目:建站 来源:刘隽良@默安科技
导读:在研发职员眼中,编码开拓的目标是实现相干成果逻辑可用,无明明成果 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)

(编辑:湖南网)

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

热点阅读