### 前言 : dedecms这一年更新了不少补丁,本篇文章选取20170315 补丁来进行学习、研究。 ### 正文: 从官网下载DEDECMS 20170315补丁使用DIFF对比工具进行对比:  看到红色的部分,把`servermsg1`变量中出现的 `{dede:` 或者 `{/dede:` 或者 `}` 替换为`#`号。那么可以大致推测出是因为传递进去的值可以恶意闭合标签来达到某种漏洞。 我们进一步跟进往下看,把我们可控的`servermsg1`赋值给`urls`变量插入到`soft`表里的`softlinks`之中。  接着在Archives类里面的存在LoadTemplet方法会执行一个文章的预编译操作也就是说查看文章时候会解析标签。  SourceString 是需要编译的模板内容,而我们刚刚提交的urls会传入进去编译,我们看看编译标签时候会不会存在缺陷。 在`/include/dedetag.class.php的ParseTemplet`方法里有这么一段代码:  如果最先匹配到 ` /} ` 或完整的标签结束符那么直接闭合掉,在这里是没有判断是否在引号之中。 接下来流程会保存缓存文件,保存缓存文件时候使用了双引号(双引号会执行里面的变量),导致我们只需要填写恶意的tagname即可执行恶意代码。  #### 复现poc: ``` /}{dede:test src=../robots.txt/}{dede:${include$z[1][4][src]/**}**/ }/} (本地地址随便填写) ```  查看该文章触发: ...
### 前言 : dedecms这一年更新了不少补丁,本篇文章选取20170315 补丁来进行学习、研究。 ### 正文: 从官网下载DEDECMS 20170315补丁使用DIFF对比工具进行对比:  看到红色的部分,把`servermsg1`变量中出现的 `{dede:` 或者 `{/dede:` 或者 `}` 替换为`#`号。那么可以大致推测出是因为传递进去的值可以恶意闭合标签来达到某种漏洞。 我们进一步跟进往下看,把我们可控的`servermsg1`赋值给`urls`变量插入到`soft`表里的`softlinks`之中。  接着在Archives类里面的存在LoadTemplet方法会执行一个文章的预编译操作也就是说查看文章时候会解析标签。  SourceString 是需要编译的模板内容,而我们刚刚提交的urls会传入进去编译,我们看看编译标签时候会不会存在缺陷。 在`/include/dedetag.class.php的ParseTemplet`方法里有这么一段代码:  如果最先匹配到 ` /} ` 或完整的标签结束符那么直接闭合掉,在这里是没有判断是否在引号之中。 接下来流程会保存缓存文件,保存缓存文件时候使用了双引号(双引号会执行里面的变量),导致我们只需要填写恶意的tagname即可执行恶意代码。  #### 复现poc: ``` /}{dede:test src=../robots.txt/}{dede:${include$z[1][4][src]/**}**/ }/} (本地地址随便填写) ```  查看该文章触发:  (该漏洞需会员中心,且需开启软件栏目才能利用。)