12月5日晚上:sql经典案例分析,思路很牛逼!

某网站的页面显示结果:

and 1=1--+ 显示一包面巾纸

and 1=2--+  显示一袋洗衣粉

1' and ord(mid(version()1,1))&1>0--+

ord(a)取a的ascii码的十进制数  结果就是97

ord()&1  如果1变成32,那就表示取一个字节8位中值为32的那一位,>0就表示有那一位。效果就是可以将每一个字节,一个一个的查出来!可以说是底层的2进制思想了!

同理,将version()改成其他的函数,那么也可以逐个字节的查出来每个字!

太强了,这个思路!可以深入研究好多!

再深入研究一下。这个情景:

正常情况,盲注的时候,如果存在注入点,那么and 1=1 和and 1=2就会一个显示查出来的信息,一个不显示信息(因为没查出来)

但是,这个网站奇葩的是,不管是1=1还是1=2,他返回的是洗衣粉和面巾纸。。。所以,攻击者就不好判断是否存在注入点,因为即使存在了注入点,假如你用version()函数去爆版本信息,但是返回的依旧是洗衣粉,所以并不好判断,也无法得到想要的信息。因此,为了进一步验证是否存在注入点,我们可以这么想,页面只有两种显示,正好符合二进制,原本页面如果不是这种二进制般的显示,应该是显示正常页面或者提示信息页面(实际上,显示与不显示在这里也可以利用这个二进制思想)那么,我们要是想得到想要的信息,只需要将我们想得到的信息不断分解,变成最基本的二进制即可。问题来了,如何将我们想得到的信息变成二进制呢?mysql中的ord()函数配合mid()函数是个不错的选择。将想查的version()逐个字的提取出来,变成ascii码的十进制显示,再利用&1或者&2或者&4,&8,&32等等,来和0做比较。如果那一位上存在,比如ord(mid(version()),1,1)&1>0,就说明版本号的第一个字符用二进制显示的时候,第一位是1是存在的,依次类推,第二位2是否存在,第三位4是否存在,计算出版本信息的第一个字符ascii的值,就可以知道是哪个字符了。原理非常牛!我非常佩服想出这个方法的人。牛!真牛!

推荐阅读更多精彩内容