sql注入

作者: songqiangzhang | 来源:发表于2017-07-12 10:39 被阅读0次

        作为程序员,网络安全是一个重要不容忽视的问题,由于SQL注入利用的是正常的HTTP服务端口,表面上看来和正常的web访问没有区别,隐蔽性极强,不易被发现,所以我想记录一些常用的攻击技术和防范策略。

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


    SQL注入过程

     sql 注入大致分为5步:

         第一步:判断Web环境是否可以SQL注入。如果URL仅是对网页的访问,不存在SQL注入问题,如:http://www.baidu.com/162414739931.shtml就是普通的网页访问。只有对数据库进行动态查询的业务才可能存在SQL注入,如:http://www.baidu.com/webhp?id=39,其中?id=39表示数据库查询变量,这种语句会在数据库中执行,因此可能会给数据库带来威胁。

          第二步:寻找SQL注入点。完成上一步的片断后,就要寻找可利用的注入漏洞,通过输入一些特殊语句,可以根据浏览器返回信息,判断数据库类型,从而构建数据库查询语句找到注入点。

          第三步:猜解用户名和密码。数据库中存放的表名、字段名都是有规律可言的。通过构建特殊数据库语句在数据库中依次查找表名、字段名、用户名和密码的长度,以及内容。这个猜测过程可以通过网上大量注入工具快速实现,并借助破解网站轻易破译用户密码。

         第四步:寻找WEB管理后台入口。通常WEB后台管理的界面不面向普通用户开放,要寻找到后台的登陆路径,可以利用扫描工具快速搜索到可能的登陆地址,依次进行尝试,就可以试出管理台的入口地址。

          第五步:入侵和破坏。成功登陆后台管理后,接下来就可以任意进行破坏行为,如篡改网页、上传木马、修改、泄漏用户信息等,并进一步入侵数据库服务器。


    应对方法:

    1.(简单又有效的方法)PreparedStatement

    采用预编译语句集,它内置了处理SQL注入的能力,只要使用它的setXXX方法传值即可。

    使用好处:

    (1).代码的可读性和可维护性.

    (2).PreparedStatement尽最大可能提高性能.

    (3).最重要的一点是极大地提高了安全性.

    原理:

    sql注入只对sql语句的准备(编译)过程有破坏作用

    而PreparedStatement已经准备好了,执行阶段只是把输入串作为数据处理,

    而不再对sql语句进行解析,准备,因此也就避免了sql注入问题.

    2.使用正则表达式过滤传入的参数

    要引入的包:

    import java.util.regex.*;

    正则表达式:

    private String CHECKSQL = “^(.+)\\sand\\s(.+)|(.+)\\sor(.+)\\s$”;

    判断是否匹配:

    Pattern.matches(CHECKSQL,targerStr);

    下面是具体的正则表达式:

    检测SQL meta-characters的正则表达式 :

    /(\%27)|(\’)|(\-\-)|(\%23)|(#)/ix

    修正检测SQL meta-characters的正则表达式 :/((\%3D)|(=))[^\n]*((\%27)|(\’)|(\-\-)|(\%3B)|(:))/i

    典型的SQL 注入攻击的正则表达式 :/\w*((\%27)|(\’))((\%6F)|o|(\%4F))((\%72)|r|(\%52))/ix

    检测SQL注入,UNION查询关键字的正则表达式 :/((\%27)|(\’))union/ix(\%27)|(\’)

    检测MS SQL Server SQL注入攻击的正则表达式:

    /exec(\s|\+)+(s|x)p\w+/ix

    等等…..

    3.字符串过滤

    比较通用的一个方法:

    (||之间的参数可以根据自己程序的需要添加)

    public static boolean sql_inj(String str){

    String inj_str = "'|and|exec|insert|select|delete|update|

    count|*|%|chr|mid|master|truncate|char|declare|;|or|-|+|,";

    String inj_stra[] = split(inj_str,"|");

    for (int i=0 ; i < inj_stra.length ; i++ ){

    if (str.indexOf(inj_stra[i])>=0){

    return true;

    }

    }

    return false;

    }

    4.jsp中调用该函数检查是否包函非法字符

    防止SQL从URL注入:

    sql_inj.java代码:

    package sql_inj;

    import java.net.*;

    import java.io.*;

    import java.sql.*;

    import java.text.*;

    import java.lang.String;

    public class sql_inj{

    public static boolean sql_inj(String str){

    String inj_str = "'|and|exec|insert|select|delete|update|

    count|*|%|chr|mid|master|truncate|char|declare|;|or|-|+|,";

    //这里的东西还可以自己添加

    String[] inj_stra=inj_str.split("\\|");

    for (int i=0 ; i < inj_stra.length ; i++ ){

    if (str.indexOf(inj_stra[i])>=0){

    return true;

    }

    }

    return false;

    }

    }

    5.JSP页面判断代码:

    使用javascript在客户端进行不安全字符屏蔽

    功能介绍:检查是否含有”‘”,”\\”,”/”

    参数说明:要检查的字符串

    返回值:0:是1:不是

    函数名是

    function check(a){

    return 1;

    fibdn = new Array (”‘” ,”\\”,”/”);

    i=fibdn.length;

    j=a.length;

    for (ii=0; ii<i; ii++)

    { for (jj=0; jj<j; jj++)

    { temp1=a.charAt(jj);

    temp2=fibdn[ii];

    if (tem’; p1==temp2)

    { return 0; }

    }

    }

    return 1;

    }


    总结:

      通过对SQL的攻击进行了解,使我们对SQL 注入机理有了一个深入的认识,作为一名Web应用开发人员,一定不要盲目相信用户的输入,而要对用户输入的数据进行严格的校验处理,并且注意编码规范,凡涉及到执行的SQL中有变量时,切记不要用拼接字符串的方法。

    相关文章

      网友评论

          本文标题:sql注入

          本文链接:https://www.haomeiwen.com/subject/fnavhxtx.html