• 面试-sql注入


    SQL注入简介
    SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编程时的疏忽,通过SQL语句,实现无帐号登录,甚至篡改数据库。sql注入中最常见的就是字符串拼接,研发人员对字符串拼接应该引起重视。


    SQL注入攻击的总体思路
    1.寻找到SQL注入的位置
    2.判断服务器类型和后台数据库类型
    3.针对不通的服务器和数据库特点进行SQL注入攻击

    • SQL注入
      填好正确的用户名和密码后,点击提交,返回测试界面。
      因为根据我们提交的用户名和密码被合成到SQL查询语句当中之后是这样的:
      select * from app01_test where name='用户名' and pwd='密码';
      很明显,用户名和密码都和我们之前给出的一样,肯定能够成功登陆。但是,如果我们输入一个错误的用户名或密码呢?很明显,肯定登入不了吧。恩,正常情况下是如此,但是对于有SQL注入漏洞的网站来说,只要构造个特殊的“字符串”,照样能够成功登录。
      比如:在用户名输入框中输入:’or 1=1#,密码随便输入,这时候的合成后的SQL查询语句为:
      select * from app01_test where name='' or 1=1#' and pwd='';
      语义分析:“#”在mysql中是注释符,这样井号后面的内容将被mysql视为注释内容,这样就不会去执行了,换句话说,以下的两句sql语句等价:
      select * from app01_test where name='' or 1=1#' and pwd='';
      等价于
      select * from app01_test where name='' or 1=1
      因为1=1永远都是成立的,即where子句总是为真,将该sql进一步简化之后,等价如下select语句:
      select * from app01_test
      没错,该sql语句的作用是检索users表中的所有字段
      果不其然,我们利用万能语句(’or 1=1#)能够登录!看到了吧,一个经构造后的sql语句竟有如此可怕的破坏力,相信你看到这后,开始对sql注入有了一个理性的认识了吧~

     

    三、攻击原理


     
    正常登陆name框中填写root,pwd为123
    上面sql_sel = " select * from app01_test where name='{0}' and pwd='{1}' 就相当于select * from app01_test where name=root and pwd=123 进行查询


    如果name框中填写root or 1=1 #,pwd 随便输入
    上面sql_sel = " select * from app01_test where name='{0}' and pwd='{1}'
    就相当于select * from app01_test where name=root or 1=1 # and pwd=123 进行查询
    这里的#相当于把后面的所有查询包括password查询给注释,并且 or 1 = 1的查询永远是正确的,所以sql攻击注入就完成了

    通过这样的方式就绕过了密码检查
    所以设计SQL语句时不建议这样设计,或者对特殊字符 #、or、and 等做特殊处理

    解决方式

    args = (id, name)
    sql = "select id, name from test where id=%s and name=%s"
    cursor.execute(sql, args)
    execute()函数本身有接受sql语句参数位的,可以通过python自身的函数处理sql注入问题。
    正确用法2:
    name = MySQLdb.escape_string(name)
    sql = "select id, name from test where id=%d and name='%s'" %(id, name)
    cursor.execute(sql)
    python模块MySQLdb自带针对mysql的字符转义函数escape_string,可以对字符串转义。
     

    1.永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和

      双"-"进行转换等。

      2.永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。

      3.永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。

      4.不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。

      5.应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装

      6.sql注入的检测方法一般采取辅助软件或网站平台来检测,软件一般采用sql注入检测工具jsky,网站平台就有亿思网站安全平台检测工具。

  • 相关阅读:
    linux文件系统初探--Day6
    Oracle 内置函数
    libusb常用函数说明(转)
    将多个blv格式的视频合并为一个mp4格式视频
    泰迪杯赛后总结
    如何下载B站上版权受限的视频?
    查看Ubuntu版本信息
    Visual Studio存在多个项目时启动项目的问题
    mfc | 初识mfc
    re | [ACTF新生赛2020]Splendid_MineCraft
  • 原文地址:https://www.cnblogs.com/fan-1994716/p/11899452.html
Copyright © 2020-2023  润新知