Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 329|回复: 0

[jsp学习]Java应用中SQL依赖注入攻击和防范

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-16 00:05:48 | 显示全部楼层 |阅读模式
    说说自己对注入的一些体会吧。

         什么叫SQL依赖注入?顾名思义,就是依赖于SQL语句的一种攻击方式,主要采用特殊字符串来处理的SQL漏洞。
         这个SQL依赖注入已经是很老的漏洞了,现在基本上DAO层的编写已经很少使用纯JDBC来写sql语句了。

         所以在没有使用framework来做DAO,而直接使用JDBC且凭凑的SQL语句的话,那么很容易产生依赖注入的漏洞,如下用户登录模块(目前手头项目中就有活生生的例子)

         突破第一个用户名的障碍

    登录模块
    如:
    User validUser = login.getUserInfo(user.getName());  
      
       
       
         
       

         
       
      
    这里的user.getName()是前台从Textfield控件中获得得值,没有做任何处理,于是再看看getUserInfo的方法,如下:
      public User getUserInfo(String userName)
        {
            User validUser = null;
            String sql = "Select * from WEB_USER where NAME="" + userName + """;
            Database db = null;
            ResultSet rs = null;
            try {
                db = new Database("XXX");
                rs = db.execQuery(sql);   
                if (rs != null && rs.next()) {
                     validUser = new User();
                     ....
                  }
                }
             }
          [/code]    我们看到从前台传过来的userName没有经过任何处理而直接凭凑的SQL语句,所以如果输入者精心构造的话,就可以突破第一个屏障,生成一个有效的用户对象,比如:

    输入: cjcj" or "1"="1

    这样的字符串输入到后台的SQL语句就为:
    select * from web_user where name="cjcj" or "1"="1"
    显然,这个rs肯定是非空的。我们完成了突破第一个屏障的任务。

    细心的人可能注意到,这里我们是用的execQuery,只做一个查询操作,这样并不能达到任意登录的目的,没关系,我们再看。

         突破第二层障碍   
         我们发现:

      if(retry_cnt >= 3)
                {
                    login.lockUser(user);
                    List errors = new ArrayList();
                    ErrorObj error = new ErrorObj();
                    error.setErrorMsg("登录3次失败,该用户已被锁定,请与管理员联系");
                    errors.add(error);
                    this.getSession().setAttribute(CTDRConstants.ERROR_ATTRIBUTES, errors);      
                    this.getRequest().setAttribute("userName", user.getName());            
                   
                }   
          [/code]      当用户3次输入密码错误的时候,就更改用户状态,用户被锁定(目前很多网站是这种机制,所以需要谨慎一点),既然需要更改用户状态,就有可能涉及到为execUpdate操作,只要有execUpdate操作,hacker们就有机会了,我们继续往下看lockUser方法;   public void lockUser(User user)
        {
            String sql = "update WEB_USER set status=1 where NAME="" + user.getName() + """;
            Database db = null;
            try {
                db = new Database("XXX");
                db.execUpdate(sql);
            }
        ...
        }
          [/code]     这里的user对象就是刚从表里select出来的第1个对象,且user.getName()也是直接从前台页面上取的,并没有重新赋值,所以这里可以构造一个拥有语法错误的SQL,让前台报错,从而找到存储用户的表名,比如
    输入cjcj" select "1"="1
    后台会执行:select * from web_user where name="cjcj" select "1"="1"
    然后这条出错的SQL语句信息就有可能暴露在前台了,这样我们就拿到了存储用户信息的表名。

    于是我构建一个重置所有密码的SQL语句,如:
    输入cjcj" or 1=1;update WEB_USER set passwd="
    这样导致WEB_USER所有密码都为空或者MD5的密码。

    最后就可以用cjcj" or "1"="1 这个用户登录了。
    但是这样做的缺点是所有用户的密码都更改了很容易被管理员发现的。应该有更好的办法,待续...

    另外如果执行的SQL语句为:
      String sql = "Select * from WEB_USER where NAME="" + userName + "" and PASSWD=""+Passwd+""";[/code]
    这样就更简单了,直接构造上面的那个输入就可以任意登录了。


    我们看到,这个应用有待改进的地方:
    1、对输入含有"符号进行转换或者禁止;
    2、update用户锁定状态时,应该把user.getName()改为:

    validUser.getName()
          [/code] 3、使用PrepareStatement或者使用dao层框架。



      
      
       
       

         
       

         
       
      
    复制代码
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-6-16 07:17 , Processed in 0.448121 second(s), 34 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表