欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

记一次某 CMS 的后台 getshell

来源:本站整理 作者:佚名 时间:2019-06-05 TAG: 我要投稿

前言
出于对审计的热爱,最近审了一下某 cms,审出了个后台 getshell,虽然危害不算太大,但是过程很有意思,在这里分享一下。
 
漏洞发现
代码审计
翻翻找找中找到了,这个函数:
function saxue_writefile( $_fileurl, $_data, $_method = "wb" ) {
    $_fileopen = @fopen( $_fileurl, $_method ); // 尝试打开文件
    if ( !$_fileopen ) {
        return false;
    }
    @flock( $_fileopen, LOCK_EX );
    $_ret = @fwrite( $_fileopen, $_data ); // 写入内容
    @flock( $_fileopen, LOCK_UN );
    @fclose( $_fileopen );
    @chmod( $_fileurl, 511 );
    return $_ret;
}
这是个纯洁的函数,没有任何的过滤,第一个参数是 文件名,第二个参数是 内容,这和 file_put_contents 函数一样。
现在我们有个 “高危函数”,我们可以找找哪里调用了他, 又经过了很多次翻翻找找,在 adminpages.php 下有一段引起了我的注意:
case 'html':
        ...   
    $row = `从 pages 数据表中获取值`;
    saxue_writefile(
        $filepath . '/' . $row['filename'] ,
        $saxueTpl -> fetch( SAXUE_THEME_PATH . '/pages/' . $row['template'] )
    );
        ...
这里省略了大部分代码,留下了两行关键的。
之所以注意起这行代码,是因为我看到这个最后的 $row['filename']。我就基本盲猜他是从数据库中拿出来的,这就说明了,我们有可能可以通过后台某项设置控制它。
然后我们看看第二个参数也是从 row 取出来的,当然,你会看到第二个参数还经过了一个函数: $saxueTpl -> fetch 。
由于他取出来的是 template 而且是 fetch 函数,我再一次盲猜他是获取文件内容的,这里暂时先不跟。
现在我们来看看这两个数值到底能不能控制,在 case html 下面,紧跟着的是 case add,我们来看看这个 case add。
case 'add':
    $row = array();
    if ( isset( $_POST['dosubmit'] ) ) {
            $_POST['item'] = strtolower( trim( $_POST['item'] ) );
            $_POST['title'] = trim( $_POST['title'] );
            $_POST['content'] = trim( $_POST['content'] );
            $_POST['htmldir'] = trim( $_POST['htmldir'] );
            $_POST['htmlurl'] = trim( $_POST['htmlurl'] );
            $_POST['filename'] = trim( $_POST['filename'] );
            if ( isset( $_REQUEST['id'] ) ) {
                $data = $data_handler -> create( false ); // 编辑时调用到此处
            } else {
                $data = $data_handler -> create(); // 根据 $_POST 创建一个数组,方便插入。
            }
            if ( !$data_handler -> insert( $data ) ) { // 插入 $data ,即 $_POST 的数据
                saxue_printfail( LANG_ERROR_DATABASE );
            }
果不其然,我们在这里看到了我们的 filename,在下面 insert 了,其间没有任何过滤。
当然你还会看这里没有 template,但是真的没有吗?我们可以测试看看。
漏洞测试
实践是检验真理的唯一标准。
访问后台的 pages.php:

点击添加单页,然后抓包:

当然,能不能任意改值呢?比如 filename 改成 .php 后缀,template 改成别的路径的文件可以嘛?
我们试试:

数据库:

最后我们要验证 fetch 函数到底是不是获取文件内容的,我们也不需要跟进函数内部,直接测试就好。

[1] [2] [3]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载