SQL注入,简单实例,登录攻击

SQL注入,简单实例,登录攻击

  1. 原理

    网上找

  2. 实战

    • 服务端逻辑

      只是为了演示方便,实际中当然不可能这么写的

      #服务端代码
      import pymsql
      
      def login():
          print('ok')
      
      def login_fail():
          print('not ok!')
      
      db = connect(host='local',port=3306,
                   user='root',password='123',
                  db='test')
      cur = db.cursor()
      
      op = "select * from user where id = '{}' and passwd = '{}';"
      
      #由客户端输入
      user = 'root'
      passwd='123456'
      
      op.format(user,passwd)
      #op = "select * from user where id = 'root' and passwd = '123456';"
      
      
      n = cur.execute(op)
      
      if n != 0:
          login()
      else:
          login_fail()
          
      	
      

      mysql数据库结构
      SQL注入,简单实例,登录攻击_第1张图片

      表数据
      SQL注入,简单实例,登录攻击_第2张图片

  3. 重点

    • 输入界面
      SQL注入,简单实例,登录攻击_第3张图片

    • 第一个输入框代表账号,对应服务端数据库中的user表的id字段

      第二个输入框代表密码,对应服务端数据库中的user表的passwd字段

  4. 注入练习

    前置条件

    SQL注入,简单实例,登录攻击_第4张图片

    • 正常情况,账号正确,密码正确
      SQL注入,简单实例,登录攻击_第5张图片

    • 注入攻击1, 使用or(||)

      这时判断条件就变成了 id or true_condition and passwd

      and的优先级比or的优先级高,所以判断实际就是 id or (true_condition and passwd)

      这时id为真或者true_condition and passwd 为真即可

    1. id 为真,passwd为假 SQL注入,简单实例,登录攻击_第6张图片

    2. id为真,passwd为真
      SQL注入,简单实例,登录攻击_第7张图片
      只适用于服务端判断条件是记录为0的情况可以用

    3. id为假,passwd为真

      很难成功。就是因为不知道啊,才需要进行注入攻击,如果知道密码攻击个屁;但是,不过可能会碰巧,猜到某人的密码。
      SQL注入,简单实例,登录攻击_第8张图片
      4.id为假,passwd为假
      SQL注入,简单实例,登录攻击_第9张图片
      总结:or(||也行)一般用于知道账号,但不知道任意账号的密码的情况

    两个or

    select *
    from user
    where id = 1 or 1 and passwd = 1 or 1
    

    同样的原理,and 的优先级比or高

    所以也就是,此时查询将返回数据库的所有记录数目

    select *
    from user
    where (id = 1) or (1 and passwd = 1) or (1)
    

应对方法

  • 输入验证

  • 双哈希

  • 不显示错误消息提示

  • 服务端强逻辑

    只向数据库查询数据,不加逻辑判断

    比如,登录流程改为

    1. 用户输入账号、密码
    2. 服务端只以账号为判断条件,向数据库中查询密码
      • 如果记录大于1或者出现错误,登录失败
      • 如果记录等于1,接着进行下一步
    3. 比较密码是否是一致(为了安全可以,计算哈希值)
      • 密码一致,登录成功
      • 密码不一致,登录失败

你可能感兴趣的:(sql注入)