注入攻击类型与方式
1、union注入
①:查询
union操作符一般与order by语句配合使用
注意:union前面不能有order by,如果后面也有order by,前面的也是白写了,
所以要想使用order by+union就得把有order by的语句封装成一个对象,再用select * from(......)as a union......。
只在有union的语句的最后写个order by是ok的,就是两个查询结果放一起之后再排序的意思
union 和union all的区别,前者去重且排序、后者不去重不排序
mysql> select id,email from member where username='kevin' union select username,pw from member where id=1;
②:注入
v' union select username,pw from member where id=1#%
上图没有出现错误,但不代表类似的都不会出现错误,如果出错,他的原因可能是
因为查询的字段不能超过主查询的字段,这个时候可以在SQL语句后面加order by进行排序,通过这个办法可以判断主查询的字段
通过以下方法猜它有几个字段
当查出有两个字段以后,再进行联合查询
a' union select 1,2#%(如果有10个字段,就从1写到10)
这里1,2这些说的是这个字段是可写可带入(带入数据库函数)的字段
a' union select database(),user()#%
,(再将这个带进去查询,结果如下图所示)
2、information_schema注入
①:获取pikachu数据库的表名,u' union select table_schema ,table_name,3 from information_schema.tables where table_schema='pikachu'#
如上图所示:获取到这个数据库中的表名,可以看出user表对我们最有用,那么接下来就要获取表中的字段了
k' union select table_name,column_name ,2 from information_schema.columns where table_name='users'#%
③:获取字段值(如果经验丰富的话就不需要前面的步骤,直接进行爆破)
3、基于函数报错注入
①:技巧思路:
在MYSQL中使用一些指定的函数来制造报错,从而从报错信息中获取设定的信息,常见的select/insert/update/delete注入都可以使用报错方式来获取信息.
②:背景条件:
后台没有屏蔽数据库报错信息,在语法发生错误时会输出在前端.
4、insert注入
insert注入,就是前端注册的信息最终会被后台通过insert这个操作插入数据库,后台在接受前端的注册数据时没有做防SQL注入的处理,导致前端的输入可以直接拼接SQL到后端的insert相关内容中,导致了insert注入。
注册账号,账号新增到数据库中
5、update注入
与insert注入的方法大体相同,区别在于update用于用户登陆端,insert用于用于用户注册端。
一般登录网站前台或后台更新用户信息的地方,填写用户需要修改相关信息,通过Burp抓包在用户名输入相关payload,格式如下:
update注入
' or updatexml(0,concat(0x7e,(database())),0) or'
6、delete注入
一般应用于前后端发贴、留言、用户等相关删除操作,点击删除按钮时可通过Brup Suite抓包,对数据包相关delete参数进行注入,注入方法如下:
delete from message where id=56 or updatexml(2,concat(0x7e,(database())),0)
7、Http Header注入
原理:user-agent头带入到了数据库中,与数据库产生交互
把Http Header直接带入数据库,程序员在写程序的时候,头里面的数据和数据库有交互,没有交互则没有注入点
登录的时候没有注入,放包到get请求这里的时候,可以看见注入点
8、Cookie注入
cookie是网站用来识别用户身份进行跟踪会话的,虽然Cookie是由后端生成的,但每次页面跳转,后端都会对前端的Cookie的信息进行验证,但如果后端获取Cookie后放在数据库中进行拼接,那么这也将是一个SQL注入点,
9、Boolian(布尔型)盲注
盲注,即在SQL注入过程中,SQL语句执行选择后,选择的数据不能回显到前端,我们需要使用一些特殊的方法进行判断或尝试,这个过程称为盲注。
问:盲注有几类,分别是怎么测的??????
SQL盲注分类:
1、基于布尔型SQL盲注
2、基于时间型SQL盲注
3、基于报错型SQL盲注
怎么测
遇到布尔型SQL盲注,可以通过ascii值,
通过对比ascii码的长度,判断出数据库表名的第一个字符。
注:用到substr()函数
用法:substr(string,start,length)
string(必需)规定要返回其中一部分的字符串。start(必需)规定在字符串的何处开始。length(可选)规定被返回字符串的长度。
判断库名的第一个字符
判断长度
10、base on time(时间型)盲注
基于时间的延迟,构造一个拼接语句: vince' and if(substr(database(),1,1)='X' (猜测点)',sleep(10),null#,输入后,如果猜测准确,那么就会响应10秒,如果错误会立刻返回错误。输入:vince' and if(substr(database(),1,1)='p',sleep(10),null)#,再web控制台下,判断出database的表名的一个字符为p。通过这个办法我们就能逐步向下获取数据。
报错型盲注用updatexml再结合if来判断就ok
11、宽字节注入
前提条件:magic_quotes_gqc参数设为ON时
注意:宽字节空格、#如果被URL编码了,可能造成不能成功。并且只有编码为GBK的时候才可以,GBK可以绕过被转义的反斜杠