WordPress <= 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"字样,点一下就可以进入后台了。

想查看一下服务器的信息,就在插件里找了一下,找到安装了但是没启用的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很快就能发布了,到时这个漏洞就可以被补上了。
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指点指点!
找了一下,没找到
spawn_pinger()函数。最后在WordPress 2.0.x系列里找到这个函数。那段代码的作用就是模仿浏览器打开服务器上的wp-admin/execute-pings.php页面,而不是写入信息之类的。
谢谢yskin。
不好意思,之前没说清楚,我现在看的是WordPress 2.0.2版本,因为我觉得如果要研究的话,太高的版本功能繁多,适合使用但不适合研究,所以我就选择比较低一些的版本了。
doors.txt;10;15
doors.txt;10;15
Думаю понравится любому!
Вау! Пиши есче!
grvoe gysik kcrg fgkezvqji seiwtdj fphb zdyvoujlc
VAG tacho 2.2 USB для работы с одометрами, OBD2 Scantool by Ivan Andrewjeski
Hi!,
Good 235rter2rwer23r
http://groups.google.com/group/nheb-horny-disney-1
http://groups.google.com/group/arabwebfree
http://groups.google.com/group/acxsouth
http://groups.google.com/group/acxsouth/web
http://groups.google.com/group/acxsouth/web/actress-indian-sex-shakeela-south
http://groups.google.com/group/tvxvid/web/tvx-online-tv-amateur-sex-movie
http://groups.google.com/group/tvxvid
http://groups.google.com/group/tvxvid/web/tvx-plus-one-one-hour-time-shift-of-tvx
http://groups.google.co.uk/group/netvideoxclip
http://message.diigo.com/message/tvx-new-online-tv-late-night-hardcore-movies-228494