sql盲注的一些小心得

一、关于概念

sql 盲注是对于那些页面没有回显的错误,只能依靠自己的经验去一点一点猜测,这就比较耗费时间了,

具体的一些原理可以参考https://blog.csdn.net/qq_36706878/article/details/79530211

注:以下例子都是关于实验吧,简单的sql注入3,大家可以自行实验

二、开始实验

(1)、首先我们还是一样判断他是字符型还是数字型,我们发现 他还是有显错的,但是这不妨碍我们用盲注的套路解题

     那么当我们知道这是一个字符型的注入的时候,那我们再来看看它既然要用到盲注肯定有一个正确结果和错误结果返回的页面情况,那么我们来试试

    那么在这里我用了两个payload id=1‘ and 1=1 --+(其中--+为注释后面单引号)和id=1’ and 1=2 --+

你同样可以使用其他的payload来尝试,这个结论是当我们输入正确的时候页面返回一个hello,输入错误的时候页面什么都没有,那只要有不同我们就可以通过sql盲注干翻他

(2)认识length()

length函数是可以返回查询结果的长度,那么我们通过盲注就可以来缩小范围,那么我们使用

id=1‘ and (length (database()))>3--+

    咱们先解释一下下这条sql语句,后面的length()返回括号内database()函数的长度,database()函数执行之后会返回数据库名称,那么得到数据库名称的长度是否大于3,如果大于3的话后面判断为真,整个逻辑表达式为真,你如果小于3,则and后面表达式为假,返回页面也就是假,那么通过这样不断的判断得到数据库名称长度为4

在这里我们发现返回结果为正确,那么我们可以继续猜测看看> 4 的结果如何

    我们会发现返回错误,那么此时我们就可以推测,数据库的名称的总长度为4,既然我们知道总长度为4,那么如何知道名称是什么呢?

(3)认识if(),ascii(),substring(),mid()函数

    if()函数我感觉很多人会比较迷糊,但是翻过MySQL手册你会发现,他里面有三个参数if(表达式1,表达式2,表达式3)那么在执行if()函数的时候会首先判断表达式1,如果表达式1为真,则执行表达式2,否则执行表达式3,那大家可以看看这是不是很像我们C语言的三目运算符  表达式1?表达式2 :表达式3。

    那么我们接着来看第二个ascii()函数这个没什么好说的就是把字符转化为ASCII码

    接下来的substring()和mid()函数其实是一个类型函数,叫做字符串截取函数,那么他们有三个参数substring(?,?,?)那么第一个参数是你想要截取的字符串,第二个参数是截取字符串的起始位置,第三个参数是你想要截取字符串的位数,也就是你想截几位

    那么好我们接下来构造一个payload :id=1' and if(ascii(substring((select database()),1,1))=65,0,1)--+那么我们现在来解释一下这个payload,首先构造if(表达式1,0,1), 那么在表达式1中如果为真那就执行0,也就是返回页面错误,为假就执行1,也就是返回页面正确,那么现在问题在这个表达式1中,他到底是一个怎样的逻辑,也就是ascii(substring((select database()),1,1))=65 那么ascii(字符)=65 也就是这个就是表达式1,我们需要判断括号中的字符是不是65 也就是是不是A,如果是页面返回错误,如何不是页面返回正确(也就是返回hello)

    那么接下来的ascii(字符)这个字符又是何方神圣?也就是这一段substring((select database()),1,1)那么在这个函数中我们看看substring函数中的三个参数,第一个(select database())注意这里需要用括号括起来sql语句执行返回的结果,以避免意想不到的错误,那么当然我们执行select database() 就是返回数据库名称这个字符串,后面两个参数就是从第一个字符开始截取,截取一位。

    现在让我们联合起来看看这个payload,意思就是说截取数据库名称中的第一位,然后判断是否是字符A,如果是的话返回错误页面,如果不是的话返回正确页面,也就是hello,现在咱们看看这个截图

    返回页面为hello,那就说明我们的猜测是错误的,这也就是sql盲注的主要思想,猜测,但是如果真要去一个一个猜测那可就真考验耐心了,所以大家注意我上面payload的标红的地方,我们完全可以通过修改ASCII码值来自动化,毕竟字符有127个,而且这还只是第一个字符,那么这时候我们可以用到burpsuite批量完成

    那么现在地看第一张图,注意看画框框的地方,我们将其中两个作为变量,画框的阴影部分第一个变量是字符的第几位,第二个变量是字符的ASCII码值,那么现在看第二个张图,他有我们设置第一个参数为Numbers,从1到4,(那么这也就解释了为什么一开始我们要测试数据库长度,就是在这里用到)step每次加1,第三张图片类似,只不过将ASCII码值从0自增到127,现在让我们看看结果

    这时我们发现1 119,2 101,3  98,4  49 查阅ASCII表得到数据库名称为web1至此我们就算是得到了他的数据库名称,根据上面的步骤我们就可以陆续得到相应的表名,列名,字段名,下面我就不取截图,大家可自行体会

可以参考https://blog.csdn.net/sinat_41380394/article/details/81544700

得到你的答案,祝你好运!!!

 

  • 14
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值