参数绑定(预编译语句)

虽然数据库自带的过滤是个不错的实现,但是我们还是处在“用户输入被当成 SQL语句的一部分 ”这么个圈子里,其实要跳出这个圈子还有一个实现,就是参数绑定。基本上所有的主流数据库都提供这种接口。这种方法提前预编译了SQL语句的逻辑,然后对 参数预留了位置(就是“ ?1  ?2” 这种的)。这样语句在执行的时候只是按照输入的参数表来执行。

Perl环境的例子:

  1. $sth = $dbh->prepare("SELECT email, userid FROM members WHERE email = ?;");
  2. $sth->execute($email);

感谢Stefan Wagner帮我写了个java的实现

不安全版

  1. Statement s = connection.createStatement();
  2. ResultSet rs = s.executeQuery("SELECT email FROM member WHERE name = "
  3. + formField); // *boom*

安全版

  1. PreparedStatement ps = connection.prepareStatement(
  2. "SELECT email FROM member WHERE name = ?");
  3. ps.setString(1, formField);
  4. ResultSet rs = ps.executeQuery();

这儿$email是从用户表单中获取来的数据,并且是做为位置参数#1(即第一个问号)传递进来的,因此在任 何情况下,这个变量的内容都可以解析为SQL语句。引号、分号、反斜杠、SQL注释表示法-其中的任何一个都不会产生任何特殊的效果,这个因为它们“只是 数据”。这不会对其他东西造成破坏,因此这个应用很大程度上防止了SQL注入攻击。

如果对这个查询进行多次重用(这个查询只解析一次)的话,还可以提高性能。然而与获得大量的安全方面的好处相比,这个是微不足道的。这还可能是我们保证互联网应用安全所采取的一个重要的措施。

限制数据库权限和隔离用户

在目前这种情况下,我们观察到只有两个交互式动作不在登录用户的上下文环境中:“登录”和“给我发送密码”。web应用应该使用尽可能少权限的数据库连接:仅对members表具有查询权限,对其它表没有任何访问权限的数据库连接。

这样做的结果是:即便是“成功地”进行了SQL注入攻击,也只能取得非常有限的成功。这种情况下,我们不能做最终授权给我们的任何更新(UPDATE)请求,因此为了能够实现更新(UPDATE)请求,我们不得不寻求其他解决方法。

一旦web应用确定了通过登录表单传递认证凭证是有效的话,那么它将把这个会话切换到一个具有更多权限的数据库连接上。

对任何web应用来说,从不使用sa权限几乎是理所当然的事情。

强调一下,虽然俺们在这次演示中选择“忘记密码”这么个功能点,不是因为这个功能点本身不安全,而是普遍存在各站点的几个容易遭受攻击的功能点之一。如果你把关注点放在如何通过“忘记密码”来进行渗透的话,那你就跑偏了。

这篇文章的本意不是全面覆盖SQL注入的精髓,甚至连教学都算不上。其实只是我们花了几个小时做的一单渗透测试的工作纪录。我们也见过其他的文章讲SQL注入的技术背景,但是都只是展示了渗透结束后的成果而没有细节。

对数据库的访问采用存储过程

当一个数据库服务器支持存储过程时,请使用存储过程执行这个应用的访问行为,这样(在存储过程编写正确的情况下)就完全不需要SQL了。

通过把诸如查询、更新、删除等某个动作的规则封装成一个单独的存储过程,你就可以根据这个单独的存储过程和所执行的商务规则额对其进行测试和归档。(例如,“增加新的订单”存储过程在客户超过了信用限制的情况下可能拒绝添加这个订单。)

对简单的查询来说,这么做可能仅仅获得很少的好处,不过当这个操作变的越来越复杂(或者是在多个地方使用这个操作)的情况下,给这样操作一个单独的定义就意味着维护这个操作将更简单而且这个操作的功能会更强壮。

注意:总可以编写动态构建查询语句的存储过程:这么做并不会防止SQL注入-它只不过把准备/执行过程正确地结合在一起,或者只不过把SQL语句与提供保护的变量直接捆绑在一起。

但是那些结果需要大量的背景知识才能看的懂的,而且我觉得渗透的细节也是很有价值的。我们正常情况下是拿不到源码的,所以渗透人员的逆向黑盒渗透的能力也是有价值的。

