注入攻击-SQL注入和代码注入

发表于:2016-4-26 13:29

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:OneAPM    来源:51Testing软件测试网采编

  参数化查询(预处理语句)
  参数化或参数绑定是构建 SQL 查询的推荐方法,而且所有优秀的数据库程序库都默认使用这种方法。以下是使用 PHP 的 PDO 扩展的一个实例。
  if(ctype_digit($_POST['id']) && is_int($_POST['id']))
  {
  $validatedId = $_POST['id'];
  $pdo = new PDO('mysql:store.db');
  $stmt = $pdo->prepare('SELECT * FROM transactions WHERE user_id = :id');
  $stmt->bindParam(':id', $validatedId, PDO::PARAM_INT);
  $stmt->execute();
  } else {
  // reject id value and report error to user
  }
  PDO 语句可用的bindParam() 方法让你可以给预处理语句中出现的占位符绑定参数,并且接受基本的数据类型参数,例如 PDO::PARAM_INT、 PDO::PARAM_BOOL、 PDO::PARAM_LOB 和 PDO::PARAM_STR。这种方法默认使用 PDO::PARAM_STR,因此记得对其他数值做相应调整!
  不同于手动 escape,这种方式下的参数绑定(或者你的数据库使用的方法)会自动正确地 escape 绑定的数据,因此你不需要回忆之前用了哪种 escape 函数。持续使用参数绑定要比记着手动 escape 所有东西要可靠得多。
  强制实施最小特权原则
  制止已经发生的 SQL 注入攻击跟从一开始就防御同样重要。一旦攻击者获得执行 SQL 查询的能力,他们就会以一个数据库用户的身份进行查询。可以通过确保所有数据库用户只得到完成各自任务必需的权限,来执行最小特权原则。
  如果一个数据库用户拥有很大的权限,攻击者就可能删除数据表,操纵其他用户的权限,从而发起其他 SQL 注入攻击。你绝对不能以超级用户、其他权限较高或管理员层级的用户身份访问网络应用程序的数据库,从而杜绝这种情况发生。
  最小特权原则的另外一个变体是区别数据库的读数据和写数据权限。你可以设置一个拥有写数据权限的用户,和另一个只有读数据权限的用户。这种角色区分可以确保在 SQL 注入攻击目标为只读用户时,攻击者无法写数据或操纵表数据。这种生物隔离区划可以延伸到进一步限制访问权限,这样就可以将 SQL 注入攻击的影响最小化。
  很多网络应用程序,尤其是开源应用程序,特别被设计成只有一个数据库用户,而且几乎从来不会有人检查该用户是不是高度特免的。记住以上观点,忍住诱惑,不要在一个管理员用户下运行这样的网络应用程序。
  代码注入攻击(也叫Remote File Inclusion)
  代码注入攻击指的是任何允许攻击者在网络应用程序中注入源代码,从而得到解读和执行的方法。这并不适用于对应用程序客户端的代码注入攻击,例如 Javascript,那属于跨站脚本攻击(XSS)。
  源代码可以通过不可信的输入直接注入,或者网络应用程序在通过本地文件系统或类似 URL 这样的外部来源加载代码时被操纵。包含远程文件导致代码注入攻击的情况通常被称为远程文件包含漏洞,虽然远程文件包含攻击本身的目的就是为了注入代码。
  造成代码注入攻击的初始原因包括输入验证失败,包含可能被当做 PHP 代码、任何语境下的不可信输入,未能保障源代码库的安全,在下载第三方程序库时不够谨慎,服务器配置不当导致非 PHP 文件通过网络服务器被传送到 PHP 解释程序。最后一点尤其要加以注意,因为它意味着不可信用户上传到服务器的所有文件都可能带来极大的风险。
  代码注入攻击范例
  众所周知,PHP 涉及无数代码注入攻击目标,因此任何一位程序员都要高度关注代码注入攻击问题。
  文件包含攻击
  代码注入攻击最明显的目标就是 include()、 include_once()、 require() 和 require_once() 函数。如果不可信输入被允许来决定传输给这些函数的路径参数,它就可能影响被包含的本地文件。应该注意的是,被包含的文件不一定是一个真正的 PHP 文件,任何能够携带文字数据(例如,几乎所有的)的被包含文件都有可能。
  路径参数也可能遭受目录遍历攻击或远程文件包含攻击。在路径中使用 ../ 或 ..(dot-dot-slash) 字符串会让攻击者能够触及 PHP 流程能够访问的所有文件。除非 XXX 被禁用,否则以上函数还能接受 PHP 默认设置中的 URL。
  评估
  PHP 的 eval() 函数接收 PHP 代码字符串并执行。
  正则表示式注入攻击
  PHP 中 PCRE 的 preg_replace() 函数允许“e”(PREG_REPLACE_EVAL)修饰符,这就意味着替换字符串在替换后将被当成 PHP。用于替换字符串的不可信输入可能会注入即将执行的 PHP 代码。
  缺陷文件包含逻辑攻击
  按照定义,网络应用程序会包含满足各种需求所需的各类文件。通过操纵请求路径或请求参数,它可以利用服务器路由的缺陷逻辑、依赖管理、自动加载或其他流程,导致服务器包含非预期的本地文件。
  这些超出网络应用程序设计初衷的操纵可能带来无法预料的影响。比如说,一个应用程序可能无意中暴露了只用于命令行用法的路径。该应用程序可能还暴露了构造函数用来执行任务的其他类(虽然并不推荐这种设计类的方法,不过还是有人这么做)。两种场景都有可能干扰应用程序的后台运行,导致本来不应该被直接访问的资源密集型运行活动遭受数据操纵或拒绝服务攻击(DOS)。
  服务器配置不当
  代码注入攻击的目标
  由于代码注入攻击允许攻击者选择任意 PHP 代码来执行代码注入攻击的目标极其广泛。
22/2<12
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号