您的位置:首页 > 数据库

SQL注入学习总结

2017-08-17 20:24 288 查看
       要想做一个好的程序设计师,就必须有一颗严谨的心,保证用户的信息安全使我们的重中之重,让用户拥有完美的体验也是程序员的设计准则,时刻为用户着想。毕竟人无完人,没有什么是天衣无缝的,这就会让一些人趁虚而入达到他所需要的目的,我们能做的就是培养一颗发现问题的心,所谓好奇心的一种假象,然后完善他们。好了,废话不多说,感谢师傅的提醒,也让我对一些问题有了新的看法,今天我们来了解一些关于SQL注入的一些知识。

什么是SQL注入?

        SQL注入攻击是黑客对数据库进行攻击的常用手段之一。所谓SQL注入,就是通过把SQL命令插入到Web 表单 提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。 比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到 SQL注入式攻击 .由于程序员的水平及经验参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL
Injection,即SQL注入。

       SQL注入是从正常的WWW端口访问,而且表面看起来跟一般的Web页面访问没什么区别,所以目前市面的防火墙都不会对SQL注入发出警报,如果管理员没查看IIS日志的习惯,可能被入侵很长时间都不会发觉。但是,SQL注入的手法相当灵活,在注入的时候会碰到很多意外的情况,需要构造巧妙的SQL语句,从而成功获取想要的数据。SQL注入测试就是通过利用目标网站的某个页面缺少对用户传递参数控制或者控制的不够好的情况下出现的漏洞,从而达到获取、修改、删除数据,甚至控制数据库服务器、Web服务器的目的的测试方法。

        SQL注入可以分为平台层注入和代码层注入。前者由不安全的数据库配置或数据库平台的漏洞所致;后者主要是由于程序员对输入未进行细致地过滤,从而执行了非法的数据查询。SQL注入的产生原因通常表现在以下几方面:①不当的类型处理;②不安全的 数据 库配置;③不合理的查询集处理;④不当的错误处理;⑤转义字符处理不合适;⑥多个提交处理不当。

 SQL注入攻击的总体思路:
        ·发现SQL注入位置; 

        ·判断后台数据库类型; 

        ·确定XP_CMDSHELL可执行情况 

        ·发现WEB虚拟目录 

        ·上传ASP木马;
        ·得到管理员权限
 
注入方法:
        1.猜表名,列名等
先猜表名 

And (Select count(*) from 表名)<>0 

猜列名 

And (Select count(列名) from 表名)<>0 

或者也可以这样 

and exists (select * from 表名) 

and exists (select 列名 from 表名) 

返回正确的,那么写的表名或列名就是正确 
       2.后台身份验证绕过漏洞 

验证绕过漏洞就是'or'='or'后台绕过漏洞,利用的就是AND和OR的运算规则,从而造成后台脚本逻辑性错误 

例如管理员的账号密码都是admin,那么再比如后台的数据库查询语句是 

user=request("user") 

passwd=request("passwd") 

sql='select admin from adminbate where user='&'''&user&'''&'and passwd='&'''&passwd&''' 

那么我使用'or 'a'='a来做用户名密码的话,那么查询就变成了 

select admin from adminbate where user=''or 'a'='a' and passwd=''or'a'='a' 

根据运算规则,这里一共有4个查询语句,那么查询结果就是 假or真and假or真,先算and 再算or,最终结果为真,这样就可以进到后台了
 
举一个简单的sql注入例子。假如我们有一个users表,里面有两个字段username和password。在我们的java代码中我们初学者都习惯用sql拼接的方式进行用户验证。比如:"select id from users where username = '"+username +"' and password = '"  + password +"'" 这里的username和password都是我们存取从web表单获得的数据。下面我们来看一下一种简单的注入,如果我们在表单中username的输入框中输入' or 1=1--
,password的表单中随便输入一些东西,假如这里输入123.此时我们所要执行的sql语句就变成了select id from users where username = '' or 1=1-- and password = '123',我们来看一下这个sql,因为1=1是true,后面 and password = '123'被注释掉了。所以这里完全跳过了sql验证。这里只是简单的举一个例子。很多sql注入的方式还有很多,我将会在下面的博客中一一讲解。
 
预防措施主要有以下几点:
       1.永远不要信任用户的输入。对用户的输入进行校验,可以通过 正则表达式 ,或限制长度;对单引号和双"-"进行转换等。
       2.永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用 存储过程 进行数据查询存取。
       3.永远不要使用 管理员 权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
       4.不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。
       5.应用的异常信息应该给出尽可能少的提示,最好使用自定义的 错误信息 对原始错误信息进行包装
       6.sql注入的检测方法一般采取辅助 软件 或网站平台来检测,软件一般采用sql注入检测工具jsky,网站平台就有亿思 网站安全 平台检测工具。MDCSOFT
SCAN等。采用 MDCSOFT-IPS 可以有效的防御SQL注入XSS攻击等。
 
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: