【零基础】七步学通学懂 SQL 联合注入

admin 2024年1月23日21:08:50评论27 views字数 2156阅读7分11秒阅读模式

前言

本文是 Pikachu 靶场系列中的一小部分,联合查询是 SQL 注入学习中最基础也是最关键的一部分,很多学习者在学到此章节时会有较大的畏难情绪(涉及的基础知识比较多和杂),单独发这一小结也是为了给 Pikachu 靶场系列做一个预告

第一步

判断是否存在注入,若存在,则判断是字符型还是数字型 数字型:select * from table where id =$id字符型:select * from table where id=’$id’

判断类型一般可以使用 and 型结合永真式和永假式,判断数字型:

1 and 1=1 #永真式   select * from table where id=1 and 1=1
1 and 1=2 #永假式   select * from table where id=1 and 1=2
#若永假式运行错误,则说明此SQL注入为数字型注入

判断字符型:

1' and '1'='1
1' and '1'='2
#若永假式运行错误,则说明此SQL注入为字符型注入

第二步

使用order by查询字段个数,上一步我们已经判断出了是字符型还是数字型,也就是说我们已经构建出了一个基本的框架(在学习 SQL 注入时 “框架” 的思想十分重要)

这里我们用sqli-labs第一关来详细解释一下框架思想,首先使用单引号进行测试,出现 SQL 语句报错,则此关为字符型注入【零基础】七步学通学懂 SQL 联合注入

之后引出了 SQL 注入的另外一个重要知识点,也就是注释的使用(可以确认有没有其他闭合字符),MySQL 提供了以下三种注释方法:

  • #:不建议直接使用,建议使用其 URL 编码形式%23
  • --+:本质上是--空格+会被浏览器解释为空格,也可以使用 URL 编码形式``--%20
  • /**/:多行注释,常被用作空格

这里我们使用%23将 SQL 语句后面的单引号注释掉,也就形成了我们的框架,后面的所有内容都是在框架里进行的,只会对框架做微调【零基础】七步学通学懂 SQL 联合注入

之后我们在框架中使用order by 数字来查询字段的个数,这里的关键是找到临界值,例如order by 4时候还在报错,但是order by 3时没有出现报错,3 就是这里的临界值,说明这里存在 3 个字段【零基础】七步学通学懂 SQL 联合注入

第三步

使用union select查找显示位,上一步我们已经知道了字段的具体个数,现在我们要判断这些字段的哪几个会在前端显示出来,这些显示出来的字段叫做显示位,我们使用union select 1,2,3.....(字段个数是多少就写道几)来对位置的顺序进行判断(其中数字代表是几号显示位)

这里我们需要对框架做一下微调,也就是将 1 改为 -1,这里修改的目的是查询一个不存在的 id,使得第一句为空,显示第二句的结果,这里我们可以发现 1 号字段是在前端不显示的,2 号和 3 号字段在前端显示,所以是显示位【零基础】七步学通学懂 SQL 联合注入

第四步

使用database()函数爆出库名,database()函数主要是返回当前(默认)数据库的名称,这里我们把它用在哪个显示位上都可以【零基础】七步学通学懂 SQL 联合注入

第五步

基于库名使用table_name爆出表名,先来介绍一下使用到的函数和数据源:

  • group_concat()函数:使数据在一列中输出
  • information_schema.tables数据源:存储了数据表的元数据信息,我们主要使用此项数据源中的table_nametable_schema字段

最终可以构造出 Payload 如下,可以获取到 emails,referers,uagents,users 四个表

http://127.0.0.22/Less-1/?id=-1'union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() %23
【零基础】七步学通学懂 SQL 联合注入

第六步

基于表名使用column_name爆出字段名,此时数据源为information_schema.columns,位置在table_name='表名'(记得给表名加单引号)

最终构造 Payload 如下,可以获取到 id,email_id 两个字段

http://127.0.0.22/Less-1/?id=-1'union select 1,2,group_concat(column_name) from information_schema.columns where table_name='emails' %23
【零基础】七步学通学懂 SQL 联合注入

第七步

使用字段名爆敏感信息,直接 from 库名即可,这里需要使用group_concat(concat_ws())实现数据的完整读取,group_concat()函数在前面几步就接触过,主要是使数据在一列中输出

这就带来了一个问题,如果直接把字段放入group_concat()函数,字段间的界限就不清晰了,concat_ws()就是为了区分字段界限所使用的,其语法如下:

concat_ws('字符',字段1,字段2,.....)

最终我们便可以构造出获取数据的 Payload:

http://127.0.0.22/Less-1/?id=-1'union select 1,2,group_concat(concat_ws('-',id,email_id)) from emails %23
【零基础】七步学通学懂 SQL 联合注入

原文始发于微信公众号(天禧信安):【零基础】七步学通学懂 SQL 联合注入

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年1月23日21:08:50
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【零基础】七步学通学懂 SQL 联合注入http://cn-sec.com/archives/2423419.html

发表评论

匿名网友 填写信息