精华内容
下载资源
问答
  • SQL 注入攻击

    2020-02-22 14:40:45
    为什么要聊 SQL 注入攻击? 什么是 SQL 注入攻击? 如何进行 SQL 注入攻击? 如何防范? 常见面试题 瞎比比 为什么要聊 SQL 注入攻击? 我这人有个想法,就是不管自己跳不跳槽,每年...

    目录

    • 为什么要聊 SQL 注入攻击?

    • 什么是 SQL 注入攻击?

    • 如何进行 SQL 注入攻击?

    • 如何防范?

    • 常见面试题

    • 瞎比比

    为什么要聊 SQL 注入攻击?

    我这人有个想法,就是不管自己跳不跳槽,每年都会调个时间去面试一下,一来可以摸摸自己的底,知道自己的价值,二来也可以知道市场的环境局势。可以更好地为自己定位,能及时查缺补漏。所以半年前我也执行了这个想法,去参加了面试。我当时就被问到了 SQL 注入攻击,你说不知道 SQL 注入吧,我又听说过,但你叫我说清楚吧,我又说不清楚,于是场面一度很尴尬。也是后面结束面试之后,查资料才搞清楚的。那么今天我们就来聊聊 SQL 注入攻击。

    什么是 SQL 注入攻击?

    首先我们得知道什么是 SQL 注入攻击,官方一点的说法是这样的:

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

    那通俗一点呢?这么来说吧,一般我们提交的表单数据(未经过滤的情况下)都会拼接到 SQL 查询语句中的,就例如:

    SELECT * FROM users WHERE name='zone'
    

    其中 name 参数 zone 就是从表单中传过来的数据,如果传的参数不是 zone,而是一条 SQL 语句,那么就可能骗过了 SQL 数据库,从而执行了一段恶意的代码。达到了我们(程序员)意料之外的结果。

    如何进行 SQL 注入攻击?

    说了那么多,那究竟是怎么进行攻击的呢?我自己能够攻击一下自己,测试一下吗?别急,现在就来试试看。

    普通查询 - 图1

    恶意查询 - 图2

    普通查询中,我们传入的查询数据为 1,恶意查询中,我们传入的数据为:

    图 2 参数:-1 OR 1=1
    

    这各个语句中 id=-1 一般为 False,而 1=1 却恒为 true,所以这个查询语句能查询到所有结果,这是与我们编程的初衷相违背的。

    普通查询 - 图3

    恶意查询 - 图4

    恶意查询 - 图5

    一般我们用户登录都需要用户名和密码,如图 3,需要用户名:zone 和密码:123 方可查询相关信息。但如图 4、图 5,我的用户名参数为如下:

    图 4 参数:zone'#
    图 5 参数(--后面有一空格):zone'-- 
    

    这两个参数,在我输入的密码不正确的情况下,也查询出了结果,是因为 SQL 语句中有两种注释,一种是:# ,另一种是:-- ,这两条查询语句正式利用了这个,导致 SQL 认为后面的语句是注释。从而,不管你输入的密码是否正确,都可以登录。这个也违背了我们编程的初衷。

    当然,SQL 注入攻击不止这些,我这里只是列举了其中的一些操作,这些操作简单,你也可以自行测试。更多的注入方式,可以自行到网络上搜索,也可以看看这篇文章:

    https://www.jianshu.com/p/078df7a35671

    如何防范?

    防范 SQL 注入攻击,我在网络上搜寻了一些方法,仅供参考建议。

    • 把应用服务器的数据库权限降至最低,尽可能地减少 SQL 注入攻击带来的危害

    • 避免网站打印出SQL错误信息,比如类型错误、字段不匹配等,把代码里的SQL语句暴露出来,以防止攻击者利用这些错误信息进行SQL注入。

    • 对进入数据库的特殊字符('"\尖括号&*;等)进行转义处理,或编码转换。

    • 所有的查询语句建议使用数据库提供的参数化查询接口,参数化的语句使用参数而不是将用户输入变量嵌入到SQL语句中,即不要直接拼接SQL语句。

    • 在测试阶段,建议使用专门的 SQL 注入检测工具进行检测。网上有很多这方面的开源工具,例如sqlmap、SQLninja等。

    • 善用数据库操作库,有些库包可能已经做好了相关的防护,我们只需阅读其文档,看是否支持相应的功能即可。

    常见面试题

    • 说说什么是 SQL 注入?

    • 说说 SQL 注入的危害?

    • 举个 SQL 注入的栗子?

    • 如何猜测、确认数据库表名?

    这些问题基本在本文中都能找到答案,我也就不一一再写一般了。

    展开全文
  • SQL注入攻击

    2019-06-25 17:29:25
    SQL注入攻击 如何理解SQL注入攻击 SQL注入是一种将SQL代码添加到输入参数中,传递到服务器解析并执行的一种攻击手法。 SQL注入是输入参数未经过过滤,然后直接拼接到SQL语句当中解析,执行达到预想之外的一种行为。称...

    SQL注入攻击

    如何理解SQL注入攻击

    SQL注入是一种将SQL代码添加到输入参数中,传递到服务器解析并执行的一种攻击手法。
    SQL注入是输入参数未经过过滤,然后直接拼接到SQL语句当中解析,执行达到预想之外的一种行为。称之为SQL注入攻击。

    SQL注入是如何产生的

    1.WEB开发人员无法保证所有的输入都已经过滤。

    2.攻击者利用发送给SQL服务器的输入参数构造可执行的SQL语句(可加入到get请求、post请求、http头信息、cookies中)。

    3.数据库未做相应的安全配置。

    实现注入攻击的具体手段

    1.数字注入

    sql = "select * from reg where id={};".format(userid)
    

    正常情况下输入一个数据库内不存在的userid是查找不到数据的,但是如果userid = “999 or 1=1”,id数字后面的 'or 1=1’混入到了sql语句中,就相当于了

    sql = "select * from reg where id=999 or 1=1;"
    

    1=1永远为True,返回了当前table的所有信息

    2.字符串注入
    原理和上面数字的注入方法是相同的,只不过是利用MySQL的注释。

    sql = "select * from reg where username='user'#' AND PASSWORD='PWD'"
    

    #把sql语句后面的逻辑部分语句给注释掉了,这样就相当于

    sql = "select * from reg where username='user'"
    

    返回的自然是整张表的信息…

    如何防御SQL注入

    这是开发人员应该思考的问题,作为测试人员,了解如何预防SQL注入,可以在发现注入攻击BUG时,对BUG产生原因进行定位。
    1.严格检查输入变量的类型和格式

    • 对于整数参数,加判断条件:不能为空、参数类型必须为数字
    • 对于字符串参数,可以使用正则表达式进行过滤
      2.过滤和转义特殊字符
      在username这个变量前,进行转义,对’、"、\等特殊字符进行转义

    3.利用mysql的预编译机制
    这是最常用也是可以说必须用的解决SQL注入攻击的一种手段。

    sql = "select * from reg where id=%s"
    data = (999,)
    curser.execute(sql,data)
    

    参数化查询是不但解决了SQL注入的问题,效率也比sql语句拼接要高。
    把sql语句的模板(变量采用占位符进行占位)发送给mysql服务器,mysql服务器对sql语句的模板进行编译,编译之后根据语句的优化分析对相应的索引进行优化,在最终绑定参数时把相应的参数传送给mysql服务器,直接进行执行,节省了sql查询时间,以及mysql服务器的资源,达到一次编译、多次执行的目的,除此之外,还可以防止SQL注入。具体是怎样防止SQL注入的呢?实际上当将绑定的参数传到mysql服务器,mysql服务器对参数进行编译,即填充到相应的占位符的过程中,做了转义操作。

    总结

    1.不要随意开启生产环境中Webserver的错误显示。
    2.永远不要相信来自客户端的输入,有固定的格式的变量一定要颜色检查对应的格式,没有固定格式的变量需要对引号等特殊字符进行必要的过滤转义。
    3.使用预编译绑定变量的SQL语句
    4.做好数据库账号权限管理。
    5.严格加密处理用户的机密信息。

    展开全文
  • sql注入攻击

    千次阅读 2017-12-19 12:19:04
    sql注入攻击的几个步骤。

    sql注入主要分为以下几个步骤:

    1、确定该网站是都存在注入点。

    例如:http://***/cases/index.aspx?Id=100000054923742这个url,对于有开发基础的同学来说,进入这个页面,在数据库底层其实是做了一个select操作:select * from table_tmp where id ='100000054923742'(table_tmp和id是假设的表名和字段)。

    然后尝试对地址做以下修改:

    http://***/cases/index.aspx?Id=100000054923742'

    http://***/cases/index.aspx?Id=100000054923742 and 1=1

    http://***/cases/index.aspx?Id=100000054923742 and 1=2

    如果执行①后,页面上提示报错或者提示数据库错误的话,说明是存在注入漏洞的。

    如果执行②后,页面正常显示,而执行③后,页面报错,那么说明这个页面是存在注入漏洞的。

    這里有个关键,就是如何判断是否真的报错,一般而言,现在的web开发如果报错了,不会直接将错误信息显示在页面上,有可能后台程序会做如下处理:如果出现错误跳转至特定页面。

    2、分析数据库类型

    分析数据库类型一般是利用不同数据库有不同内置系统表、函数声明和注释符来分析的。

    2.1、通过函数分析:

    len和length
    在mssql和mysql以及db2内,返回长度值是调用len()函数;在oracle和INFORMIX则是通过length()来返回长度值。


    @@version和version()
    version()>1 返回与@@version>1 相同页面时,则可能是mysql。如果出现提示version()错误时,则可能是mssql。

    substring和substr
    在mssql中可以调用substring。oracle则只可调用substr

    2.2、通过注释符分析

    “/*”是mysql中的注释符,返回错误说明不是mysql,

    “--”是Oracle和MSSQL的注释符,返回错误说明不是这两者。

    3、猜测表名和列名

    在地址后面拼接类似于 and exists(select*from 表名)和 and exists(select 列名 from 表名)这样的查询语句,根据是否报错判断。这样就可以获取数据了。

    以上只是初级的sql注入攻击的方式。技术没有对错,技术的使用方式才有对错,所以才有白帽子和黑帽子之分。

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 13,435
精华内容 5,374
关键字:

sql注入攻击