WordPress <= 2.0.6 wp-trackback.php SQL injection

WordPress <= 2.0.6 wp-trackback.php sql injection admin hash disclosure exploitWordPress <= 2.0.6 wp-trackback.php sql injection admin hash disclosure exploit, 2007年1月8日暴出的这个WordPress的SQL注入漏洞,攻击者可以通过Trackback来攻击WordPress,执行SQL语句。示例攻击程序可以读取数据库中ID为1用户的密码和用户名。因为WordPress是将用户的密码用MD5加密后存入数据库的,所以读取出来的是MD5过的用户密码。拿到密码后,可以通过伪造Cookies以ID为1的用户身份登陆WordPress。一般ID为1的用户就是系统管理员,而且WordPress安装时将其设为"admin",并且不允许修改,所以攻击成功后就可以拿到管理员身份。

这个程序要求服务器的PHP版本在4.4.3或者5.1.4以下,而且要求register_globals为on。我看了一下我的服务器,PHP版本是4.4.2。而我的Blog已经升到WordPress 2.0.6了,就拿自己的Blog做了一下测试。在服务器上放上程序,打开后,看着那串MD5字符串慢慢地,一个一个地跳出来,而且和数据库里的一字不差,那个寒呀。

又拿blog.edward.in做了下测试。(继上次测试之后,edward的Blog这次又被我拿来测试,为什么当我需要测试时,我总是第一个想起你呢,我亲爱的edward?)下面是程序的输出:

---------------------------------------------------------------------------
Wordpress <= 2.0.6 wp-trackback.php Zend_Hash_Del_Key_Or_Index /
/ sql injection admin hash disclosure exploit
(needs register_globals=on, 4 <= PHP < 4.4.3,< 5.1.4)
by rgod
dork: "is proudly powered by WordPress"
mail: retrog at alice dot it
site: http://retrogod.altervista.org
---------------------------------------------------------------------------

pwd hash   -> 6830a34a0e19cf16be362f030d96****
admin user -> ad

MD5字符串的最后4位已经屏蔽。用户名嘛,因为用户名显示的很慢,差不多要三四分钟才能出一位字符,不过看头两个字符,肯定是"admin"啦。

拿到"pwd hash",也就是MD5过的用户密码,接着关掉Firefox,修改了一下Cookies,把MD5过的用户密码再MD5一遍写进去。然后打开Firefox,登陆edward的Blog,右上角已经显示出"Site Admin"字样,点一下就可以进入后台了。
blog.edward.in的WP后台

想查看一下服务器的信息,就在插件里找了一下,找到安装了但是没启用的Akismet插件。到插件编辑器里修改这个文件,把PHP探针的代码拷进去,点更新文件后,发现插件直接没了。汗,估计是被杀毒软件给K掉了。于是,老老实实地修改了模版文件,加入一句<?php phpinfo() ?>。显示结果是这个服务器运行的是PHP 4.4.1,而register_globals也开着。

查了一下WordPress的源代码,这个漏洞是攻击wp-trackback.php文件,漏洞的产生是因为PHP的Zend_Hash_Del_Key_Or_Index函数有问题。[via]另外查了一下最新的WordPress 2.1 beta 2,这个版本怕是也有这个bug。WordPress官方已经做出更新:Changeset 4717,估计WordPress 2.0.7很快就能发布了,到时这个漏洞就可以被补上了。

本文共有 21 条评论WordPress <= 2.0.6 wp-trackback.php SQL injection


  1. 1 youcan

    yskin, 你好,我现在也在研究 WordPress Pingback\TrackBack 原理。下面的代码我不是很明白,请教一下你:

    wp-includes/functions.php中的spawn_pinger()函数,这个函数的作用正如它的英文一样,是在用户发表文章的时候产生Pingback\TrackBack行为的。它的代码我有一点不明白:

    ---------------
    $ping_url = get_settings('siteurl') .'/wp-admin/execute-pings.php';
    // 引入实际执行Pingback\TrackBack行为的文件execute-pings.php

    $parts = parse_url($ping_url);

    $argyle = @ fsockopen($parts['host'], $_SERVER['SERVER_PORT'], $errno, $errstr, 0.01);
    // 打开自家服务器的端口

    if ( $argyle )
    fputs($argyle, "GET {$parts['path']}?time=".time()." HTTP/1.0\r\nHost: {$_SERVER['HTTP_HOST']}\r\n\r\n");
    // 将excute-pings.php执行的结果写入自家服务器端口

    --------------

    而'excute-pings.php'里面的函数Pingback和TrackBack函数也有一段类似的代码,以TrackBack为例:
    $fs = @fsockopen($trackback_url['host'], $trackback_url['port'], $errno, $errstr, 4);
    @fputs($fs, $http_request);

    那为什么还要将数据向自己的服务器端口写入呢?因为看TrackBack的代码,它直接就可以打开对方URL的服务端口来发送数据的。(Pingback的过程也类似)

    请yskin指点指点!

  2. 2 yskin

    找了一下,没找到spawn_pinger()函数。最后在WordPress 2.0.x系列里找到这个函数。

    那段代码的作用就是模仿浏览器打开服务器上的wp-admin/execute-pings.php页面,而不是写入信息之类的。

  3. 3 youcan

    谢谢yskin。

    不好意思,之前没说清楚,我现在看的是WordPress 2.0.2版本,因为我觉得如果要研究的话,太高的版本功能繁多,适合使用但不适合研究,所以我就选择比较低一些的版本了。

  4. 4 OiMtKVZGYvwr

    doors.txt;10;15

  5. 5 xcSVfcuMc

    doors.txt;10;15

  6. 6 Zirby

    Думаю понравится любому!

  7. 7 ремонт квартир

    Вау! Пиши есче!

  8. 8 pglyxmrc peqywt

    grvoe gysik kcrg fgkezvqji seiwtdj fphb zdyvoujlc

  9. 9 bontril lowest prices
  10. 10 name

    Hi!,

  11. 11 nydia

    Good 235rter2rwer23r

  12. 12 carole
  13. 13 jerrie
  14. 14 ronnie
  15. 15 jerrie
  16. 16 jerrie
  17. 17 meta
  18. 18 dianne
  19. 19 hermelinda
  20. 20 tommy
  21. 21 kristina

请留下您的评论: