再谈Mysql中limit后的注入

  • A+
所属分类:WooYun-Zone

0×01 问题来了

   前几天@DM_同学在群里发现一个问题,关于mysql中limit的注入。带有oeder by的limit,目前limit后注入的唯一方法是使用procedure analyse进行报错注入,详细请阅读http://zone.wooyun.org/content/18220,在文中提到此方法适用于5.x系列的mysql,然而DM_测试5.6.11的时候此方法报错(无耻盗@DM_图一张):

再谈Mysql中limit后的注入

  那么问题就来了,翻遍国内外资料,群里各位大佬介不知情况。本着追根溯源的精神,我“不自量力”的翻看了mysql源码,发现了此问题的原因。

0×02问题根源

先说结论:此方法只适用于小于5.6.6的5.x系列。

翻看5.6.6以下版本的analyse()实现

https://github.com/mysql/mysql-server/blob/5.5/sql/sql_analyse.cc

重点在加粗函数

else if (param->next)

  {

    // first parameter

    if (!(*param->item)->fixed && (*param->item)->fix_fields(thd, param->item))

    {

      DBUG_PRINT("info", ("fix_fields() for the first parameter failed"));

      goto err;

    }

······

······  

    // second parameter

    if (!(*param->item)->fixed && (*param->item)->fix_fields(thd, param->item))

    {

      DBUG_PRINT("info", ("fix_fields() for the second parameter failed"));

      goto err;

    }

我们动态调试

输入语句:SELECT id FROM test WHERE id >0 ORDER BY id LIMIT 1,1 procedure analyse(1,extractvalue(rand(),concat(0x3a,version())));

给proc_analyse_init函数下断点

对第一个参数做验证,fixed=1

再谈Mysql中limit后的注入

对第二个参数做验证,fixed=0,表示此参数没有被固定,将被fix_fields函数处理

再谈Mysql中limit后的注入

此次可以看见我们的第二个参数extractvalue(rand(),concat(0x3a,version()))将被fix_fields处理

在mysql中所有函数都是用Item_func类来表示的,当然extractvalue也不例外。

继续跟:

再谈Mysql中limit后的注入

0×03为什么5.6.6以后不行了

在这个版本的时候analyse函数进行了改写,于是乎不行了

再谈Mysql中limit后的注入

怎么改写的?你没有看错,两个参数都只能为uint了。

再谈Mysql中limit后的注入

0×03总结

各种装逼半天,其实我就想说limit后的注入,使用analyse()只能5.0.0<mysql<5.6.6的版本

再谈Mysql中limit后的注入

再谈Mysql中limit后的注入

  1. 1#

    zzzhhh | 2016-03-10 19:22

    大牛又传播新知识了。

  2. 2#

    answer | 2016-03-10 19:27

    果然php第一人

  3. 3#

    玉林嘎 | 2016-03-10 19:27

    limit后面的注入 如果前面没order by 可以union select..

  4. 4#

    _Thorns (舍就是得。) | 2016-03-10 19:33

    赶紧拿个小本本记下来!

  5. 5#

    镱鍚 | 2016-03-10 19:38

    学习

  6. 6#

    DM_ (http://x0day.me) | 2016-03-10 19:40

    学习了。

  7. 7#

    L.N. (http://ln.sycsec.com/) | 2016-03-10 19:54

    @玉林嘎 对,没注意到这个东西,是带有oeder by的limit,唯一方法使用procedure analyse

  8. 8#

    L.N. (http://ln.sycsec.com/) | 2016-03-10 20:09

    这篇文章中提到的几个利用方式也不错
    http://www.2cto.com/Article/201206/134211.html
    1.猜版本
    2.路径泄露
    3.判断列数

  9. 9#

    玉林嘎 | 2016-03-10 20:17

    @L.N. 赞..

  10. 10#

    whirlwind (我名字的意思是“旋风”啊,whirl(旋转)+wind(风),那么多人不认识。。。) | 2016-03-10 22:59

    谢谢分享

  11. 11#

    Kuuki | 2016-03-11 10:02

    赶紧拿个小本本记下来!

  12. 12#

    redrain有节操 (快来和我滚床单) | 2016-03-11 14:00

    果然php第一人

  13. 13#

    牛肉包子 (这个包子,牛肉馅。) | 2016-03-11 14:34

    果然php第一人

  14. 14#

    动后河 (☭) | 2016-03-11 15:13

    赶紧拿个小本本记下来

  15. 15#

    小葵 (burpsuite+metasploit就是我爹。) | 2016-03-11 16:37

    还好,没接触到5.6以上的

  16. 16#

    寂寞的瘦子 (傻逼了。。) | 2016-03-11 17:11

    v果然php第一人

  17. 17#

    长街 (你是千堆雪我是长街,怕日出一到彼此瓦解) | 2016-03-13 12:00

    果然php第一人

  18. 18#

    _Evil (科普是一种公益行为) | 2016-03-13 12:27

    果然php第一人

  19. 19#

    depycode (静) | 2016-03-21 13:52

    感谢啊 刚才刚遇到一个 limit 后注入 也是这个报错,还纠结了半天 看来是版本问题哦 .

  20. 20#
    感谢(1)

    range | 2016-03-23 00:25

    同limit后,比较奇葩,应该还可以这样吧:
    http://www.ys-bs.com/204/wap.php/index/artlist/num/1;select sleep(5)
    再谈Mysql中limit后的注入

  21. 21#

    Blcat | 2016-03-23 11:01

    已经记到小本本,赞

  22. 22#

    Azui | 2016-04-28 19:59

    @range 多行语句执行 注入点我是没遇到过 貌似要pdo连接的才能