SQL注入(四)的更多相关文章

  1. SQL注入之Sqli-labs系列第三十八关、第三十九关,第四十关(堆叠注入)

    0x1 堆叠注入讲解 (1)前言 国内有的称为堆查询注入,也有称之为堆叠注入.个人认为称之为堆叠注入更为准确.堆叠注入为攻击者提供了很多的攻击手段,通过添加一个新 的查询或者终止查询,可以达到修改数据 ...

  2. SQL注入之Sqli-labs系列第二十四关(二阶注入)

    开始挑战第二十四关(Second Degree Injections) 0x1 前言 SQL注入一般分为两类:一阶SQL注入(普通SQL注入),二阶SQL注入 .二次注入不是注入两次的意思,请不要混淆 ...

  3. 一、JDBC的概述 二、通过JDBC实现对数据的CRUD操作 三、封装JDBC访问数据的工具类 四、通过JDBC实现登陆和注册 五、防止SQL注入

    一.JDBC的概述###<1>概念 JDBC:java database connection ,java数据库连接技术 是java内部提供的一套操作数据库的接口(面向接口编程),实现对数 ...

  4. 20169205 2016-2017-2 实验四 SQL注入实验

    20169205 2016-2017-2 实验四 SQL注入实验 实验介绍 SQL注入技术是利用web应用程序和数据库服务器之间的接口来篡改网站内容的攻击技术.通过把SQL命令插入到Web表单提交框. ...

  5. ADO.NET基础学习-----四种模型,防止SQL注入

    1.ExcuteNonQuery 执行非查询语句,返回受影响的行数. // 1.ExcuteNonQuery string sqlconn = "Data Source=wss;Initia ...

  6. web安全之SQL注入---第四章 如何进行SQL注入攻击

    第四章 如何进行SQL注入攻击1.数字注入2.字符串注入    '#    '--

  7. SQL注入汇总(手注,盲注,报错注入,宽字节,二次编码,http头部){10.22、23 第二十四 二十五天}

    首先什么是SQL注入: 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令. SQL注入有什么危害? 危害:数据泄露.脱库 ...

  8. MySql(四)SQL注入

    MySql(四)SQL注入 一.SQL注入简介 1.1 SQL注入流程 1.2 SQL注入的产生过程 1.2.1 构造动态字符串 转义字符处理不当 类型处理不当 查询语句组装不当 错误处理不当 多个提 ...

  9. mysql进阶(二十四)防御SQL注入的方法总结

    防御SQL注入的方法总结 这篇文章主要讲解了防御SQL注入的方法,介绍了什么是注入,注入的原因是什么,以及如何防御,需要的朋友可以参考下. SQL注入是一类危害极大的攻击形式.虽然危害很大,但是防御却 ...

随机推荐

  1. asp.net如何实现word文档在线预览

    原文:asp.net如何实现word文档在线预览 实现方式:office文档转html,再在浏览器里面在线浏览 1.首先引入com组件中office库,然后在程序集扩展中引入word的dll 2.将M ...

  2. android:Fragment动画的东西

    最近很多人来Fragment动画是很感兴趣,我将是一个样本给大家看. 既然做,我会做动画以下类型: 注入弹出动画:从""进入.从"上下左右"弹出,当然,你怎么组 ...

  3. solr的配置文件及其含义

    solr与.net系列课程(二)solr的配置文件及其含义    solr与.net系列课程(二)solr的配置文件及其含义  本节内容还是不会涉及到.net与数据库的内容,但是不要着急,这都是学时s ...

  4. JQUERY 插件开发——MENU(导航菜单)

    JQUERY 插件开发——MENU(导航菜单) 故事背景:由于最近太忙了,已经很久没有写jquery插件开发系列了.但是凭着自己对这方面的爱好,我还是抽了一些时间来过一下插件瘾的.今天的主题是导航菜单 ...

  5. EF6.0执行sql存储过程案例

    数据填充实体:ZF_Btns; 存储过程名称:test; --方式一: db.Database.SqlQuery<ZF_Btns>("test @Id,@UName output ...

  6. attr与prop的区别

    我们在获取checked属性值的时候,如果被选中则值为"checked"没选中获取值就是undefined. (引述他人)因为在有些浏览器中比如说只要写disabled,check ...

  7. Web层后端权限模块

    从零开始编写自己的C#框架(19)——Web层后端权限模块   不知不觉本系统写了快三个月了,最近写页面的具体功能时感觉到有点吃力,很多地方如果张嘴来讲的话可以说得很细,很全面,可写成文字的话,就不太 ...

  8. Ninject 在 Winform、 Asp.net MVC中连络EntityFramework的应用

    Ninject 在 Winform. Asp.net MVC中连络EntityFramework的应用( 注入同一个DbContext的应用名人名言:科学是老老实实的东西,它要靠许许多多人民的劳动和智 ...

  9. angularjs + seajs构建Web Form3

    angularjs + seajs构建Web Form前端(三) -- 兼容easyui 回顾 在上一章中使用了angular实现了ajax form和树形结构,经过以上两章对于angular的大致使 ...

  10. lex与yacc快速入门

    lex与yacc快速入门 [原创] 声明:原创文章,转载注明出处http://www.cnblogs.com/lucasysfeng/ 联系作者:lucasysfeng@gmail.com 第一节.l ...