zoukankan      html  css  js  c++  java
  • SQL注入(SQL Injection)案例和防御方案

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

    SQL注入攻击的主要危害包括:
    非法读取、篡改、添加、删除数据库中的数据;
    数据库信息泄漏:数据库中存放的用户的隐私信息的泄露,攻击者盗取用户的各类敏感信息,获取利益。
    网页篡改:通过修改数据库来修改网页上的内容。
    数据库被恶意操作:数据库服务器被攻击,数据库的系统管理员帐户被窜改,攻击者私自添加或删除账号
    网站被挂马,传播恶意软件:修改数据库一些字段的值,嵌入网马链接,进行挂马攻击;
    服务器被远程控制,被安装后门。经由数据库服务器提供的操作系统支持,让黑客得以修改或控制操作系统。
    破坏硬盘数据,瘫痪全系统。

    SQL注入的产生原因通常表现在以下几方面:
    1. 不当的类型处理;
    2. 不安全的数据库配置;
    3. 不合理的查询集处理;
    4. 不当的错误处理;
    5. 转义字符处理不合适;
    6. 多个提交处理不当。

    SQL注入攻击案例:
    查看文章的注入案例:
    查看某篇文章的url参数为:?id=1
    则通过注入命令:?id=1 or 1=1,则可以列出整个数据表里面的所有文章。
    如果查看用户是通过user_id来访问,如:?uid=1
    则通过注入命令:?id=1 or 1=1, 则可以把整个用户表的记录全部显示出来
    SQL命令如下:
    通过?id=1的SQL命令为:select * from article where id=1,此语句查询到1条结构
    通过?id=1 and 1=1的SQL命令为:select * from article where id=1 or 1=1,此语句查询到整个表的记录

    用户登录的注入案例:
    登录表单有user_name字段,查询语句为:select * from users where nickname='{user_name}'
    则可以在user_name文本框填入:(' or 1='1),这样可以构造出注入的SQL命令:select * from users where user_name='' or 1='1',这样很容易就进入系统了。

    SQL注入猜表:
    在登录页面的用户名字段填入:(' or 1=(select count(0) from t_porg_document) or 1='1),可以构造出注入的SQL命令:select * from users where user_name='' or 1=(select count(0) from recharge) or 1='1'
    这样就可以猜测是否recharge表存在.存在则语句正常执行,否则就报错了。
    猜中表名后,就可以对数据表进行增删改查的操作,如:
    在登录页面的用户名字段填入:('; delete from users),可以构造出危险的SQL命令:select * from users where user_name=''; delete from users;
    通过加分号,可以构造出任意增删改查sql语句,整个数据库就被攻击者随意控制了。

    对SQL注入的防御方法主要有:
    1. 字符串长度验证,仅接受指定长度范围内的变量值。sql注入脚本必然会大大增加输入变量的长度,通过长度限制,比如用户名长度为 8 到 20 个字符之间,超过就判定为无效值。
    2. 对单引号和双"-"、下划线、百分号等sql注释符号进行转义
    3. 对接收的参数进行类型格式化,如id参数值获取后,进行int类型转换
    4. 永远不要使用动态拼装SQL,推荐使用参数化的SQL或者直接使用存储过程进行数据查询存取。sql注入最主要的攻击对象就是动态拼装的SQL,通过参数化查询可以极大减少SQL注入的风险。
    5. 永远不要使用管理员权限的数据库连接(sa、root、admin),为每个应用使用单独的专用的低特权账户进行有限的数据库连接
    6. 不要把机密信息明文存放,请加密或者hash掉密码和敏感的信息。这样对方就算获取到整个表的数据内容,也没什么价值。
    7. 应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装,把异常信息输出到日志而不是在页面中展示。
    8. 做好XSS跨站攻击的防护,防止攻击者伪造管理员信息进入系统后台
    9. 不管客户端是否做过数据校验,在服务端必须要有数据校验(长度、格式、是否必填等等)

    SQL注入检测工具:
    http://blog.jobbole.com/17763/ 10个SQL注入工具
    http://netsecurity.51cto.com/art/201412/458837.htm 国产SQL注入漏洞测试工具——SSQLInjection
    https://www.oschina.net/search?scope=project&q=sql注入 sql注入工具排行榜

    编程语言自带的过滤方法:
    PHP
    普通输入可以用mysql_real_escape_string() / mysqli_real_escape_string()来转义特殊的输入字符;
    like查询语句中,如果用户输入的值有"_"和"%",则会出现这种情况:用户本来只是想查询"abcd_",查询结果中却有"abcd_"、"abcde"、"abcdf"等等;用户要查询"30%"(注:百分之三十)时也会出现问题。
    在PHP脚本中我们可以使用addcslashes()函数来处理以上情况,如下实例:
    $sub = addcslashes(mysqli_real_escape_string($conn, "%something_"), "%_");
    // $sub == \%something\_


    参考文章:

    http://blog.csdn.net/stilling2006/article/details/8526458 (SQL注入原理讲解,很不错!)
    http://netsecurity.51cto.com/art/201009/226227.htm (SQL注入攻击三部曲之入门篇)
    http://www.runoob.com/mysql/mysql-sql-injection.html (MySQL 及 SQL 注入)
    http://www.jb51.net/article/18874.htm (SQL注入中绕过 单引号 限制继续注入)
    http://www.knowsky.com/441536.html (让SQL注入攻击危害最小化三大措施)
    http://www.cnblogs.com/smilewxt/p/4229810.html (SQL注入的原理以及危害)
    http://blog.jobbole.com/105586/ (记一次SQL注入实战)
    https://my.oschina.net/qjedu/blog/1504004 (SQL注入详解)

     演示文件下载:

     sqlinjectiontest(sql注入演示,php单文件绿色版).zip

    版权声明:本文采用署名-非商业性使用-相同方式共享(CC BY-NC-SA 3.0 CN)国际许可协议进行许可,转载请注明作者及出处。
    本文标题:SQL注入(SQL Injection)案例和防御方案
    本文链接:http://www.cnblogs.com/sochishun/p/6994918.html
    本文作者:SoChishun (邮箱:14507247#qq.com | 博客:http://www.cnblogs.com/sochishun/)
    发表日期:2017年6月12日

  • 相关阅读:
    行锁原理 天高地厚
    unity c#
    (转)C#导出Excel源码
    c#.net]做tooltip给控件动态添加属性的做法、IExtenderProvider接口的使用
    自定义提供程序控件
    在C#中使用SQLite
    哈佛大学凌晨4点半的景象
    (转)SQLServer常见查询问题
    .NET组件编程
    窗体着色
  • 原文地址:https://www.cnblogs.com/sochishun/p/6994918.html
Copyright © 2011-2022 走看看