SQL 注入式攻击示例、原理、防范

一、示例(现在不能测试,网站链接出问题了,但是可以看下怎么回事)

       大家可以先在Google上搜一下“starFire英语 下载中心”(恕我不能公布网址,要不被人家看见就不愉快了),点击进去,在上面的导航连接中找到“starFire软件”,点进去(应该到'/soft/xhsoft/index.html'路径下了)。随便点一个资源,就会进入下载页面。那我们就来看看,它能不能经受住我们“注入式攻击”的考验。在文本里输入——1'or'1'='1——横线中间的东西,然后点击“下载”。怎么样,奇妙的事情出现了吧,直接下载了。
       在这里我先不给“SQL注入式攻击”下定义。我们知道,我们在网页上所输入的东西,最终会被提交到数据库里,当作查询条件。我们假设输入的验证码被提交到DB里面执行的语句是:Select product from t_Product where passcode='code' ("code"是接收值的变量),那么当我们提交这个查询后,变量code就会被替换为我们在文本框里输入的东西,即整个SQL语句变成:Select product from t_Product where passcode='1'or'1'='1'。这样我们再看,原先的一个字符串变成了3个,而且用“或”关系连了起来,这样 where passcode='1'or'1'='1'  一个永远成立的条件也就是说,输入这个关键字后,SQL里面的where子句将会失去作用
       再举个例子:假设公安局户籍中心用的是MySQL数据库,其中查某个公民详细信息的SQL语句是:Select * from t_Citizen where id='$id' and pwd='$pwd'(假设$id和$pwd是分别传递身份证号和查询密码的变量,MySQL中用$表示变量)。那么假如我在前台界面上输入id:1234'#,密码:随意输,只要数据库中存在'1234'这个id的记录,就能查出该人的身份,而无需提供密码。这是为什么呢?我们再把输入的数据代入SQL语句得到:Select * from t_Citizen where id='1234'#' and pwd='$pwd'。在MySQL中,以#开头的内容被视为注释!这就不难理解了吧,where子句就变成了where id='1234', #' and pwd='$pwd'部分就是注释了, 也就是实际有效的查询条件就变成了where id='1234'。

二、原理

        SQL注入是目前比较常见的针对数据库的一种攻击方式。在这种攻击方式中,攻击者会将一些恶意代码插入到字符串中。然后会通过各种手段将该字符串传递到SQLServer数据库的实例中进行分析和执行。只要这个恶意代码符合SQL语句的规则,则在代码编译与执行的时候,就不会被系统所发现。

  注入过程的工作方式是提前终止文本字符串,然后追加一个新的命令。如以直接注入式攻击为例。就是在用户输入变量的时候,先用一个分号结束当前的语句。然后再插入一个恶意SQL语句即可。由于插入的命令可能在执行前追加其他字符串,因此攻击者常常用注释标记来终止注入的字符串。执行时,系统会认为此后语句位注释,故后续的文本将被忽略,不被编译与执行。

三、分类

        当应用程序使用输入内容来构造动态sql语句以访问数据库时,会发生sql注入攻击。如果代码使用存储过程,而这些存储过程作为包含未筛选的用户输入的字符串来传递,也会发生sql注入


        所以大家在数据库编程时一定要注意采取防范措施。不同的语言和不同的数据库防范的方法也不一样,下面是我在网上搜集的防范方法。


四、防范措施

        最小权限原则。特别是不要用dbo或者sa账户,为不同的类型的动作或者组建使用不同的账户,最小权限原则适用于所有与安全有关的场合

        对用户输入进行检查。对一些特殊字符,比如单引号,双引号,分号,逗号,冒号,连接号等进行转换或者过滤;使用强数据类型,比如你需要用户输入一个整数,就要把用户输入的数据转换成整数形式;限制用户输入的长度等等。这些检查要放在server运行,client提交的任何东西都是不可信的

        使用存储过程。如果一定要使用sq语句,那么用标准的方式组建sql语句,比如可以利用parameters对象,避免用字符串直接拼sq命令。

        当sql运行出错时,不要把数据库返回的错误信息全部显示给用户。错误信息经常会透露一些数据库设计的细节

针对常用的sql注入式攻击方式对症下药




参考:http://www.oecp.cn/hi/right_way/blog/2273

            http://blog.csdn.net/eclipseluo/article/details/4782333

            http://blog.csdn.net/xiaoxian8023/article/details/6720125


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值